docchi_core/imp/json_to_rust/validation/
validate_refs.rs1use 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 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 }
66 }
67 },
68 None =>{ Err(format!("{} there's no default ref members named {}", names, name))? }
69 }
70 }
71
72
73 return Ok(());
74}