1use snafu::Whatever;
2
3use crate::schema::{TypeInclude, r#ref::Ref, TypeRef};
4
5impl TypeInclude<serde_json::Value> for Ref {
6 fn include(&self, v: &serde_json::Value) -> Result<(), Whatever> {
7 self.target.include(v)
8 }
9}
10
11impl TypeInclude<serde_json::Value> for TypeRef {
12 fn include(&self, v: &serde_json::Value) -> Result<(), Whatever> {
13 match self {
14 TypeRef::Any(t) => {
15 t.any_.upgrade().unwrap().borrow().include(v)
16 },
17 TypeRef::Nil(t) => {
18 t.nil_.upgrade().unwrap().borrow().include(v)
19 },
20 TypeRef::Builtin(t) => {
21 t.builtin_.upgrade().unwrap().borrow().include(v)
22 },
23 TypeRef::Ref(t) => {
24 t.ref_.upgrade().unwrap().borrow().include(v)
25 },
26 TypeRef::Seq(t) => {
27 t.seq_.upgrade().unwrap().borrow().include(v)
28 },
29 TypeRef::Set(t) => {
30 t.set_.upgrade().unwrap().borrow().include(v)
31 },
32 TypeRef::Union(t) => {
33 t.union_.upgrade().unwrap().borrow().include(v)
34 },
35 TypeRef::Struct(t) => {
36 t.struct_.upgrade().unwrap().borrow().include(v)
37 },
38 TypeRef::Sub(t) => {
39 t.sub_.upgrade().unwrap().borrow().include(v)
40 },
41 TypeRef::Tuple(t) => {
42 t.tuple_.upgrade().unwrap().borrow().include(v)
43 },
44 TypeRef::Relation(t) => {
45 t.relation_.upgrade().unwrap().borrow().include(v)
46 },
47 TypeRef::Unresolved { name: _, position: _ } => todo!(),
48 }
49 }
50}
51
52
53#[cfg(test)]
54use crate::schema::{builtin::Builtin, r#type::Type};
55#[test]
56fn test_include_builtin() {
57 use crate::common::FilePosition;
58
59 let position = FilePosition { line: 2, column: 2};
60
61 let str = Ref {
62 position: position.clone(),
63 target: Type::Builtin(Builtin {
64 position: position.clone(),
65 target: String::from("String")
66 })
67 };
68
69 let nil = serde_json::Value::Null {};
70 assert_eq!(str.include(&nil).is_ok(), false);
71
72 let number = serde_json::json!(12);
73 assert_eq!(str.include(&number).is_ok(), false);
74
75 let string = serde_json::json!("foo");
76 assert_eq!(str.include(&string).is_ok(), true);
77
78 let obj = serde_json::json!({});
79 assert_eq!(str.include(&obj).is_ok(), false);
80
81 let arr = serde_json::json!([]);
82 assert_eq!(str.include(&arr).is_ok(), false);
83}