mod layout;
mod linear;
mod referent;
mod segment;
pub use layout::{alignment, alignment_segment, cant_layout, horizontal_layout, vertical_layout};
pub use linear::{linear_element, linear_positioning_element};
pub use referent::{
axis2_placement_linear, cartesian_point, linear_placement, point_by_distance, referent,
stationing,
};
pub use segment::{
cant_segment, horizontal_segment, vertical_segment, CantSegmentDraft, HorizontalSegmentDraft,
VerticalSegmentDraft,
};
use ifc_model::Value;
use crate::error::AlignmentError;
pub(crate) fn invalid(
type_name: &'static str,
attribute: &'static str,
detail: impl Into<String>,
) -> AlignmentError {
AlignmentError::InvalidAuthoredValue {
type_name,
attribute,
detail: detail.into(),
}
}
pub(crate) fn finite(
type_name: &'static str,
attribute: &'static str,
value: f64,
) -> Result<(), AlignmentError> {
if value.is_finite() {
Ok(())
} else {
Err(invalid(
type_name,
attribute,
format!("{value} is not finite"),
))
}
}
pub(crate) fn guid(type_name: &'static str, value: &str) -> Result<Value, AlignmentError> {
if value.chars().count() != 22 {
return Err(invalid(
type_name,
"GlobalId",
format!("expected 22 characters, got {}", value.chars().count()),
));
}
Ok(Value::Text(value.into()))
}