Skip to content

Commit

Permalink
feat: HugrMut::remove_metadata (#1619)
Browse files Browse the repository at this point in the history
We had `set_metadata` and `get_metadata_mut`, but no way to remove the
entry entirely.
  • Loading branch information
aborgna-q authored and ss2165 committed Nov 22, 2024
1 parent 14c99c9 commit ab8ce80
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions hugr-core/src/hugr/hugrmut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,19 @@ pub trait HugrMut: HugrMutInternals {
*entry = metadata.into();
}

/// Remove a metadata entry associated with a node.
///
/// # Panics
///
/// If the node is not in the graph.
fn remove_metadata(&mut self, node: Node, key: impl AsRef<str>) {
panic_invalid_node(self, node);
let node_meta = self.hugr_mut().metadata.get_mut(node.pg_index());
if let Some(node_meta) = node_meta {
node_meta.remove(key.as_ref());
}
}

/// Retrieve the complete metadata map for a node.
fn take_node_metadata(&mut self, node: Node) -> Option<NodeMetadataMap> {
if !self.valid_node(node) {
Expand Down Expand Up @@ -551,4 +564,23 @@ mod test {

Ok(())
}

#[test]
fn metadata() {
let mut hugr = Hugr::default();

// Create the root module definition
let root: Node = hugr.root();

assert_eq!(hugr.get_metadata(root, "meta"), None);

*hugr.get_metadata_mut(root, "meta") = "test".into();
assert_eq!(hugr.get_metadata(root, "meta"), Some(&"test".into()));

hugr.set_metadata(root, "meta", "new");
assert_eq!(hugr.get_metadata(root, "meta"), Some(&"new".into()));

hugr.remove_metadata(root, "meta");
assert_eq!(hugr.get_metadata(root, "meta"), None);
}
}

0 comments on commit ab8ce80

Please sign in to comment.