polar-core 0.26.4

Polar core library for oso, an open source policy engine for authorization that’s embedded in your application
Documentation
#[cfg(test)]
mod tests {
    use std::{collections::BTreeMap, sync::Arc};

    use polar_core::{error::*, events::*, rules::*, sources::Source, term, terms::*, value};

    #[test]
    fn serialize_test() {
        let mut kwargs = BTreeMap::new();
        kwargs.insert(Symbol::new("bar"), term!(1));
        let pred = Call {
            name: Symbol("foo".to_owned()),
            args: vec![Term::new_from_test(value!(0))],
            kwargs: Some(kwargs),
        };
        assert_eq!(
            serde_json::to_string(&pred).unwrap(),
            r#"{"name":"foo","args":[{"value":{"Number":{"Integer":0}}}],"kwargs":{"bar":{"value":{"Number":{"Integer":1}}}}}"#
        );
        let event = QueryEvent::ExternalCall {
            call_id: 2,
            instance: Term::new_from_test(Value::String("abc".to_string())),
            attribute: Symbol::new("foo"),
            args: Some(vec![
                Term::new_from_test(value!(0)),
                Term::new_from_test(value!("hello")),
            ]),
            kwargs: None,
        };
        eprintln!("{}", serde_json::to_string(&event).unwrap());
        let term = Term::new_from_test(value!(1));
        eprintln!("{}", serde_json::to_string(&term).unwrap());
        let mut fields = BTreeMap::new();
        fields.insert(Symbol::new("hello"), term!(1234));
        fields.insert(
            Symbol::new("world"),
            Term::new_from_test(Value::String("something".to_owned())),
        );
        let constructor = Call {
            name: Symbol::new("Foo"),
            args: vec![
                term!(1234),
                Term::new_from_test(Value::String("something".to_owned())),
            ],
            kwargs: Some(fields),
        };
        let event = QueryEvent::MakeExternal {
            instance_id: 12345,
            constructor: Term::new_from_test(Value::Call(constructor)),
        };
        eprintln!("{}", serde_json::to_string(&event).unwrap());
        let external = Term::new_from_test(Value::ExternalInstance(ExternalInstance {
            instance_id: 12345,
            constructor: None,
            repr: None,
            class_repr: None,
            class_id: None,
        }));
        let list_of = Term::new_from_test(Value::List(vec![external]));
        eprintln!("{}", serde_json::to_string(&list_of).unwrap());
        let mut fields = BTreeMap::new();
        fields.insert(Symbol::new("foo"), list_of);
        let dict = Term::new_from_test(Value::Dictionary(Dictionary { fields }));
        eprintln!("{}", serde_json::to_string(&dict).unwrap());
        let kind = ParseErrorKind::InvalidTokenCharacter {
            token: "Integer".to_owned(),
            c: 'x',
            loc: 15,
        };
        let e = ParseError {
            kind,
            source: Arc::new(Source::new("CinnabarVinegarInteger")),
        };
        let err = PolarError::from(e);
        eprintln!("{}", serde_json::to_string(&err).unwrap());
        let rule = Rule::new_from_test(
            Symbol::new("foo"),
            vec![],
            Term::new_temporary(Value::Expression(Operation {
                operator: Operator::And,
                args: vec![dict.clone(), dict.clone(), dict],
            })),
        );
        eprintln!("{}", rule);
    }
}