1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//! Convenient implementation of the `ValueRank` type in OPC-UA,
//! representing the rank of an OPC-UA variable.
use crate::{IntoVariant, Variant};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
/// A representation of the ValueRank type in OPC-UA.
///
/// ValueRank indicates the number of dimensions a variable has.
///
/// - A ValueRank of -1 indicates a scalar value.
/// - A ValueRank of 0 indicates one or more dimensions.
/// - A ValueRank of -2 indicates any value rank.
/// - A ValueRank of -3 indicates a scalar or one dimensional array.
/// - A ValueRank of n (n >= 1) indicates exactly n dimensions.
pub struct ValueRank(i32);
impl From<i32> for ValueRank {
fn from(value: i32) -> Self {
if value < -3 {
return ValueRank::ANY;
}
ValueRank(value)
}
}
impl From<ValueRank> for i32 {
fn from(value: ValueRank) -> Self {
value.0
}
}
impl IntoVariant for ValueRank {
fn into_variant(self) -> Variant {
Variant::Int32(self.0)
}
}
impl ValueRank {
/// ValueRank indicating a scalar value.
pub const SCALAR: ValueRank = ValueRank(-1);
/// ValueRank indicating one or more dimensions.
pub const ONE_OR_MORE_DIMENSIONS: ValueRank = ValueRank(0);
/// ValueRank indicating any value rank.
pub const ANY: ValueRank = ValueRank(-2);
/// ValueRank indicating a scalar or one dimensional array.
pub const SCALAR_OR_ONE_DIMENSION: ValueRank = ValueRank(-3);
/// Create a new ValueRank, returning None if the value is invalid.
pub fn new_checked(value: i32) -> Option<Self> {
if value < -3 {
None
} else {
Some(ValueRank(value))
}
}
/// Create a new ValueRank from an i32 value. If the value is invalid
/// (less than -3), it will be set to ANY.
pub fn new(value: i32) -> Self {
ValueRank::from(value)
}
/// Check if the ValueRank represents a scalar value.
pub fn is_scalar(&self) -> bool {
self == &ValueRank::SCALAR
}
/// Create a ValueRank inidicating exactly `n` dimensions.
pub fn n_dimensions(n: u32) -> Self {
ValueRank(n as i32)
}
/// Get the i32 representation of the ValueRank.
pub fn to_i32(self) -> i32 {
self.0
}
}