hyle-dioxus-native 0.2.0

Native (non-WASM) Dioxus components for hyle — table, form, and filter UI primitives.
Documentation
use indexmap::IndexMap;
use std::collections::BTreeSet;

use hyle::{Blueprint, FieldType, ModelResult, Row, Source, Value};

pub fn item_to_source(
    blueprint: &Blueprint,
    model: &str,
    id: &str,
    fields: &IndexMap<String, String>,
) -> Source {
    let mut row = Row::new();
    row.insert("id".to_owned(), Value::String(id.to_owned()));
    for (k, v) in fields {
        row.insert(k.clone(), Value::String(v.clone()));
    }
    let mut source: Source = Source::new();
    source.insert(model.to_owned(), ModelResult::one(row));

    if let Some(m) = blueprint.models.get(model) {
        for (field_name, field) in &m.fields {
            if let FieldType::Reference { reference } = &field.field_type {
                if let Some(val) = fields.get(field_name) {
                    let mut seen = BTreeSet::new();
                    for v in val.split(',').map(|s| s.trim()).filter(|s| !s.is_empty()) {
                        seen.insert(v.to_owned());
                    }
                    if !seen.is_empty() {
                        let lookup_rows: Vec<Row> = seen
                            .into_iter()
                            .map(|v| {
                                let mut r = Row::new();
                                r.insert("id".to_owned(), Value::String(v.clone()));
                                r.insert(reference.display_field.clone(), Value::String(v));
                                r
                            })
                            .collect();
                        source.insert(reference.entity.clone(), ModelResult::many(lookup_rows));
                    }
                }
            }
        }
    }

    source
}