Skip to main content

iso_10303/step/
structure.rs

1use super::Real;
2use std::collections::HashSet;
3use std::hash::Hash;
4use std::iter::FromIterator;
5
6#[derive(Debug)]
7pub enum Parameter {
8    TypedParameter(TypedParameter),
9    UnTypedParameter(UnTypedParameter),
10    OmittedParameter,
11}
12
13#[derive(Debug)]
14pub struct TypedParameter {
15    pub type_name: String,
16    pub parameters: Vec<Parameter>,
17}
18
19#[derive(Debug)]
20pub enum UnTypedParameter {
21    List(Vec<Parameter>),
22    EnumValue(String),
23    EntityRef(i64),
24    ConstantRef(String),
25    Integer(i64),
26    Real(f64),
27    String(String),
28    Binary(()),
29    Null,
30}
31
32#[derive(Debug)]
33pub struct EntityInstance {
34    pub id: i64,
35    pub value: Vec<TypedParameter>,
36}
37
38#[derive(Eq, PartialEq, Hash, Debug, Default)]
39pub struct EntityRef(pub i64);
40
41#[derive(Debug)]
42pub struct ExchangeFile {
43    pub header: Vec<TypedParameter>,
44    pub data: Vec<EntityInstance>,
45}
46
47impl Parameter {
48    pub fn is_null(&self) -> bool {
49        match self {
50            Parameter::UnTypedParameter(parameter) => match parameter {
51                UnTypedParameter::Null => true,
52                _ => false,
53            },
54            Parameter::OmittedParameter => true,
55            _ => false,
56        }
57    }
58}
59
60impl From<Parameter> for bool {
61    fn from(parameter: Parameter) -> Self {
62        match parameter {
63            Parameter::UnTypedParameter(parameter) => parameter.into(),
64            _ => panic!("can not convert"),
65        }
66    }
67}
68
69impl From<Parameter> for Option<bool> {
70    fn from(parameter: Parameter) -> Self {
71        match parameter {
72            Parameter::UnTypedParameter(parameter) => parameter.into(),
73            Parameter::OmittedParameter => None,
74            _ => panic!("can not convert"),
75        }
76    }
77}
78
79impl From<Parameter> for i64 {
80    fn from(parameter: Parameter) -> Self {
81        match parameter {
82            Parameter::UnTypedParameter(parameter) => parameter.into(),
83            _ => panic!("can not convert"),
84        }
85    }
86}
87
88impl From<Parameter> for Real {
89    fn from(parameter: Parameter) -> Self {
90        match parameter {
91            Parameter::UnTypedParameter(parameter) => parameter.into(),
92            _ => panic!("can not convert"),
93        }
94    }
95}
96
97impl From<Parameter> for String {
98    fn from(parameter: Parameter) -> Self {
99        match parameter {
100            Parameter::UnTypedParameter(parameter) => parameter.into(),
101            _ => panic!("can not convert"),
102        }
103    }
104}
105
106impl From<Parameter> for EntityRef {
107    fn from(parameter: Parameter) -> Self {
108        match parameter {
109            Parameter::UnTypedParameter(parameter) => parameter.into(),
110            Parameter::OmittedParameter => EntityRef(0),
111            _ => panic!("can not convert"),
112        }
113    }
114}
115
116impl<T: From<Parameter>> From<Parameter> for Vec<T> {
117    fn from(parameter: Parameter) -> Self {
118        match parameter {
119            Parameter::UnTypedParameter(untyped_parameter) => match untyped_parameter {
120                UnTypedParameter::List(list) => list.into_iter().map(|item| item.into()).collect(),
121                _ => panic!("parameter is not an list"),
122            },
123            Parameter::OmittedParameter => Vec::new(),
124            _ => panic!("parameter is not an list"),
125        }
126    }
127}
128
129impl<T: From<Parameter> + Eq + Hash> From<Parameter> for HashSet<T> {
130    fn from(parameter: Parameter) -> Self {
131        match parameter {
132            Parameter::UnTypedParameter(parameter) => parameter.into(),
133            Parameter::OmittedParameter => HashSet::new(),
134            _ => panic!("can not convert"),
135        }
136    }
137}
138
139impl From<UnTypedParameter> for bool {
140    fn from(parameter: UnTypedParameter) -> Self {
141        match parameter {
142            UnTypedParameter::EnumValue(value) => match value.as_str() {
143                "T" => true,
144                "F" => false,
145                _ => panic!("invalid boolean value {}", value),
146            },
147            _ => panic!("can not convert to boolean"),
148        }
149    }
150}
151
152impl From<UnTypedParameter> for Option<bool> {
153    fn from(parameter: UnTypedParameter) -> Self {
154        match parameter {
155            UnTypedParameter::EnumValue(value) => match value.as_str() {
156                "T" => Some(true),
157                "F" => Some(false),
158                "U" => None,
159                _ => panic!("invalid boolean value {}", value),
160            },
161            _ => panic!("can not convert to boolean"),
162        }
163    }
164}
165
166impl From<UnTypedParameter> for i64 {
167    fn from(parameter: UnTypedParameter) -> Self {
168        match parameter {
169            UnTypedParameter::Integer(number) => number,
170            _ => panic!("can not convert to integer"),
171        }
172    }
173}
174
175impl From<UnTypedParameter> for Real {
176    fn from(parameter: UnTypedParameter) -> Self {
177        match parameter {
178            UnTypedParameter::Real(number) => Real(number),
179            _ => panic!("can not convert to real"),
180        }
181    }
182}
183
184impl From<UnTypedParameter> for String {
185    fn from(parameter: UnTypedParameter) -> Self {
186        match parameter {
187            UnTypedParameter::String(string) => string,
188            UnTypedParameter::Null => String::default(),
189            _ => panic!("can not convert to string"),
190        }
191    }
192}
193
194impl From<UnTypedParameter> for EntityRef {
195    fn from(parameter: UnTypedParameter) -> Self {
196        match parameter {
197            UnTypedParameter::EntityRef(id) => EntityRef(id),
198            _ => panic!("can not convert"),
199        }
200    }
201}
202
203impl<T: From<Parameter> + Eq + Hash> From<UnTypedParameter> for HashSet<T> {
204    fn from(parameter: UnTypedParameter) -> Self {
205        match parameter {
206            UnTypedParameter::List(values) => HashSet::from_iter(values.into_iter().map(|value| T::from(value))),
207            _ => panic!("can not convert"),
208        }
209    }
210}