use ifc_model::{EntityId, Value};
macro_rules! string_enum {
($(#[$meta:meta])* $name:ident { $($variant:ident => $token:literal),+ $(,)? }) => {
$(#[$meta])*
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum $name {
$(#[doc = concat!("IFC token `", $token, "`.")]
$variant),+
}
impl $name {
pub(crate) fn parse(value: &str) -> Option<Self> {
$(if value.eq_ignore_ascii_case($token) { return Some(Self::$variant); })+
None
}
pub(crate) const fn token(self) -> &'static str {
match self { $(Self::$variant => $token),+ }
}
}
};
}
string_enum!(
ConstraintGrade {
Hard => "HARD",
Soft => "SOFT",
Advisory => "ADVISORY",
UserDefined => "USERDEFINED",
NotDefined => "NOTDEFINED",
}
);
string_enum!(
Benchmark {
GreaterThan => "GREATERTHAN",
GreaterThanOrEqualTo => "GREATERTHANOREQUALTO",
LessThan => "LESSTHAN",
LessThanOrEqualTo => "LESSTHANOREQUALTO",
EqualTo => "EQUALTO",
NotEqualTo => "NOTEQUALTO",
Includes => "INCLUDES",
NotIncludes => "NOTINCLUDES",
IncludedIn => "INCLUDEDIN",
NotIncludedIn => "NOTINCLUDEDIN",
}
);
string_enum!(
LogicalOperator {
LogicalAnd => "LOGICALAND",
LogicalOr => "LOGICALOR",
LogicalXor => "LOGICALXOR",
LogicalNotAnd => "LOGICALNOTAND",
LogicalNotOr => "LOGICALNOTOR",
}
);
string_enum!(
ObjectiveQualifier {
CodeCompliance => "CODECOMPLIANCE",
CodeWaiver => "CODEWAIVER",
DesignIntent => "DESIGNINTENT",
External => "EXTERNAL",
HealthAndSafety => "HEALTHANDSAFETY",
MergeConflict => "MERGECONFLICT",
ModelView => "MODELVIEW",
Parameter => "PARAMETER",
Requirement => "REQUIREMENT",
Specification => "SPECIFICATION",
TriggerCondition => "TRIGGERCONDITION",
UserDefined => "USERDEFINED",
NotDefined => "NOTDEFINED",
}
);
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum MetricValue<'m> {
Entity(EntityId),
Typed {
type_name: &'m str,
value: &'m Value,
},
}
#[derive(Debug, Clone, Copy)]
pub enum MetricValueDraft<'a> {
Entity(EntityId),
Typed {
type_name: &'a str,
value: &'a Value,
},
}