1use opcua_types::{
6 status_code::StatusCode, AttributeId, DataEncoding, DataValue, LocalizedText, NodeClass,
7 NodeId, NumericRange, QualifiedName, TimestampsToReturn, Variant, WriteMask,
8};
9
10use super::{DataType, Method, Object, ObjectType, ReferenceType, Variable, VariableType, View};
11
12#[derive(Debug)]
14pub enum NodeType {
15 Object(Box<Object>),
17 ObjectType(Box<ObjectType>),
19 ReferenceType(Box<ReferenceType>),
21 Variable(Box<Variable>),
23 VariableType(Box<VariableType>),
25 View(Box<View>),
27 DataType(Box<DataType>),
29 Method(Box<Method>),
31}
32
33pub trait HasNodeId {
35 fn node_id(&self) -> &NodeId;
37}
38
39impl HasNodeId for NodeType {
40 fn node_id(&self) -> &NodeId {
41 self.as_node().node_id()
42 }
43}
44
45impl NodeType {
46 pub fn as_node<'a>(&'a self) -> &'a (dyn Node + 'a) {
48 match self {
49 NodeType::Object(value) => value.as_ref(),
50 NodeType::ObjectType(value) => value.as_ref(),
51 NodeType::ReferenceType(value) => value.as_ref(),
52 NodeType::Variable(value) => value.as_ref(),
53 NodeType::VariableType(value) => value.as_ref(),
54 NodeType::View(value) => value.as_ref(),
55 NodeType::DataType(value) => value.as_ref(),
56 NodeType::Method(value) => value.as_ref(),
57 }
58 }
59
60 pub fn as_mut_node(&mut self) -> &mut dyn Node {
62 match self {
63 NodeType::Object(ref mut value) => value.as_mut(),
64 NodeType::ObjectType(ref mut value) => value.as_mut(),
65 NodeType::ReferenceType(ref mut value) => value.as_mut(),
66 NodeType::Variable(ref mut value) => value.as_mut(),
67 NodeType::VariableType(ref mut value) => value.as_mut(),
68 NodeType::View(ref mut value) => value.as_mut(),
69 NodeType::DataType(ref mut value) => value.as_mut(),
70 NodeType::Method(ref mut value) => value.as_mut(),
71 }
72 }
73
74 pub fn node_class(&self) -> NodeClass {
76 match self {
77 NodeType::Object(_) => NodeClass::Object,
78 NodeType::ObjectType(_) => NodeClass::ObjectType,
79 NodeType::ReferenceType(_) => NodeClass::ReferenceType,
80 NodeType::Variable(_) => NodeClass::Variable,
81 NodeType::VariableType(_) => NodeClass::VariableType,
82 NodeType::View(_) => NodeClass::View,
83 NodeType::DataType(_) => NodeClass::DataType,
84 NodeType::Method(_) => NodeClass::Method,
85 }
86 }
87}
88
89pub trait NodeBase {
92 fn node_class(&self) -> NodeClass;
94
95 fn node_id(&self) -> &NodeId;
97
98 fn browse_name(&self) -> &QualifiedName;
100
101 fn display_name(&self) -> &LocalizedText;
103
104 fn set_display_name(&mut self, display_name: LocalizedText);
106
107 fn description(&self) -> Option<&LocalizedText>;
109
110 fn set_description(&mut self, description: LocalizedText);
112
113 fn write_mask(&self) -> Option<WriteMask>;
115
116 fn set_write_mask(&mut self, write_mask: WriteMask);
118
119 fn user_write_mask(&self) -> Option<WriteMask>;
121
122 fn set_user_write_mask(&mut self, write_mask: WriteMask);
124}
125
126pub trait Node: NodeBase {
130 fn get_attribute_max_age(
138 &self,
139 timestamps_to_return: TimestampsToReturn,
140 attribute_id: AttributeId,
141 index_range: &NumericRange,
142 data_encoding: &DataEncoding,
143 max_age: f64,
144 ) -> Option<DataValue>;
145
146 fn get_attribute(
148 &self,
149 timestamps_to_return: TimestampsToReturn,
150 attribute_id: AttributeId,
151 index_range: &NumericRange,
152 data_encoding: &DataEncoding,
153 ) -> Option<DataValue> {
154 self.get_attribute_max_age(
155 timestamps_to_return,
156 attribute_id,
157 index_range,
158 data_encoding,
159 0f64,
160 )
161 }
162
163 fn set_attribute(
165 &mut self,
166 attribute_id: AttributeId,
167 value: Variant,
168 ) -> Result<(), StatusCode>;
169}