hyle_dioxus_native/
edit.rs1use 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}