xidl-parser 0.69.2

A IDL codegen.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScopedName {
    pub name: Vec<String>,
    pub is_root: bool,
}

impl From<crate::typed_ast::ScopedName> for ScopedName {
    fn from(value: crate::typed_ast::ScopedName) -> Self {
        let is_root = value.node_text.starts_with("::");
        let mut parts = Vec::new();
        collect(&mut parts, &value);
        Self {
            name: parts.into_iter().map(ToOwned::to_owned).collect(),
            is_root,
        }
    }
}

fn collect<'a>(parts: &mut Vec<&'a str>, value: &'a crate::typed_ast::ScopedName) {
    if let Some(parent) = &value.scoped_name {
        collect(parts, parent);
    }
    parts.push(&value.identifier.0);
}