capability_skeleton/
skeleton.rs

1// ---------------- [ File: capability-skeleton/src/skeleton.rs ]
2crate::ix!();
3
4/// The entire skeleton, storing a list of nodes plus an optional root_id.
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Builder, Default, Setters, MutGetters, Getters)]
6#[builder(pattern="owned", setter(into))]
7#[getset(get="pub", get_mut="pub", set="pub")]
8pub struct Skeleton {
9
10    /// This field holds *verbatim* the lower-kebab-case target-name belonging to the tree grow process.
11    #[builder(default = "\"target\".to_string()")]
12    target_name: String,
13
14    /// The nodes in this skeleton
15    #[builder(default)]
16    nodes: Vec<SkeletonNode>,
17
18    /// The root node’s ID, if any
19    #[builder(default)]
20    root_id: Option<u16>,
21}
22
23impl Skeleton {
24    #[instrument(level="trace", skip(path))]
25    pub fn from_toml_file<P: AsRef<std::path::Path>>(path: P) -> Result<Self, SkeletonError> {
26        tracing::trace!("Reading Skeleton from TOML file: {:?}", path.as_ref());
27        let text = std::fs::read_to_string(path)?;
28        let skeleton = toml::from_str::<Self>(&text)
29            .map_err(SkeletonError::TomlError)?;
30        Ok(skeleton)
31    }
32
33    #[instrument(level="trace", skip(self, path))]
34    pub fn to_toml_file<P: AsRef<std::path::Path>>(&self, path: P) -> Result<(), SkeletonError> {
35        tracing::trace!("Writing Skeleton to TOML file: {:?}", path.as_ref());
36        let serialized = toml::to_string_pretty(self)
37            .map_err(SkeletonError::TomlWriteError)?;
38        std::fs::write(path, serialized)?;
39        Ok(())
40    }
41
42    pub fn node_count(&self) -> usize {
43        self.nodes.len()
44    }
45
46    pub fn root_node(&self) -> Option<&SkeletonNode> {
47        self.root_id
48            .and_then(|rid| self.nodes.iter().find(|n| n.id() == rid))
49    }
50}