schematic 0.19.7

A layered serde configuration and schema library.
Documentation
#![allow(dead_code)]

use schematic::*;

#[derive(Debug, Config)]
pub struct NestedConfig {
    setting: bool,
}

#[derive(Debug, Config)]
pub struct BaseConfig {
    setting: bool,
    #[setting(nested)]
    nested: NestedConfig,
}

fn strip_ansi(s: &str) -> String {
    String::from_utf8(strip_ansi_escapes::strip(s)).unwrap()
}

#[cfg(feature = "json")]
mod json {
    use super::*;

    #[test]
    fn invalid_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code(r#"{ "setting": 123 }"#, "code.json")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. setting: invalid type: integer `123`, expected a boolean at line 1 column 16"
        )
    }

    #[test]
    fn invalid_nested_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code(r#"{ "nested": { "setting": 123 } }"#, "code.json")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. nested.setting: invalid type: integer `123`, expected a boolean at line 1 column 28"
        )
    }
}

#[cfg(feature = "pkl")]
mod pkl {
    use super::*;
    use starbase_sandbox::{locate_fixture, predicates::prelude::*};

    #[test]
    fn invalid_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .file(locate_fixture("pkl").join("invalid-type.pkl"))
            .unwrap()
            .load()
            .err()
            .unwrap();

        let error_str = strip_ansi(&error.to_full_string());
        println!("{}", error_str);

        assert!(
            predicate::str::contains("setting: invalid type: integer `123`, expected a boolean")
                .eval(&error_str)
        )
    }

    #[test]
    fn invalid_nested_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .file(locate_fixture("pkl").join("invalid-nested-type.pkl"))
            .unwrap()
            .load()
            .err()
            .unwrap();

        let error_str = strip_ansi(&error.to_full_string());
        println!("{}", error_str);

        assert!(
            predicate::str::contains(
                "nested.setting: invalid type: integer `123`, expected a boolean"
            )
            .eval(&error_str)
        )
    }
}

#[cfg(feature = "toml")]
mod toml {
    use super::*;

    #[test]
    fn invalid_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code("setting = 123", "code.toml")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. setting: invalid type: integer `123`, expected a boolean"
        )
    }

    #[test]
    fn invalid_nested_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code("[nested]\nsetting = 123", "code.toml")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. nested.setting: invalid type: integer `123`, expected a boolean"
        )
    }
}

#[cfg(feature = "yaml")]
mod yaml {
    use super::*;

    #[test]
    fn invalid_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code("---\nsetting: 123", "code.yaml")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. setting: invalid type: integer `123`, expected a boolean"
        )
    }

    #[test]
    fn invalid_nested_type() {
        let error = ConfigLoader::<BaseConfig>::new()
            .code("---\nnested:\n  setting: 123", "code.yaml")
            .unwrap()
            .load()
            .err()
            .unwrap();

        assert_eq!(
            strip_ansi(&error.to_full_string()),
            "Failed to parse BaseConfig. nested.setting: invalid type: integer `123`, expected a boolean"
        )
    }
}