1use ifc_model::{EntityId, Value};
4
5macro_rules! string_enum {
6 ($(#[$meta:meta])* $name:ident { $($variant:ident => $token:literal),+ $(,)? }) => {
7 $(#[$meta])*
8 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
9 pub enum $name {
10 $(#[doc = concat!("IFC token `", $token, "`.")]
11 $variant),+
12 }
13 impl $name {
14 pub(crate) fn parse(value: &str) -> Option<Self> {
15 $(if value.eq_ignore_ascii_case($token) { return Some(Self::$variant); })+
16 None
17 }
18 pub(crate) const fn token(self) -> &'static str {
19 match self { $(Self::$variant => $token),+ }
20 }
21 }
22 };
23}
24
25string_enum!(
26 ConstraintGrade {
28 Hard => "HARD",
29 Soft => "SOFT",
30 Advisory => "ADVISORY",
31 UserDefined => "USERDEFINED",
32 NotDefined => "NOTDEFINED",
33 }
34);
35
36string_enum!(
37 Benchmark {
39 GreaterThan => "GREATERTHAN",
40 GreaterThanOrEqualTo => "GREATERTHANOREQUALTO",
41 LessThan => "LESSTHAN",
42 LessThanOrEqualTo => "LESSTHANOREQUALTO",
43 EqualTo => "EQUALTO",
44 NotEqualTo => "NOTEQUALTO",
45 Includes => "INCLUDES",
46 NotIncludes => "NOTINCLUDES",
47 IncludedIn => "INCLUDEDIN",
48 NotIncludedIn => "NOTINCLUDEDIN",
49 }
50);
51
52string_enum!(
53 LogicalOperator {
55 LogicalAnd => "LOGICALAND",
56 LogicalOr => "LOGICALOR",
57 LogicalXor => "LOGICALXOR",
58 LogicalNotAnd => "LOGICALNOTAND",
59 LogicalNotOr => "LOGICALNOTOR",
60 }
61);
62
63string_enum!(
64 ObjectiveQualifier {
66 CodeCompliance => "CODECOMPLIANCE",
67 CodeWaiver => "CODEWAIVER",
68 DesignIntent => "DESIGNINTENT",
69 External => "EXTERNAL",
70 HealthAndSafety => "HEALTHANDSAFETY",
71 MergeConflict => "MERGECONFLICT",
72 ModelView => "MODELVIEW",
73 Parameter => "PARAMETER",
74 Requirement => "REQUIREMENT",
75 Specification => "SPECIFICATION",
76 TriggerCondition => "TRIGGERCONDITION",
77 UserDefined => "USERDEFINED",
78 NotDefined => "NOTDEFINED",
79 }
80);
81
82#[derive(Debug, Clone, Copy, PartialEq)]
84pub enum MetricValue<'m> {
85 Entity(EntityId),
87 Typed {
89 type_name: &'m str,
91 value: &'m Value,
93 },
94}
95
96#[derive(Debug, Clone, Copy)]
98pub enum MetricValueDraft<'a> {
99 Entity(EntityId),
101 Typed {
103 type_name: &'a str,
105 value: &'a Value,
107 },
108}