Module closure

Module closure 

Source
Expand description

Custom configuration parser with Fn.

§Example

In the following example we implement a complete HJSON parser.

use plugx_config::{
    ext::{plugx_input::Input, anyhow::anyhow},
    error::Error,
    parser::{Parser, closure::Closure}
};

let parser_fn = |bytes: &[u8]| -> anyhow::Result<Input> {
    deser_hjson::from_slice(bytes).map_err(|error| anyhow!(error))
};

let parser_name = "HJSON";
let parser_format = "hjson";
let parser = Closure::new("HJSNO", "hjson", Box::new(parser_fn));
let bytes = br#"
{
    hello: ["w", "o", "l", "d"]
    foo: {
        bar: {
            baz: Qux
            abc: 3.14
        }
        xyz: false
    }
}
"#;
let parsed = parser.parse(bytes).unwrap();
assert!(
    parsed.as_map().len() == 2 &&
    parsed.as_map().contains_key("foo") &&
    parsed.as_map().contains_key("hello")
);
let foo = parsed.as_map().get("foo").unwrap();
assert!(
    foo.as_map().len() == 2 &&
    foo.as_map().contains_key("bar") &&
    foo.as_map().contains_key("xyz")
);
let bar = foo.as_map().get("bar").unwrap();
assert_eq!(bar.as_map().get("baz").unwrap(), &"Qux".into());
assert_eq!(bar.as_map().get("abc").unwrap(), &3.14.into());
let xyz = foo.as_map().get("xyz").unwrap();
assert_eq!(xyz, &false.into());
let list = ["w", "o", "l", "d"].into();
assert_eq!(parsed.as_map().get("hello").unwrap(), &list);

Structs§

Closure
Builder struct.

Type Aliases§

BoxedParserFn
A |&[u8]| -> Result<Input, ConfigurationParserError> Fn to parse contents.
BoxedValidatorFn
A |&[u8]| -> Option<bool> Fn to validate contents.