docchi_core/imp/rust_to_json/list/
tmp_json_list.rs1use crate::imp::json_to_rust::tmp::tmp_obj::{ IdValue};
2use std::collections::{BTreeSet, BTreeMap};
4use crate::imp::structs::rust_value::RustValue;
5use crate::imp::structs::rust_list::{ConstItem, MutItem, ConstTable, ConstListVal, MutListVal, ConstList};
6use crate::imp::structs::ref_value::RefValue;
7use crate::imp::structs::list_def_obj::ListDefObj;
8use crate::imp::structs::util::hash_m::{HashS, HashM};
9use crate::imp::structs::mut_list_def::MutListDef;
10
11pub(crate) struct TmpJsonList{
12 pub(crate) vec : Vec<TmpJsonObj>,
13 pub(crate) old : Option<BTreeSet<String>>,
14 pub(crate) default : Option<ListDefObj>,
15 pub(crate) next_id : Option<u64>,
17}
18
19pub(crate) struct TmpJsonObj{
20 pub(crate) default : BTreeMap<String, RustValue>,
21 pub(crate) id : Option<IdValue>,
22 pub(crate) refs: Option<TmpJsonRefs>,
23 pub(crate) old : Option<BTreeSet<String>>,
24}
25
26impl TmpJsonObj{
27 pub(crate) fn from_list_item(l : &ConstItem, id : Option<&String>) -> TmpJsonObj{
28 let value_map : HashM<String, RustValue> = l.values().iter().map(|(k,v)| (k.to_string(), v.clone().into_rust_value_for_json())).collect();
29 let ref_map : HashM<String, RefValue> = l.refs().iter().map(|(k,v)| (k.to_string(), v.clone().into_ref_value_for_json())).collect();
30 TmpJsonObj{ default : btree_map(&value_map),
31 refs : TmpJsonRefs::from_list_item(&ref_map),
32 id : id.map(|s| IdValue::Str(s.to_string())), old : None }
33 }
34
35 pub(crate) fn from_mut_list_item(l : &MutItem, id : u64) -> TmpJsonObj{
36 let value_map : HashM<String, RustValue> = l.values().iter().map(|(k,v)| (k.to_string(), v.clone().into_rust_value_for_json())).collect();
37 let ref_map : HashM<String, RefValue> = l.refs().iter().map(|(k,v)| (k.to_string(), v.clone().into_ref_value_for_json())).collect();
38 TmpJsonObj{
39 default : btree_map(&value_map),
40 refs : TmpJsonRefs::from_list_item(&ref_map),
41 id : Some(IdValue::Num(id)), old : None }
42 }
43}
44
45pub(crate) struct TmpJsonRefs{
46 pub(crate) map : BTreeMap<String, RefValue>,
47 pub(crate) old : Option<BTreeSet<String>>,
48 pub(crate) is_enum : bool,
49}
50
51impl TmpJsonRefs{
52 pub(crate) fn from_map(map : &HashM<String, RefValue>, old : Option<&HashS<String>>, is_enum : bool) -> TmpJsonRefs{
53 TmpJsonRefs{
54 map : btree_map(map),
55 old : old.map(|s| btree_set(s)), is_enum }
56 }
57
58 pub(crate) fn from_list_item(map : &HashM<String, RefValue>) -> Option<TmpJsonRefs> {
59 if map.len() != 0 {
60 Some(TmpJsonRefs::from_map(map, None, false))
61 } else { None }
62 }
63}
64
65fn get_from_set(set : &HashS<String>) -> Option<BTreeSet<String>>{
66 if set.is_empty(){
67 None
68 } else{
69 Some(btree_set(set))
70 }
71}
72
73impl TmpJsonList{
74 pub(crate) fn from_const_data(l : &ConstTable) -> TmpJsonList{
75 TmpJsonList{ vec: btree_map(l.list()).iter().map(|(id,item)| TmpJsonObj::from_list_item(item, Some(id))).collect(),
77 next_id: None, old : get_from_set(l.old()), default : Some(l.default().clone()) }
78 }
79
80 pub(crate) fn from_const_list(l : &ConstList) -> TmpJsonList{
81 TmpJsonList{ vec: l.list().iter().map(|item| TmpJsonObj::from_list_item(item, None)).collect(),
82 next_id: None, old : None, default : Some(l.default().clone()) }
83 }
84
85 pub(crate) fn from_mut_list(d : &MutListDef, l : &Option<MutListVal>) -> TmpJsonList{
86 let (vec, next_id) = if let Some(l) = l{
87 (l.list().iter().map(|(id,item)| TmpJsonObj::from_mut_list_item(item, *id)).collect(),
88 l.list().next_id())
89 } else{
90 (vec![], 0)
92 };
93 TmpJsonList{ vec,
94 next_id: Some(next_id), old : None, default : Some(d.default().clone()) }
95 }
96
97 pub(crate) fn from_inner_list(l : &ConstListVal) -> TmpJsonList{
103 TmpJsonList{ vec : l.list().iter().map(|item| TmpJsonObj::from_list_item(item, None)).collect(),
104 next_id: None, old : None, default : None }
105 }
106
107 pub(crate) fn from_inner_mut(l : &MutListVal) -> TmpJsonList{
108 TmpJsonList{ vec : l.list().iter().map(|(id, item)| TmpJsonObj::from_mut_list_item(item, *id)).collect(),
109 next_id: None, old : None, default : None }
110 }
111}
112
113pub(crate) fn btree_set(hash : &HashS<String>) -> BTreeSet<String>{
114 hash.iter().map(|s| s.to_string()).collect()
115}
116
117pub(crate) fn btree_map<T : Clone>(hash : &HashM<String, T>) -> BTreeMap<String, T>{
118 hash.iter().map(|(key,val)|(key.to_string(), val.clone())).collect()
119}