nyar_wasm/symbols/identifiers/
mod.rs

1use super::*;
2
3mod convert;
4mod display;
5
6#[derive(Clone, PartialEq, Eq, Ord, PartialOrd, Hash)]
7pub struct Identifier {
8    /// The namespace of the identifier, only valid when name is not empty
9    pub namespace: Vec<Arc<str>>,
10    /// The name of the identifier, anonymous identifier is empty
11    pub name: Arc<str>,
12}
13
14impl Default for Identifier {
15    fn default() -> Self {
16        Self { namespace: Vec::new(), name: Arc::from("") }
17    }
18}
19
20impl Identifier {
21    /// Check if it is an anonymous identifier
22    pub fn is_anonymous(&self) -> bool {
23        self.name.is_empty()
24    }
25    pub(crate) fn wasi_name(&self) -> String {
26        self.name.as_ref().to_case(Case::Kebab)
27    }
28    pub(crate) fn wasi_id(&self) -> String {
29        encode_id(&format!("{self:#}"))
30    }
31}
32
33impl Identifier {
34    /// Create a new identifier without namespace
35    pub fn new<S>(name: S) -> Self
36    where
37        S: Into<Arc<str>>,
38    {
39        Self { namespace: Vec::new(), name: name.into() }
40    }
41    /// Create a new identifier with current [Identifier] as namespace
42    pub fn join<S>(&self, name: S) -> Self
43    where
44        S: Into<Arc<str>>,
45    {
46        match self.name.as_ref() {
47            "" => Self { namespace: self.namespace.clone(), name: name.into() },
48            _ => {
49                let mut namespace = self.namespace.clone();
50                namespace.push(self.name.clone());
51                Self { namespace, name: name.into() }
52            }
53        }
54    }
55}