1
2use std::convert::From;
3use json::JsonValue;
4use std::collections::HashSet;
5use regex::Regex;
6
7#[derive(Debug)]
8pub enum FormatError{
9 InvalidDataType,InvalidFormat,
10 InvalidMin,InvalidMax,
11 InvalidSchemaOnData,InvalidSchema,
12 InvalidOptions,OptionsNotAllowed,
13 IsNotObject,IsNotStringArray,
14 ChildrenTypeMissing,InvalidChildrenType,
15 InvalidArrayUniqueKeyType,InvalidMinMaxValues,
16 InvalidMinKeySize,InvalidMaxKeySize,StringRuleNotDefined(String),InvalidChildrenSchema,StringRulesMissing(String),ValidKeyNotString,InvalidValidateRuleAction(String),
17 IncludeIsNotString,ExcludeIsNotString,ElseIsNotString,ElseAnyIsNotString
18}
19
20#[derive(Debug)]
21pub enum DataError{
22 Min,Max,NotFound(String),InvalidDataType,IsNotObject,
23 ExternalDataNotAllowed,InvalidNum,
24 InvalidMax,InvalidMaxNum,InvalidMaxDataType,
25 InvalidMin,InvalidMinNum,InvalidMinDataType,
26 OutOfOptions,DataMaxReached,UnmatchedKey(String),
27 UnMatchedSize,UnSupportedData,InvalidEmail,
28 MissingRequiredOptionField(String),
29 MissingRequiredField(String),
30 ArrayUniqueKeyNotFound(String),ArrayUniqueKeyNotStringType(String),
31 ArrayUniqueKeyDuplicate(String,String),DuplicateArrayString(String),
32 ArrayUniqueValueNotString,InvalidChildDataType(String,String),
33 MinString,MaxString,MaxKeySize,MinKeySize,MissingIncludeKey((String,String)),
34 PresentExcludeKey((String,String)),MissingAllIncludeKey(String),
35 ElseKeyMissing(String),ElseAnyKeyMissing(String)
36}
37
38pub fn validate_email(email:&str)->Result<(),RuleError>{
39
40 let re = Regex::new(
41 r"([\w\d_\-+#$%&*\/^]+)@([\w\d_-]+)[\.]{1,1}([\w\d]+)"
42 ).unwrap();
43
44 if !re.is_match(email){
45 return Err(RuleError::Data(DataError::InvalidEmail));
46 }
47
48 Ok(())
49
50}
51
52#[derive(Debug)]
53pub enum Error{
54 Key(String,RuleError),Format(FormatError),Data(DataError),RuleError(RuleError)
55}
56
57#[derive(Debug)]
58pub enum RuleError{
59 Format(FormatError),Data(DataError),None,Sub(Box<Error>)
60}
61
62impl From<RuleError> for Error {
63 fn from(v: RuleError) -> Error{
64 Error::RuleError(v)
65 }
66}
67
68#[doc = include_str!("../example.md")]
69pub fn run(
73 format:&JsonValue,
74 data:&JsonValue,
75 schema_type:&str,
76 max_size:u32,
77)->Result<(),Error>{
78 let mut definitions = None;
79 if format["$_DEFINE_$"].is_object(){
80 definitions = Some(&format["$_DEFINE_$"]);
81 }
82 run_with_definitions(
83 format,data,schema_type,max_size,&definitions
84 )
85}
86
87#[doc = include_str!("../example.md")]
88pub fn run_with_definitions(
92 format:&JsonValue,
93 data:&JsonValue,
94 schema_type:&str,
95 max_size:u32,
96 definitions:&Option<&JsonValue>
97)->Result<(),Error>{
98
99 if !format.is_object(){
100 return Err(RuleError::Format(FormatError::IsNotObject).into());
101 }
102 if !data.is_object(){
103 return Err(RuleError::Data(DataError::IsNotObject).into());
104 }
105 let is_dynamic;
106 if schema_type == "dynamic"{
107 if data.len() > max_size as usize{
108 return Err(RuleError::Data(DataError::DataMaxReached).into());
109 }
110 is_dynamic = true;
111 } else {
112 is_dynamic = false;
113 }
117
118 for (key,_rules) in format.entries(){
125
126 let define_key;
127 if key == "$_DEFINE_$"{
128 define_key = true;
129 } else {
130 define_key = false;
131 }
132
133 let rules;
134 if _rules.is_object(){
135 rules = _rules;
136 }
137 else if _rules.is_string(){
138 let rule = _rules.as_str().unwrap();
140 if definitions.is_some(){
141 let vv = definitions.as_ref().unwrap();
142 if vv[rule].is_object(){
143 rules = &vv[rule];
144 } else {
147 return Err(RuleError::Format(FormatError::StringRuleNotDefined(rule.to_string())).into());
148 }
149 } else {
150 return Err(RuleError::Format(FormatError::StringRulesMissing(rule.to_string())).into());
151 }
152 }
153 else {
154 return Err(RuleError::Format(FormatError::InvalidSchema).into());
155 }
156
157 if !define_key{
158
159
160 if !data.has_key(key){
161 if rules.has_key("elective"){
162 if rules["elective"].is_boolean(){
163 let elective = rules["elective"].as_bool().unwrap();
164 if !elective{
165 return Err(RuleError::Data(DataError::NotFound(key.to_string())).into());
166 }
167 } else {
168 return Err(RuleError::Data(DataError::NotFound(key.to_string())).into());
169 }
170 } else {
171 return Err(RuleError::Data(DataError::NotFound(key.to_string())).into());
172 }
173 }
174
175 if data.has_key(key){
176 let value = &data[key];
177 match check_field(
178 key, value, rules, &is_dynamic, &data,&definitions
179 ){
180 Ok(_)=>{},
181 Err(e)=>{
182 return Err(Error::Key(key.to_string(), e));
183 }
184 }
185 }
186
187 if
190 !data.has_key(key) &&
191 rules["else"].is_array()
192 {
193 for else_key in rules["else"].members(){
194 if !else_key.is_string(){
195 return Err(RuleError::Format(FormatError::ElseIsNotString).into());
196 }
197 let else_key = else_key.as_str().unwrap();
198 if !data.has_key(else_key){
199 return Err(RuleError::Data(DataError::ElseKeyMissing(
200 else_key.to_string()
201 )).into());
202 }
203 }
204 }
205
206 if
207 !data.has_key(key) &&
208 rules["else_any"].is_array()
209 {
210 let mut found = false;
211 for else_any_key in rules["else_any"].members(){
212 if !else_any_key.is_string(){
213 return Err(RuleError::Format(FormatError::ElseAnyIsNotString).into());
214 }
215 let else_any_key = else_any_key.as_str().unwrap();
216 if data.has_key(else_any_key){
217 found = true;
218 }
219 }
220 if !found{
221 return Err(RuleError::Data(DataError::ElseAnyKeyMissing(
222 key.to_string()
223 )).into());
224 }
225 }
226
227 if
228 data.has_key(key) &&
229 rules["exclude"].is_array()
230 {
231 for exclude_key in rules["exclude"].members(){
232 if !exclude_key.is_string(){
233 return Err(RuleError::Format(FormatError::ExcludeIsNotString).into());
234 }
235 let exclude_key = exclude_key.as_str().unwrap();
236 if data.has_key(exclude_key){
237 return Err(RuleError::Data(DataError::PresentExcludeKey(
238 (key.to_string(),exclude_key.to_string())
239 )).into());
240 }
241 }
242 }
243
244 if
245 data.has_key(key) &&
246 rules["include"].is_array()
247 {
248 for include_key in rules["include"].members(){
249 if !include_key.is_string(){
250 return Err(RuleError::Format(FormatError::IncludeIsNotString).into());
251 }
252 let include_key = include_key.as_str().unwrap();
253 if !data.has_key(include_key){
254 return Err(RuleError::Data(DataError::MissingIncludeKey(
255 (key.to_string(),include_key.to_string())
256 )).into());
257 }
258 }
259 }
260
261 if
262 data.has_key(key) &&
263 rules["include_any"].is_array()
264 {
265 let mut found = false;
266 for include_key in rules["include_any"].members(){
267 if !include_key.is_string(){
268 return Err(RuleError::Format(FormatError::IncludeIsNotString).into());
269 }
270 let include_key = include_key.as_str().unwrap();
271 if data.has_key(include_key){
272 found = true;
273 }
274 }
275 if !found{
276 return Err(RuleError::Data(DataError::MissingAllIncludeKey(key.to_string())).into());
277 }
278 }
279
280 }
281
282
283
284 }
285
286 if !is_dynamic{
287 for (key,_) in data.entries(){
288 if !format.has_key(key){
289 return Err(RuleError::Data(DataError::UnmatchedKey(key.to_string())).into());
290 }
291 }
292 }
293
294 return Ok(());
295
296}
297
298fn check_field(
299 _key:&str,value:&JsonValue,
300 rules:&JsonValue,_is_dynamic:&bool,
301 all_values:&JsonValue,
302 definitions:&Option<&JsonValue>
303)->Result<(),RuleError>{
304
305 if !rules.is_object(){
306 return Err(RuleError::Format(FormatError::InvalidFormat).into());
307 }
308
309 match check_rule_data_type(&rules["type"],&value,rules){
310 Ok(_)=>{},
311 Err(e)=>{
312 return Err(e);
313 }
314 }
315
316 let email_type = "string";
317 let mut data_type = rules["type"].as_str().unwrap();
318
319 if data_type == "email"{
320 let email = value.as_str().unwrap();
321 match validate_email(email){
322 Ok(_)=>{},
323 Err(e)=>{
324 return Err(e);
325 }
326 }
327 data_type = &email_type;
328 }
329
330 if data_type == "any"{
331 if value.is_null(){
332 return Err(RuleError::Data(DataError::NotFound(_key.to_string())));
333 }
334 }
335
336 if
337 data_type == "string" &&
338 rules.has_key("options") &&
339 rules.has_key("option_required_fields")
340 {
341 match check_option_required_fields(&value,&rules["option_required_fields"],&all_values){
342 Ok(_)=>{},
343 Err(e)=>{
344 return Err(e);
345 }
346 }
347 }
348
349 if rules.has_key("min"){
350 match check_min(&data_type,&value,&rules["min"]){
351 Ok(_)=>{},
352 Err(e)=>{
353 return Err(e);
354 }
355 }
356 }
357
358 if rules.has_key("max"){
359 match check_max(&data_type,&value,&rules["max"]){
360 Ok(_)=>{},
361 Err(e)=>{
362 return Err(e);
363 }
364 }
365 }
366
367 if rules.has_key("options"){
368 match check_options(&data_type,&value,&rules["options"]){
369 Ok(_)=>{},
370 Err(e)=>{
371 return Err(e);
372 }
373 }
374 }
375
376 if rules.has_key("validate"){
377 match check_validate(
378 &data_type,
379 &value,
380 &rules["validate"],
381 definitions
382 ){
383 Ok(_)=>{},
384 Err(e)=>{
385 return Err(e);
386 }
387 }
388 }
389
390 if rules.has_key("required_fields"){
391 match check_required_fields(&rules["required_fields"],&all_values){
392 Ok(_)=>{},
393 Err(e)=>{
394 return Err(e);
395 }
396 }
397 }
398
399 return Ok(());
400
401}
402
403fn check_required_fields(rule:&JsonValue,all_values:&JsonValue)->Result<(),RuleError>{
404
405 if !rule.is_array(){
406 return Err(RuleError::Format(FormatError::IsNotObject));
407 }
408 if !all_values.is_object(){
409 return Err(RuleError::Format(FormatError::IsNotObject));
410 }
411
412 for item in rule.members(){
413 if !item.is_string(){
414 return Err(RuleError::Format(FormatError::IsNotStringArray));
415 }
416 let value = item.as_str().unwrap();
417 if !all_values.has_key(value){
418 return Err(RuleError::Data(DataError::MissingRequiredField(value.to_string())));
419 }
420 }
421
422 return Ok(());
423
424}
425
426fn check_option_required_fields(value:&JsonValue,rule:&JsonValue,all_values:&JsonValue)->Result<(),RuleError>{
427
428 if !rule.is_object(){
429 return Err(RuleError::Format(FormatError::IsNotObject));
430 }
431 if !all_values.is_object(){
432 return Err(RuleError::Format(FormatError::IsNotObject));
433 }
434 if !value.is_string(){
435 return Err(RuleError::Data(DataError::InvalidDataType));
436 }
437 let value = value.as_str().unwrap();
438 if !rule.has_key(value){
439 return Ok(());
440 }
441
442 if rule[value].is_array(){
443 for item in rule[value].members(){
444 if !item.is_string(){
445 return Err(RuleError::Format(FormatError::IsNotStringArray));
446 }
447 let value = item.as_str().unwrap();
448 if !all_values.has_key(value){
449 return Err(RuleError::Data(DataError::MissingRequiredField(value.to_string())));
450 }
451 }
452 } else if rule[value].is_string(){
453 let field_name = rule[value].as_str().unwrap();
454 if !all_values.has_key(field_name){
455 return Err(RuleError::Data(DataError::MissingRequiredField(field_name.to_string())));
456 }
457 } else {
458 return Err(RuleError::Data(DataError::InvalidDataType));
459 }
460
461 return Ok(());
462
463}
464
465fn check_options(_data_type:&str,value:&JsonValue,rule:&JsonValue)->Result<(),RuleError>{
466
467 if
473 !value.is_string() &&
474 !value.is_number() &&
475 !value.is_array()
476 {
477 return Err(RuleError::Format(FormatError::OptionsNotAllowed));
478 }
479
480 if !rule.is_array(){
481 return Err(RuleError::Format(FormatError::InvalidOptions));
482 }
483
484 if value.is_array(){
492 for item in value.members(){
493 if item.is_string(){
494 let s = item.as_str().unwrap();
495 if rule.contains(s){
496 return Ok(());
498 }
499 }
500 else if item.as_i64().is_some(){
501 let v: String = item.as_i64().unwrap().to_string();
502 if rule.contains(v.as_str()){
503 return Ok(());
505 }
506 }
507 else if item.as_u64().is_some(){
508 let v: String = item.as_u64().unwrap().to_string();
509 if rule.contains(v.as_str()){
510 return Ok(());
512 }
513 }
514 }
515 }
517
518 if value.is_string(){
519 let v = value.as_str().unwrap();
520 if rule.contains(v){
521 return Ok(());
523 }
524 }
529
530 if value.is_number(){
531 if value.as_i64().is_some(){
532 let v: String = value.as_i64().unwrap().to_string();
533 if rule.contains(v.as_str()){
534 return Ok(());
536 }
537 }
538 else if value.as_u64().is_some(){
539 let v: String = value.as_u64().unwrap().to_string();
540 if rule.contains(v.as_str()){
541 return Ok(());
543 }
544 }
545 else if value.as_f64().is_some(){
546 let v: String = value.as_f64().unwrap().to_string();
547 if rule.contains(v.as_str()){
548 return Ok(());
550 }
551 }
552 }
559
560 return Err(RuleError::Data(DataError::OutOfOptions));
565
566}
567
568fn check_validate(
569 data_type:&str,
570 value:&JsonValue,
571 rule:&JsonValue,
572 definitions:&Option<&JsonValue>
573)->Result<(),RuleError>{
574
575 let schema_type;
576 if rule["dynamic"].is_boolean(){
577 let v = rule["dynamic"].as_bool().unwrap();
578 if v{
579 schema_type = "dynamic";
580 } else {
581 schema_type = "static";
582 }
583 } else {
584 schema_type = "static";
585 }
586
587 let max_size;
588 if rule["maxSize"].is_string(){
589 max_size = rule["maxSize"].as_u32().unwrap();
590 } else {
591 max_size = 0;
592 }
593
594 let valid_validate_keys = vec![
595 "schema","maxSize","dynamic","static",
596 "children_schema","valid_keys","children_type",
597 "array_validate","array_child_type",
598 "validate_nested_object","unique_keys",
599 "min_string","max_string","min_key_size","max_key_size",
600 "unique","max_size","option_required_fields",
601 "include","exclude","include_any","else","else_any",
602 "option_required_fields","options","required_fields"
603 ];
604
605 for (key,_) in rule.entries(){
606 if !valid_validate_keys.contains(&key){
607 return Err(RuleError::Format(FormatError::InvalidValidateRuleAction(key.to_string())));
608 }
609 }
610
611 let valid_child_type = ["bool","string","number","array","object"];
612
613 if data_type == "array"{
614
615 if !value.is_array(){
616 return Err(RuleError::Data(DataError::UnSupportedData));
617 }
618
619 if !rule["children_type"].is_string(){
620 return Err(RuleError::Format(FormatError::ChildrenTypeMissing));
621 }
622
623 let children_type = rule["children_type"].as_str().unwrap();
624 let child_data_type = children_type;
625 if !valid_child_type.contains(&child_data_type){
626 return Err(RuleError::Format(FormatError::InvalidChildrenType));
627 }
628
629 for item in value.members(){
630 let item_data_type = get_json_value_data_type(item)?;
631 if item_data_type != child_data_type{
632 return Err(RuleError::Data(DataError::InvalidDataType));
633 }
634 }
635
636 if child_data_type == "object"{
637 if rule["children_schema"].is_object(){
638 let schema = &rule["children_schema"];
639 for item in value.members(){
640 match run_with_definitions(
641 schema,item,schema_type,max_size,definitions
642 ){
643 Ok(_)=>{},
644 Err(e)=>{
645 return Err(RuleError::Sub(Box::new(e)));
646 }
647 }
648 }
649 }
650 else if rule["children_schema"].is_string(){
651 let schema;
652 let name = rule["children_schema"].as_str().unwrap();
653 if definitions.is_some(){
655 let define = definitions.as_ref().unwrap();
656 if define[name].is_object(){
657 schema = &define[name];
658 } else {
659 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
660 }
661 } else {
662 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
663 }
664 for item in value.members(){
665 match run_with_definitions(
666 schema,item,schema_type,max_size,definitions
667 ){
668 Ok(_)=>{},
669 Err(e)=>{
670 return Err(RuleError::Sub(Box::new(e)));
671 }
672 }
673 }
674 }
675 else if rule.has_key("children_schema"){
676 return Err(RuleError::Format(FormatError::InvalidChildrenSchema));
677 }
678 }
679
680 if child_data_type == "object"{
681 if rule["schema"].is_object(){
682 let schema = &rule["schema"];
683 for item in value.members(){
684 match run_with_definitions(
685 schema,item,schema_type,max_size,definitions
686 ){
687 Ok(_)=>{},
688 Err(e)=>{
689 return Err(RuleError::Sub(Box::new(e)));
690 }
691 }
692 }
693 }
694 else if rule["schema"].is_string(){
695 let schema;
696 let name = rule["schema"].as_str().unwrap();
697 if definitions.is_some(){
698 let define = definitions.as_ref().unwrap();
699 if define[name].is_object(){
700 schema = &define[name];
701 } else {
702 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
703 }
704 } else {
705 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
706 }
707 for item in value.members(){
708 match run_with_definitions(
709 schema,item,schema_type,max_size,definitions
710 ){
711 Ok(_)=>{},
712 Err(e)=>{
713 return Err(RuleError::Sub(Box::new(e)));
714 }
715 }
716 }
717 }
718 else if rule.has_key("schema"){
719 return Err(RuleError::Format(FormatError::InvalidSchema));
720 }
721 }
722
723 if children_type == "object" && rule["unique_keys"].is_array(){
724 for item in rule["unique_keys"].members(){
725 if !item.is_string(){
726 return Err(RuleError::Format(
727 FormatError::InvalidArrayUniqueKeyType
728 ));
729 }
730 let u_key = item.as_str().unwrap().to_string();
731 let mut map = HashSet::new();
732 for item in value.members(){
733 if item.has_key(&u_key){
734 if !item[&u_key].is_string(){
735 return Err(RuleError::Data(
736 DataError::ArrayUniqueKeyNotStringType(u_key)
737 ));
738 }
739 let u_key_val = item[&u_key].as_str().unwrap();
740 if map.contains(u_key_val){
742 return Err(RuleError::Data(
743 DataError::ArrayUniqueKeyDuplicate(
744 u_key,
745 u_key_val.to_string()
746 )
747 ));
748 } else {
749 map.insert(u_key_val);
750 }
751 }
752 }
753 }
754 }
755
756 if
757 children_type == "object" &&
758 rule["validate_nested_object"].is_object()
759 {
760 let schema = &rule["validate_nested_object"];
761 for ao_val in value.members(){
762 validate_nested_object(
763 schema,ao_val,&valid_child_type,definitions
764 )?;
765 }
766 }
767
768 if
769 children_type == "string" &&
770 rule["unique"].is_boolean() &&
771 rule["unique"].as_bool().unwrap()
772 {
773 let mut map = HashSet::new();
774 for item in value.members(){
775 if !item.is_string(){
776 return Err(RuleError::Data(
777 DataError::ArrayUniqueValueNotString
778 ));
779 }
780 let s = item.as_str().unwrap().to_string();
781 if map.contains(&s){
782 return Err(RuleError::Data(
783 DataError::DuplicateArrayString(s)
784 ));
785 } else {
786 map.insert(s);
787 }
788 }
789 }
790
791 if
792 children_type == "string" &&
793 rule["max_string"].is_number() ||
794 rule["min_string"].is_number()
795 {
796 let max = rule["max_string"].as_u64();
797 let min = rule["min_string"].as_u64();
798 if
799 max.is_some() ||
800 min.is_some()
801 {
802 for item in value.members(){
803 if !item.is_string(){
804 return Err(RuleError::Data(
805 DataError::ArrayUniqueValueNotString
806 ));
807 }
808 let len = item.as_str().unwrap().len() as u64;
809 if min.is_some(){
810 let min = min.as_ref().unwrap();
811 if len < *min{
812 return Err(RuleError::Data(
813 DataError::MinString
814 ));
815 }
816 }
817 if max.is_some(){
818 let max = max.as_ref().unwrap();
819 if len > *max{
820 return Err(RuleError::Data(
821 DataError::MaxString
822 ));
823 }
824 }
825 }
826 } else {
827 return Err(RuleError::Format(
828 FormatError::InvalidMinMaxValues
829 ));
830 }
831 }
832
833 return Ok(());
834
835 }
836
837 if data_type == "object"{
838
839 if !value.is_object(){
842 return Err(RuleError::Format(FormatError::InvalidSchemaOnData));
843 }
844
845 if rule["min_key_size"].as_usize().is_some(){
846 let min_key_size = rule["min_key_size"].as_usize().unwrap();
847 for (key,_) in value.entries(){
848 if key.len() < min_key_size{
849 return Err(RuleError::Data(DataError::MinKeySize));
850 }
851 }
852 }
853 if rule["max_key_size"].as_usize().is_some(){
854 let max_key_size = rule["max_key_size"].as_usize().unwrap();
855 for (key,_) in value.entries(){
856 if key.len() > max_key_size{
857 return Err(RuleError::Data(DataError::MaxKeySize));
858 }
859 }
860 }
861
862 if rule["schema"].is_object(){
867 let schema = &rule["schema"];
868 match run_with_definitions(
869 schema,value,schema_type,max_size,definitions
870 ){
871 Ok(_)=>{
872 return Ok(());
873 },
874 Err(e)=>{
875 return Err(RuleError::Sub(Box::new(e)));
876 }
877 }
878 }
879
880 else if rule["schema"].is_string(){
881 let schema;
882 let name = rule["schema"].as_str().unwrap();
883 if definitions.is_some(){
884 let define = definitions.as_ref().unwrap();
885 if define[name].is_object(){
886 schema = &define[name];
887 } else {
888 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
889 }
890 } else {
891 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
892 }
893 match run_with_definitions(
894 schema,value,schema_type,max_size,definitions
895 ){
896 Ok(_)=>{
897 return Ok(());
898 },
899 Err(e)=>{
900 return Err(RuleError::Sub(Box::new(e)));
901 }
902 }
903 }
904
905 else if rule.has_key("schema"){
906 return Err(RuleError::Format(FormatError::InvalidSchema));
907 }
908
909 if
914 rule["children_schema"].is_object()
915 {
916 let schema = &rule["children_schema"];
917 for (_,t_val) in value.entries(){
918 match run_with_definitions(
919 schema,t_val,schema_type,max_size,definitions
920 ){
921 Ok(_)=>{},
922 Err(e)=>{
923 return Err(RuleError::Sub(Box::new(e)));
924 }
925 }
926 }
927 }
928
929 else if
930 rule["children_schema"].is_string()
931 {
932 let schema;
933 let name = rule["children_schema"].as_str().unwrap();
934 if definitions.is_some(){
935 let define = definitions.as_ref().unwrap();
936 if define[name].is_object(){
937 schema = &define[name];
938 } else {
939 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
940 }
941 } else {
942 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
943 }
944 for (_,t_val) in value.entries(){
945 match run_with_definitions(
946 schema,t_val,schema_type,max_size,definitions
947 ){
948 Ok(_)=>{},
949 Err(e)=>{
950 return Err(RuleError::Sub(Box::new(e)));
951 }
952 }
953 }
954 }
955
956 else if rule.has_key("children_schema"){
957 return Err(RuleError::Format(FormatError::InvalidChildrenSchema));
958 }
959
960 if
965 rule["valid_keys"].is_array()
966 {
967 for valid_key in rule["valid_keys"].members(){
968 if !valid_key.is_string(){
969 return Err(RuleError::Format(FormatError::ValidKeyNotString));
970 }
971 }
972 let valid_keys = &rule["valid_keys"];
973 for (key,_) in value.entries(){
974 if !valid_keys.contains(key){
975 return Err(RuleError::Data(DataError::UnmatchedKey(key.to_string())));
976 }
977 }
978 }
979
980 if
985 rule["children_type"].is_string()
986 {
987 let children_type = rule["children_type"].as_str().unwrap();
988 if !valid_child_type.contains(&children_type){
989 return Err(RuleError::Format(FormatError::InvalidChildrenType));
990 }
991 for (_,value) in value.entries(){
992 let item_data_type = get_json_value_data_type(value)?;
993 if item_data_type != children_type{
994 return Err(RuleError::Data(DataError::InvalidChildDataType(
995 children_type.to_string(),
996 item_data_type.to_string(),
997 )));
998 }
999 }
1000 }
1001
1002 if
1007 rule["children_type"] == "array" &&
1008 rule["array_validate"].is_object()
1009 {
1010 let array_validate = &rule["array_validate"];
1011 if array_validate["array_child_type"].is_string(){
1012 let array_child_type = array_validate["array_child_type"].as_str().unwrap();
1013 if !valid_child_type.contains(&array_child_type){
1014 return Err(RuleError::Format(FormatError::InvalidChildrenType));
1015 }
1016 for (_,t_val) in value.entries(){
1017 for array_value in t_val.members(){
1018 let array_value_type = get_json_value_data_type(array_value)?;
1019 if array_value_type != array_child_type{
1020 return Err(RuleError::Data(DataError::InvalidDataType));
1021 }
1022 if
1023 array_child_type == "object" &&
1024 array_validate["validate"].is_object()
1025 {
1026 validate_array_children_schema(
1027 &array_validate["validate"],
1028 array_value,
1029 definitions
1030 )?;
1031 }
1032 }
1033 }
1034 }
1035 }
1036
1037 if
1042 rule["children_type"] == "string" &&
1043 (
1044 rule["min_string"].is_number() ||
1045 rule["max_string"].is_number()
1046 )
1047 {
1048 let min;
1049 if rule["min_string"].as_usize().is_some(){
1050 min = Some(rule["min_string"].as_usize().unwrap());
1051 } else {
1052 min = None;
1053 }
1054 let max;
1055 if rule["max_string"].as_usize().is_some(){
1056 max = Some(rule["max_string"].as_usize().unwrap());
1057 } else {
1058 max = None;
1059 }
1060 for (_,string_val) in value.entries(){
1061 if !string_val.is_string(){
1062 return Err(RuleError::Data(DataError::InvalidDataType));
1063 }
1064 let string_len = string_val.as_str().unwrap().len();
1065 if min.is_some(){
1066 let min = min.as_ref().unwrap();
1067 if string_len < *min{
1068 return Err(RuleError::Data(DataError::MinString));
1069 }
1070 }
1071 if max.is_some(){
1072 let max = max.as_ref().unwrap();
1073 if string_len > *max{
1074 return Err(RuleError::Data(DataError::MaxString));
1075 }
1076 }
1077 }
1078 }
1079
1080 if
1085 rule["validate_nested_object"].is_object()
1086 {
1087 let schema = &rule["validate_nested_object"];
1088 validate_nested_object(
1089 schema,value,&valid_child_type,definitions
1090 )?;
1091 }
1092
1093 return Ok(());
1094
1095 }
1096
1097 Ok(())
1100
1101}
1102
1103fn validate_nested_object(
1104 rule:&JsonValue,
1105 value:&JsonValue,
1106 valid_child_type:&[&str;5],
1107 definitions:&Option<&JsonValue>
1108)->Result<(),RuleError>{
1109
1110 if !value.is_object(){
1111 return Err(RuleError::Data(DataError::IsNotObject));
1112 }
1113
1114 if rule["max_key_size"].is_number(){
1115 let max = rule["max_key_size"].as_u64();
1116 if max.is_none(){
1117 return Err(RuleError::Format(FormatError::InvalidMaxKeySize));
1118 }
1119 let max = max.unwrap();
1120 for (key,_) in value.entries(){
1121 let len = key.len() as u64;
1122 if len > max{
1123 return Err(RuleError::Data(DataError::MaxKeySize));
1124 }
1125 }
1126 }
1127
1128 if rule["min_key_size"].is_number(){
1129 let min = rule["min_key_size"].as_u64();
1130 if min.is_none(){
1131 return Err(RuleError::Format(FormatError::InvalidMinKeySize));
1132 }
1133 let min = min.unwrap();
1134 for (key,_) in value.entries(){
1135 let len = key.len() as u64;
1136 if len < min{
1137 return Err(RuleError::Data(DataError::MinKeySize));
1138 }
1139 }
1140 }
1141
1142 if rule["validate_nested_object"].is_object(){
1143 let schema = &rule["validate_nested_object"];
1145 for (_,o_val) in value.entries(){
1146 validate_nested_object(
1147 schema,o_val,&valid_child_type,definitions
1148 )?;
1149 }
1150 return Ok(());
1151 }
1152
1153 let schema_type;
1160 if rule["dynamic"].is_boolean(){
1161 let v = rule["dynamic"].as_bool().unwrap();
1162 if v{
1163 schema_type = "dynamic";
1164 } else {
1165 schema_type = "static";
1166 }
1167 } else {
1168 schema_type = "static";
1169 }
1170
1171 let max_size;
1172 if rule["maxSize"].as_u32().is_some(){
1173 max_size = rule["maxSize"].as_u32().unwrap();
1174 } else {
1175 max_size = 0;
1176 }
1177
1178 if rule["schema"].is_object(){
1179 let schema = &rule["schema"];
1180 match run_with_definitions(
1181 schema,value,schema_type,max_size,definitions
1182 ){
1183 Ok(_)=>{},
1184 Err(e)=>{
1185 return Err(RuleError::Sub(Box::new(e)));
1186 }
1187 }
1188 }
1189
1190 else if rule["schema"].is_string(){
1191 let schema;
1192 let name = rule["schema"].as_str().unwrap();
1193 if definitions.is_some(){
1194 let define = definitions.as_ref().unwrap();
1195 if define[name].is_object(){
1196 schema = &define[name];
1197 } else {
1198 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
1199 }
1200 } else {
1201 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
1202 }
1203 match run_with_definitions(
1204 schema,value,schema_type,max_size,definitions
1205 ){
1206 Ok(_)=>{},
1207 Err(e)=>{
1208 return Err(RuleError::Sub(Box::new(e)));
1209 }
1210 }
1211 }
1212
1213 else if rule.has_key("schema"){
1214 return Err(RuleError::Format(FormatError::InvalidSchema));
1215 }
1216
1217 if
1218 rule["children_type"].is_string()
1219 {
1220 let children_type = rule["children_type"].as_str().unwrap();
1221 if !valid_child_type.contains(&children_type){
1222 return Err(RuleError::Format(FormatError::InvalidChildrenType));
1223 }
1224 for (_,o_val) in value.entries(){
1225 let item_data_type = get_json_value_data_type(o_val)?;
1226 if item_data_type != children_type{
1227 return Err(RuleError::Data(DataError::InvalidChildDataType(
1228 children_type.to_string(),
1229 item_data_type.to_string(),
1230 )));
1231 }
1232 }
1233 }
1234
1235 if rule["children_type"] == "object"{
1236
1237 if rule["children_schema"].is_object(){
1238 let schema = &rule["children_schema"];
1239 for (_,t_val) in value.entries(){
1240 match run_with_definitions(
1241 schema,t_val,schema_type,max_size,definitions
1242 ){
1243 Ok(_)=>{
1244 return Ok(());
1245 },
1246 Err(e)=>{
1247 return Err(RuleError::Sub(Box::new(e)));
1248 }
1249 }
1250 }
1251 }
1252
1253 else if rule["children_schema"].is_string(){
1254 let schema;
1255 let name = rule["children_schema"].as_str().unwrap();
1256 if definitions.is_some(){
1257 let define = definitions.as_ref().unwrap();
1258 if define[name].is_object(){
1259 schema = &define[name];
1260 } else {
1261 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
1262 }
1263 } else {
1264 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
1265 }
1266 for (_,t_val) in value.entries(){
1267 match run_with_definitions(
1268 schema,t_val,schema_type,max_size,definitions
1269 ){
1270 Ok(_)=>{
1271 return Ok(());
1272 },
1273 Err(e)=>{
1274 return Err(RuleError::Sub(Box::new(e)));
1275 }
1276 }
1277 }
1278 }
1279
1280 else if rule.has_key("children_schema"){
1281 return Err(RuleError::Format(FormatError::InvalidChildrenSchema));
1282 }
1283
1284 }
1285
1286 Ok(())
1287
1288}
1289
1290fn validate_array_children_schema(
1291 rule:&JsonValue,
1292 value:&JsonValue,
1293 definitions:&Option<&JsonValue>
1294)->Result<(),RuleError>{
1295
1296 let schema_type;
1297 if rule["dynamic"].is_boolean(){
1298 let v = rule["dynamic"].as_bool().unwrap();
1299 if v{
1300 schema_type = "dynamic";
1301 } else {
1302 schema_type = "static";
1303 }
1304 } else {
1305 schema_type = "static";
1306 }
1307
1308 let max_size;
1309 if rule["maxSize"].is_string(){
1310 max_size = rule["maxSize"].as_u32().unwrap();
1311 } else {
1312 max_size = 0;
1313 }
1314
1315 if rule["schema"].is_object(){
1316 let schema = &rule["schema"];
1317 match run_with_definitions(
1318 schema,value,schema_type,max_size,definitions
1319 ){
1320 Ok(_)=>{},
1321 Err(e)=>{
1322 return Err(RuleError::Sub(Box::new(e)));
1323 }
1324 }
1325 }
1326
1327 else if rule["schema"].is_string(){
1328 let schema;
1329 let name = rule["schema"].as_str().unwrap();
1330 if definitions.is_some(){
1331 let define = definitions.as_ref().unwrap();
1332 if define[name].is_object(){
1333 schema = &define[name];
1334 } else {
1335 return Err(RuleError::Format(FormatError::StringRuleNotDefined(name.to_string())));
1336 }
1337 } else {
1338 return Err(RuleError::Format(FormatError::StringRulesMissing(name.to_string())));
1339 }
1340 match run_with_definitions(
1341 schema,value,schema_type,max_size,definitions
1342 ){
1343 Ok(_)=>{},
1344 Err(e)=>{
1345 return Err(RuleError::Sub(Box::new(e)));
1346 }
1347 }
1348 }
1349
1350 else if rule.has_key("schema"){
1351 return Err(RuleError::Format(FormatError::InvalidSchema));
1352 }
1353
1354 Ok(())
1355
1356}
1357
1358fn check_max(data_type:&str,value:&JsonValue,rule:&JsonValue)->Result<(),RuleError>{
1359
1360 if data_type == "number"{
1361 let r;
1362 if value.as_u64().is_some() && rule.as_u64().is_some(){
1363 r = value.as_u64().unwrap() > rule.as_u64().unwrap();
1364 } else
1365 if value.as_i64().is_some() && rule.as_i64().is_some(){
1366 r = value.as_i64().unwrap() > rule.as_i64().unwrap();
1367 } else
1368 if value.as_f64().is_some() && rule.as_f64().is_some(){
1369 r = value.as_f64().unwrap() > rule.as_f64().unwrap();
1370 } else {
1371 return Err(RuleError::Data(DataError::InvalidMaxNum));
1372 }
1373 if r{return Err(RuleError::Data(DataError::Max));}
1374 return Ok(());
1375 }
1376
1377 if !rule.as_u64().is_some(){
1378 return Err(RuleError::Data(DataError::InvalidMax));
1379 }
1380
1381 let max = rule.as_u64().unwrap();
1382 if data_type == "string"{
1383 let v = value.as_str().unwrap();
1384 if (v.len() as u64) > max{return Err(RuleError::Data(DataError::Max));}
1385 } else if data_type == "array"{
1386 if (value.len() as u64) > max{return Err(RuleError::Data(DataError::Max));}
1387 } else if data_type == "object"{
1388 if (value.len() as u64) > max{return Err(RuleError::Data(DataError::Max));}
1389 } else {
1390 return Err(RuleError::Data(DataError::InvalidMaxDataType));
1391 }
1392
1393 return Ok(());
1394
1395}
1396
1397fn check_min(data_type:&str,value:&JsonValue,rule:&JsonValue)->Result<(),RuleError>{
1398
1399 if data_type == "number"{
1400 let r;
1401 if value.as_u64().is_some() && rule.as_u64().is_some(){
1402 r = value.as_u64().unwrap() < rule.as_u64().unwrap();
1403 } else
1404 if value.as_i64().is_some() && rule.as_i64().is_some(){
1405 r = value.as_i64().unwrap() < rule.as_i64().unwrap();
1406 } else
1407 if value.as_f64().is_some() && rule.as_f64().is_some(){
1408 r = value.as_f64().unwrap() < rule.as_f64().unwrap();
1409 } else {
1410 return Err(RuleError::Data(DataError::InvalidMinNum));
1411 }
1412 if r{return Err(RuleError::Data(DataError::Max));}
1413 return Ok(());
1414 }
1415
1416 if !rule.as_u64().is_some(){
1417 return Err(RuleError::Data(DataError::InvalidMin));
1418 }
1419
1420 let min = rule.as_u64().unwrap();
1421 if data_type == "string"{
1422 let v = value.as_str().unwrap();
1423 if (v.len() as u64) < min{return Err(RuleError::Data(DataError::Min));}
1424 } else if data_type == "array"{
1425 if (value.len() as u64) < min{return Err(RuleError::Data(DataError::Min));}
1426 } else if data_type == "object"{
1427 if (value.len() as u64) < min{return Err(RuleError::Data(DataError::Min));}
1428 } else {
1429 return Err(RuleError::Data(DataError::InvalidMinDataType));
1430 }
1431
1432 return Ok(());
1433
1434}
1435
1436fn check_rule_data_type(rule:&JsonValue,value:&JsonValue,field:&JsonValue)->Result<(),RuleError>{
1437
1438 if !rule.is_string(){
1439 return Err(RuleError::Format(FormatError::InvalidDataType));
1440 }
1441
1442 let rule_data_type = rule.as_str().unwrap();
1443
1444 if
1445 rule_data_type != "any" &&
1446 rule_data_type != "bool" &&
1447 rule_data_type != "string" &&
1448 rule_data_type != "number" &&
1449 rule_data_type != "object" &&
1450 rule_data_type != "array" &&
1451 rule_data_type != "email"
1452 {
1453 return Err(RuleError::Format(FormatError::InvalidDataType));
1454 }
1455
1456 if rule_data_type == "any"{
1457 return Ok(());
1458 }
1459
1460 let value_data_type;
1461 if value.is_string(){value_data_type = "string";} else
1462 if value.is_number(){value_data_type = "number";} else
1463 if value.is_object(){value_data_type = "object";} else
1464 if value.is_array(){value_data_type = "array";} else
1465 if value.is_boolean() {value_data_type = "bool";} else {
1466 return Err(RuleError::Data(DataError::UnSupportedData));
1467 }
1468
1469 if rule_data_type == "email" && value_data_type == "string"{
1470 return Ok(());
1471 }
1472
1473 if rule_data_type != value_data_type{
1474 return Err(RuleError::Data(DataError::InvalidDataType));
1475 }
1476
1477 if rule_data_type == "number" && field["int"].is_string(){
1478 let int_t = field["int"].as_str().unwrap();
1479 if
1480 int_t == "u8" && value.as_u8().is_none() ||
1481 int_t == "u16" && value.as_u16().is_none() ||
1482 int_t == "u32" && value.as_u32().is_none() ||
1483 int_t == "u64" && value.as_u64().is_none() ||
1484
1485 int_t == "i8" && value.as_i8().is_none() ||
1486 int_t == "i16" && value.as_i16().is_none() ||
1487 int_t == "i32" && value.as_i32().is_none() ||
1488 int_t == "i64" && value.as_i64().is_none() ||
1489
1490 int_t == "f64" && value.as_f64().is_none()
1491 {
1492 return Err(RuleError::Data(DataError::InvalidNum));
1493 }
1494 }
1495
1496 return Ok(());
1497
1498}
1499
1500fn get_json_value_data_type(value:&JsonValue)->Result<&'static str,RuleError>{
1501 let value_data_type;
1502 if value.is_string(){value_data_type = "string";} else
1503 if value.is_number(){value_data_type = "number";} else
1504 if value.is_object(){value_data_type = "object";} else
1505 if value.is_array(){value_data_type = "array";} else
1506 if value.is_boolean() {value_data_type = "bool";} else {
1507 return Err(RuleError::Data(DataError::UnSupportedData));
1508 }
1509 Ok(value_data_type)
1510}