docchi_core/imp/rust_to_json/list/
tmp_json_list.rs

1use crate::imp::json_to_rust::tmp::tmp_obj::{ IdValue};
2//use crate::{HashM};
3use 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 ) compatible : Option<BTreeSet<String>>,
16    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        //最近のハッシュマップは中身の順番がランダム化されるようなので、btree_mapにうつして順番を揃える
76         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            //undefinedは勝手に空リストにしてしまう
91            (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_data(l : &InnerData) -> TmpJsonList{
98    //     TmpJsonList{ vec : btree_map(l.list()).iter().map(|(id, item)| TmpJsonObj::from_list_item(item, Some(id))).collect(),
99    //         compatible : None, next_id: None, old : get_from_set(l.old()), default : None }
100    // }
101
102    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}