opcua_types/node_id/
xml.rs1use 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}