finitio/js/
ref.rs

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}