ifc-resource 0.4.0

Construction resources: labour, equipment, material, crew, subcontract.
Documentation
//! Shared test-model builders for `ifc-resource` integration tests.

#![allow(dead_code)]

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

pub const GUID_A: &str = "2O2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_B: &str = "1O2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_C: &str = "0O2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_D: &str = "3O2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_E: &str = "2P2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_F: &str = "1P2Fr$t4X7Zf8NOew3FLOH";
pub const GUID_G: &str = "0P2Fr$t4X7Zf8NOew3FLOH";

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

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 the 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 schema"));
        values[slot] = value.clone();
    }
    Entity::new(type_name.to_ascii_uppercase(), values)
}

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())
}

pub fn refs_text(values: &[&str]) -> Value {
    Value::List(values.iter().map(|value| text(value)).collect())
}