opcua_types/node_id/
xml.rs

1use crate::xml::*;
2use std::{
3    io::{Read, Write},
4    str::FromStr,
5};
6
7use super::NodeId;
8
9impl XmlType for NodeId {
10    const TAG: &'static str = "NodeId";
11}
12
13impl XmlEncodable for NodeId {
14    fn encode(
15        &self,
16        writer: &mut XmlStreamWriter<&mut dyn Write>,
17        ctx: &crate::xml::Context<'_>,
18    ) -> Result<(), Error> {
19        let namespace_index = ctx.resolve_namespace_index_inverse(self.namespace)?;
20
21        let self_str = if namespace_index > 0 {
22            format!("ns={};{}", namespace_index, self.identifier)
23        } else {
24            self.identifier.to_string()
25        };
26        let val = ctx.resolve_alias_inverse(&self_str);
27        writer.encode_child("Identifier", val, ctx)
28    }
29}
30
31impl XmlDecodable for NodeId {
32    fn decode(
33        read: &mut XmlStreamReader<&mut dyn Read>,
34        context: &Context<'_>,
35    ) -> Result<Self, Error>
36    where
37        Self: Sized,
38    {
39        let val: Option<String> = read.decode_single_child("Identifier", context)?;
40        let Some(val) = val else {
41            return Ok(NodeId::null());
42        };
43
44        let val_str = context.resolve_alias(&val);
45        let mut id = NodeId::from_str(val_str)
46            .map_err(|e| Error::new(e, format!("Invalid node ID: {val_str}")))?;
47        id.namespace = context.resolve_namespace_index(id.namespace)?;
48        Ok(id)
49    }
50}