ifc-structural 0.4.0

Structural analysis model: members, connections, actions, reactions, loads.
Documentation
//! Shared entity-building helpers for `ifc-structural` integration tests.

#![allow(dead_code)]

use ifc_model::{Entity, EntityId, Model, Value};
use ifc_schema::Schema;

pub const GUID: &str = "2O2Fr$t4X7Zf8NOew3FLOH";

pub fn named(schema: &Schema, type_name: &str, fields: &[(&str, Value)]) -> Entity {
    let names = schema.attribute_names(type_name);
    assert!(
        !names.is_empty(),
        "{type_name} must exist in selected schema"
    );
    let mut values = vec![Value::Null; names.len()];
    for (name, value) in fields {
        let slot = names
            .iter()
            .position(|candidate| candidate.eq_ignore_ascii_case(name))
            .unwrap_or_else(|| panic!("{type_name}.{name} missing from selected schema"));
        values[slot] = value.clone();
    }
    Entity::new(type_name.to_ascii_uppercase(), values)
}

pub fn model(schema_token: &str) -> Model {
    let mut model = Model::new();
    model.header_mut().schema = vec![schema_token.to_owned()];
    model
}

pub fn text(value: &str) -> Value {
    Value::Text(value.into())
}

pub fn enumeration(value: &str) -> Value {
    Value::Enum(value.into())
}

pub fn refs(ids: &[EntityId]) -> Value {
    Value::List(ids.iter().copied().map(Value::Ref).collect())
}