opcua_types/
data_type_definition.rs

1//! Implementation of the [`DataTypeDefinition`] enum, and some utilities related to this.
2
3use crate::match_extension_object_owned;
4
5use super::{EnumDefinition, ExtensionObject, StatusCode, StructureDefinition, Variant};
6
7#[derive(Debug, Clone)]
8/// Type for an OPC UA data type definition.
9pub enum DataTypeDefinition {
10    /// Structure definition.
11    Structure(StructureDefinition),
12    /// Enum definition.
13    Enum(EnumDefinition),
14}
15
16impl From<StructureDefinition> for DataTypeDefinition {
17    fn from(value: StructureDefinition) -> Self {
18        Self::Structure(value)
19    }
20}
21
22impl From<EnumDefinition> for DataTypeDefinition {
23    fn from(value: EnumDefinition) -> Self {
24        Self::Enum(value)
25    }
26}
27
28impl DataTypeDefinition {
29    /// Try to get a data type definition from the body of an extension object.
30    pub fn from_extension_object(obj: ExtensionObject) -> Result<Self, StatusCode> {
31        match_extension_object_owned!(obj,
32            v: StructureDefinition => Ok(Self::Structure(v)),
33            v: EnumDefinition => Ok(Self::Enum(v)),
34            _ => Err(StatusCode::BadDataTypeIdUnknown)
35        )
36    }
37
38    /// Create an extension object from this.
39    pub fn into_extension_object(self) -> ExtensionObject {
40        match self {
41            DataTypeDefinition::Structure(s) => ExtensionObject::from_message(s),
42            DataTypeDefinition::Enum(s) => ExtensionObject::from_message(s),
43        }
44    }
45}
46
47impl From<DataTypeDefinition> for Variant {
48    fn from(value: DataTypeDefinition) -> Self {
49        value.into_extension_object().into()
50    }
51}