///|
pub(all) enum NodeDiffType {
  NodeAdded
  NodeRemoved
  NodeModified
} derive(Debug, Eq)

///|
pub fn NodeDiffType::to_string(self : NodeDiffType) -> String {
  match self {
    NodeAdded => "Added"
    NodeRemoved => "Removed"
    NodeModified => "Modified"
  }
}

///|
pub impl Show for NodeDiffType with fn output(self, logger) {
  logger.write_string(self.to_string())
}

///|
pub(all) struct NodePropertyDiff {
  field_name : String
  old_value : String
  new_value : String
  is_breaking : Bool
} derive(Debug, Eq)

///|
pub(all) struct NodeDiffEntry {
  node_id : String
  diff_type : NodeDiffType
  property_changes : Array[NodePropertyDiff]
} derive(Debug, Eq)