Skip to main content

hyle_dioxus_native/
edit.rs

1use indexmap::IndexMap;
2use std::collections::BTreeSet;
3
4use hyle::{Blueprint, FieldType, ModelResult, Row, Source, Value};
5
6pub fn item_to_source(
7    blueprint: &Blueprint,
8    model: &str,
9    id: &str,
10    fields: &IndexMap<String, String>,
11) -> Source {
12    let mut row = Row::new();
13    row.insert("id".to_owned(), Value::String(id.to_owned()));
14    for (k, v) in fields {
15        row.insert(k.clone(), Value::String(v.clone()));
16    }
17    let mut source: Source = Source::new();
18    source.insert(model.to_owned(), ModelResult::one(row));
19
20    if let Some(m) = blueprint.models.get(model) {
21        for (field_name, field) in &m.fields {
22            if let FieldType::Reference { reference } = &field.field_type {
23                if let Some(val) = fields.get(field_name) {
24                    let mut seen = BTreeSet::new();
25                    for v in val.split(',').map(|s| s.trim()).filter(|s| !s.is_empty()) {
26                        seen.insert(v.to_owned());
27                    }
28                    if !seen.is_empty() {
29                        let lookup_rows: Vec<Row> = seen
30                            .into_iter()
31                            .map(|v| {
32                                let mut r = Row::new();
33                                r.insert("id".to_owned(), Value::String(v.clone()));
34                                r.insert(reference.display_field.clone(), Value::String(v));
35                                r
36                            })
37                            .collect();
38                        source.insert(reference.entity.clone(), ModelResult::many(lookup_rows));
39                    }
40                }
41            }
42        }
43    }
44
45    source
46}