pub enum Parameter {
Typed {
keyword: String,
parameter: Box<Parameter>,
},
Integer(i64),
Real(f64),
String(String),
Enumeration(String),
List(Vec<Parameter>),
Ref(Name),
NotProvided,
Omitted,
}Expand description
Primitive value type in STEP data
Inline struct or list can be nested, i.e. Parameter can be a tree.
use nom::Finish;
use step_p21::{
ast::{Parameter, Record},
parser::exchange,
};
let (residual, p) = exchange::parameter("B((1.0, A((2.0, 3.0))))")
.finish()
.unwrap();
assert_eq!(residual, "");
// A((2.0, 3.0))
let a = Parameter::Typed {
keyword: "A".to_string(),
parameter: Box::new(
vec![Parameter::real(2.0), Parameter::real(3.0)].into(),
),
};
// B((1.0, a))
let b = Parameter::Typed {
keyword: "B".to_string(),
parameter: Box::new(vec![Parameter::real(1.0), a].into()),
};
assert_eq!(p, b);§FromIterator
Create a list as Parameter::List from Iterator<Item=Parameter> or
Iterator<Item=&Parameter>.
use step_p21::ast::Parameter;
let p: Parameter = [Parameter::real(1.0), Parameter::real(2.0)]
.iter()
.collect();
assert!(matches!(p, Parameter::List(_)));§Deserialize
| Parameter | serde data model |
|---|---|
| Integer | i64 |
| Real | f64 |
| String | string |
| List | seq |
| NotProvided | option (always none) |
| Omitted | option (always none) |
| Enumeration | unit_variant (through serde::de::value::StringDeserializer) |
| Typed | map (through de::RecordDeserializer) |
| Ref | newtype_variant |
Variants§
Typed
Corresponding to TYPED_PARAMETER in WSN:
TYPED_PARAMETER = KEYWORD "(" PARAMETER ")" .and parser::exchange::typed_parameter.
It takes only one PARAMETER different from Record,
which takes many PARAMETERs.
SIMPLE_RECORD = KEYWORD "(" [ PARAMETER_LIST ] ")" .§FromStr
use std::str::FromStr;
use step_p21::ast::Parameter;
let p = Parameter::from_str("FILE_NAME('step_p21')").unwrap();
assert!(matches!(p, Parameter::Typed { .. }));§Deserialize
use serde::Deserialize;
use std::{collections::HashMap, str::FromStr};
use step_p21::ast::*;
// Regarded as a map `{ "A": [1, 2] }` in serde data model
let p = Parameter::from_str("A((1, 2))").unwrap();
// Map can be deserialize as a hashmap
assert_eq!(
HashMap::<String, Vec<i32>>::deserialize(&p).unwrap(),
maplit::hashmap! {
"A".to_string() => vec![1, 2]
}
);
// Map in serde can be interpreted as Rust field
#[derive(Debug, Clone, PartialEq, Deserialize)]
struct X {
#[serde(rename = "A")]
a: Vec<i32>,
}
assert_eq!(X::deserialize(&p).unwrap(), X { a: vec![1, 2] });Different from Record, deserializing into a struct is not supported:
use serde::Deserialize;
use std::{collections::HashMap, str::FromStr};
use step_p21::ast::*;
let p = Parameter::from_str("A(1)").unwrap();
#[derive(Debug, Clone, PartialEq, Deserialize)]
struct A {
x: i32,
}
assert!(A::deserialize(&p).is_err());Integer(i64)
Signed integer
§FromStr
use std::str::FromStr;
use step_p21::ast::Parameter;
let p = Parameter::from_str("10").unwrap();
assert_eq!(p, Parameter::Integer(10));
let p = Parameter::from_str("-10").unwrap();
assert_eq!(p, Parameter::Integer(-10));§Deserialize
use serde::Deserialize;
use step_p21::ast::*;
let p = Parameter::Integer(2);
let a = i64::deserialize(&p).unwrap();
assert_eq!(a, 2);
// can be deserialized as unsigned
let a = u64::deserialize(&p).unwrap();
assert_eq!(a, 2);
// cannot be deserialized negative integer into unsigned
let p = Parameter::Integer(-2);
let a = i64::deserialize(&p).unwrap();
assert_eq!(a, -2);
assert!(u64::deserialize(&p).is_err());Real(f64)
Real number
§FromStr
use std::str::FromStr;
use step_p21::ast::Parameter;
let p = Parameter::from_str("1.0").unwrap();
assert_eq!(p, Parameter::Real(1.0));String(String)
string literal
§FromStr
use std::str::FromStr;
use step_p21::ast::Parameter;
let p = Parameter::from_str("'EXAMPLE STRING'").unwrap();
assert_eq!(p, Parameter::String("EXAMPLE STRING".to_string()));Enumeration(String)
Enumeration defined in EXPRESS schema, like .TRUE.
§FromStr
let p = Parameter::from_str(".TRUE.").unwrap();
assert_eq!(p, Parameter::Enumeration("TRUE".to_string()));§Deserialize
use serde::Deserialize;
use std::str::FromStr;
use step_p21::ast::*;
let p = Parameter::from_str(".A.").unwrap();
#[derive(Debug, PartialEq, Deserialize)]
enum E {
A,
B,
}
assert_eq!(E::deserialize(&p).unwrap(), E::A);List(Vec<Parameter>)
List of parameters. This can be non-uniform.
§FromStr
use std::str::FromStr;
use step_p21::ast::Parameter;
let p = Parameter::from_str("(1.0, 2, 'STRING')").unwrap();
assert_eq!(
p,
Parameter::List(vec![
Parameter::Real(1.0),
Parameter::Integer(2),
Parameter::String("STRING".to_string()),
])
);§Deserialize
use serde::Deserialize;
use std::str::FromStr;
use step_p21::ast::*;
let p = Parameter::from_str("(1, 2, 3)").unwrap();
// As Vec<i32>
let a = Vec::<i32>::deserialize(&p).unwrap();
assert_eq!(a, vec![1, 2, 3]);
// As user-defined struct
#[derive(Debug, Clone, PartialEq, Deserialize)]
struct A {
x: i32,
y: i32,
z: i32,
}
let a = A::deserialize(&p).unwrap();
assert_eq!(a, A { x: 1, y: 2, z: 3 });Ref(Name)
A reference to entity or value
§Deserialize
use serde::Deserialize;
use std::str::FromStr;
use step_p21::ast::*;
let p = Parameter::from_str("#12").unwrap();
#[derive(Debug, PartialEq, Deserialize)]
enum Id {
#[serde(rename = "Entity")] // "Entity" is keyword for entity reference
E(usize),
#[serde(rename = "Value")] // "Value" is keyword for value reference
V(usize),
}
assert_eq!(Id::deserialize(&p).unwrap(), Id::E(12));NotProvided
The special token dollar sign ($) is used to represent
an object whose value is not provided in the exchange structure.
§Deserialize
use serde::Deserialize;
use step_p21::ast::*;
let p = Parameter::NotProvided;
assert_eq!(Option::<i64>::deserialize(&p).unwrap(), None);Omitted
Omitted parameter denoted by *
§Deserialize
use serde::Deserialize;
use step_p21::ast::*;
let p = Parameter::Omitted;
assert_eq!(Option::<i64>::deserialize(&p).unwrap(), None);Implementations§
Trait Implementations§
Source§impl<'de> Deserializer<'de> for &Parameter
impl<'de> Deserializer<'de> for &Parameter
Source§type Error = Error
type Error = Error
The error type that can be returned if some error occurs during
deserialization.
Source§fn deserialize_i8<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_i8<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an i8 value.Source§fn deserialize_i16<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_i16<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an i16 value.Source§fn deserialize_i32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_i32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an i32 value.Source§fn deserialize_i64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_i64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an i64 value.Source§fn deserialize_i128<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_i128<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Source§fn deserialize_u8<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_u8<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a u8 value.Source§fn deserialize_u16<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_u16<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a u16 value.Source§fn deserialize_u32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_u32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a u32 value.Source§fn deserialize_u64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_u64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a u64 value.Source§fn deserialize_u128<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_u128<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Source§fn deserialize_f32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_f32<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a f32 value.Source§fn deserialize_f64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_f64<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a f64 value.Source§fn deserialize_char<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_char<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a char value.Source§fn deserialize_str<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_str<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a string value and does
not benefit from taking ownership of buffered data owned by the
Deserializer. Read moreSource§fn deserialize_string<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_string<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a string value and would
benefit from taking ownership of buffered data owned by the
Deserializer. Read moreSource§fn deserialize_bytes<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_bytes<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a byte array and does not
benefit from taking ownership of buffered data owned by the
Deserializer. Read moreSource§fn deserialize_byte_buf<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_byte_buf<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a byte array and would
benefit from taking ownership of buffered data owned by the
Deserializer. Read moreSource§fn deserialize_unit<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_unit<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a unit value.Source§fn deserialize_unit_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_unit_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a unit struct with a
particular name.Source§fn deserialize_newtype_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_newtype_struct<V>(
self,
name: &'static str,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a newtype struct with a
particular name.Source§fn deserialize_seq<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_seq<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a sequence of values.Source§fn deserialize_tuple<V>(
self,
len: usize,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_tuple<V>(
self,
len: usize,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a sequence of values and
knows how many values there are without looking at the serialized data.Source§fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_struct<V>(
self,
name: &'static str,
fields: &'static [&'static str],
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a struct with a particular
name and fields.Source§fn deserialize_tuple_struct<V>(
self,
name: &'static str,
len: usize,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_tuple_struct<V>(
self,
name: &'static str,
len: usize,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a tuple struct with a
particular name and number of fields.Source§fn deserialize_map<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_map<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a map of key-value pairs.Source§fn deserialize_enum<V>(
self,
name: &'static str,
variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_enum<V>(
self,
name: &'static str,
variants: &'static [&'static str],
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an enum value with a
particular name and possible variants.Source§fn deserialize_identifier<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_identifier<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting the name of a struct
field or the discriminant of an enum variant.Source§fn deserialize_ignored_any<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
fn deserialize_ignored_any<V>(
self,
visitor: V,
) -> Result<V::Value, <Self as Deserializer<'de>>::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type needs to deserialize a value whose type
doesn’t matter because it is ignored. Read moreSource§fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
Require the
Deserializer to figure out how to drive the visitor based
on what data type is in the input. Read moreSource§fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting a bool value.Source§fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>where
V: Visitor<'de>,
Hint that the
Deserialize type is expecting an optional value. Read moreSource§fn is_human_readable(&self) -> bool
fn is_human_readable(&self) -> bool
Determine whether
Deserialize implementations should expect to
deserialize their human-readable form. Read moreSource§impl<'a> FromIterator<&'a Parameter> for Parameter
impl<'a> FromIterator<&'a Parameter> for Parameter
Source§impl FromIterator<Parameter> for Parameter
impl FromIterator<Parameter> for Parameter
impl StructuralPartialEq for Parameter
Auto Trait Implementations§
impl Freeze for Parameter
impl RefUnwindSafe for Parameter
impl Send for Parameter
impl Sync for Parameter
impl Unpin for Parameter
impl UnsafeUnpin for Parameter
impl UnwindSafe for Parameter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more