docchi_core/imp/json_to_rust/validation/
validate_refs.rs

1//use crate::HashM;
2use crate::error::CoreResult;
3use crate::imp::json_to_rust::names::Names;
4use crate::imp::rust_to_json::name_with_suffix::name_with_suffix;
5use crate::imp::structs::ref_def_obj::RefDefObj;
6use crate::imp::structs::ref_value::RefSabValue;
7use crate::imp::structs::qv::Qv;
8use crate::imp::structs::root_obj::RootObject;
9use crate::imp::structs::root_value::RootValue;
10use crate::imp::structs::util::hash_m::HashM;
11
12pub(crate) fn validate_refs(def : &RefDefObj, sabun : &HashM<String, RefSabValue>, root : &RootObject, can_use_old: bool, names : &Names) -> CoreResult<()>{
13    if def.is_enum(){
14       if sabun.len() != 1{
15           Err(format!("{} one of the Enum's member must be defined", names))?
16       }
17    } else{
18        //defのdefault値がemptyで、sabunでも定義されていないのを探す。もっと効率的に実装できないものかなあ
19        for (name, _, def_val) in def.refs(){
20            if sabun.contains_key(name) == false{
21                if let Qv::Val(v) = def_val.value(){
22                    if v.is_empty(){
23                        Err(format!("{} ref {} is not defined", names, name))?
24                    }
25                }
26
27            }
28        }
29    }
30
31    for (name, sab_val) in sabun{
32        if can_use_old == false && def.old().contains(name) {
33            Err(format!("{} {} is old", names, name))?
34        }
35        match def.refs().get(name){
36            Some(h) =>{
37                if h.acceptable(sab_val) == false{
38                    Err(format!("{} {} {} is not valid for {}", names, name, sab_val.value().js_string(), name_with_suffix(name, h.var_type())))?
39                }
40                match sab_val.value() {
41                    Qv::Val(id) =>{
42                        if id.is_empty(){
43                            Err(format!("{} ref {} is empty", names, name))?
44                        }
45                        match root.default().get(name) {
46                            Some(RootValue::Table(d)) => {
47                                if d.list().get(id).is_none() {
48                                    Err(format!("{}'s {} was not found {}", name, id, names))?
49                                }
50                                if can_use_old == false && d.old().contains(id) {
51                                    Err(format!("{}'s {} is old {}", name, id, names))?
52                                }
53                                continue;
54                            },
55                            Some(_) => {
56                                Err(format!("{} the root object's {} was not Data", names, name))?
57                            },
58                            None => {
59                                Err(format!("{} the root object's {} was not found", names, name))?
60                            }
61                        }
62                    },
63                    _ =>{
64                        //nullとかundefinedとかは有効な値である
65                    }
66                }
67            },
68            None =>{ Err(format!("{} there's no default ref members named {}", names, name))? }
69        }
70    }
71
72
73    return Ok(());
74}