capability_skeleton/
skeleton.rs1crate::ix!();
3
4#[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 #[builder(default = "\"target\".to_string()")]
12 target_name: String,
13
14 #[builder(default)]
16 nodes: Vec<SkeletonNode>,
17
18 #[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}