finitio 0.1.0

Finitio data language
Documentation
use snafu::{Whatever, whatever};
use crate::schema::{TypeInclude, builtin::Builtin};

impl TypeInclude<serde_json::Value> for Builtin {
    fn include(&self, v: &serde_json::Value) -> Result<(), Whatever> {
        match self.target.as_str() {
            "Number" => {
                match v {
                    serde_json::Value::Number(_) => Ok(()),
                    v => whatever!("Not a valid builtin Number: {}", v)
                }
            },
            "String" => {
                match v {
                    serde_json::Value::String(_) => Ok(()),
                    v => whatever!("Not a valid builtin String: {}", v)
                }
            },
            "Boolean" => {
                match v {
                    serde_json::Value::Bool(_) => Ok(()),
                    v => whatever!("Not a valid builtin Boolean: {}", v)
                }
            },
            &_ => whatever!("Unsupported builtin type name: {}", self.target)
        }
    }
}


#[cfg(test)]
#[test]
fn test_include_builtin() {
    use crate::common::FilePosition;

    let position = FilePosition { line: 2, column: 2};

    let builtin_str = Builtin {
        position: position.clone(),
        target: String::from("String")
    };

    let nil = serde_json::Value::Null {};
    assert_eq!(builtin_str.include(&nil).is_ok(), false);

    let number = serde_json::json!(12);
    assert_eq!(builtin_str.include(&number).is_ok(), false);

    let string = serde_json::json!("foo");
    assert_eq!(builtin_str.include(&string).is_ok(), true);

    let obj = serde_json::json!({});
    assert_eq!(builtin_str.include(&obj).is_ok(), false);

    let arr = serde_json::json!([]);
    assert_eq!(builtin_str.include(&arr).is_ok(), false);
}