use crate::graph::Id;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::fmt;
#[derive(Clone, PartialEq, Serialize, Deserialize)]
pub struct Node {
pub id: Id,
pub properties: HashMap<String, Value>,
}
impl fmt::Debug for Node {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let keys: Vec<&String> = self.properties.keys().collect();
f.debug_struct("Node")
.field("id", &self.id)
.field("properties", &format!("[keys: {keys:?}]"))
.finish()
}
}
impl Node {
pub fn new(id: Id, properties: HashMap<String, Value>) -> Self {
Node { id, properties }
}
pub fn get_property(&self, key: &str) -> Option<&Value> {
self.properties.get(key)
}
pub fn set_property(&mut self, key: String, value: Value) {
self.properties.insert(key, value);
}
pub fn remove_property(&mut self, key: &str) -> Option<Value> {
self.properties.remove(key)
}
pub fn has_property(&self, key: &str) -> bool {
self.properties.contains_key(key)
}
pub fn property_keys(&self) -> Vec<&String> {
self.properties.keys().collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_node_creation() {
let properties = [
("name".to_string(), json!("Alice")),
("age".to_string(), json!(30)),
]
.into();
let node = Node::new(1, properties);
assert_eq!(node.id, 1);
assert_eq!(node.get_property("name"), Some(&json!("Alice")));
assert_eq!(node.get_property("age"), Some(&json!(30)));
}
#[test]
fn test_property_operations() {
let mut node = Node::new(1, HashMap::new());
node.set_property("name".to_string(), json!("Bob"));
assert_eq!(node.get_property("name"), Some(&json!("Bob")));
assert!(node.has_property("name"));
let removed = node.remove_property("name");
assert_eq!(removed, Some(json!("Bob")));
assert!(!node.has_property("name"));
}
}