standout-render 14.0.0

Styled terminal rendering with templates, themes, and adaptive color support
use minijinja::Environment;

pub fn register_filters(env: &mut Environment<'static>) {
    super::engine::register_filters(env);
}

pub fn register_filters_with_policy(env: &mut Environment<'static>, policy: crate::AmbiguousWidth) {
    super::engine::register_filters_with_policy(env, policy);
}

#[cfg(test)]
mod tests {
    use std::collections::HashMap;

    use standout_bbparser::{TagTransform, UnknownTagBehavior};

    use super::*;

    fn resolve(text: &str) -> String {
        crate::diagnostics::resolve_tags(
            text,
            HashMap::new(),
            TagTransform::Remove,
            UnknownTagBehavior::Strip,
        )
    }

    #[test]
    fn interpolation_claims_no_data_tags_and_verbatim_is_absent() {
        let mut env = crate::template::new_environment();
        register_filters(&mut env);
        let body = "[severity_map]\nnote = \"low\"\n";

        assert!(env
            .render_str("{{ body | verbatim }}", minijinja::context! { body })
            .is_err());
        let plain = env
            .render_str("{{ body }}", minijinja::context! { body })
            .unwrap();

        let _window = crate::diagnostics::begin_capture();
        assert_eq!(resolve(&plain), body);
        assert!(
            crate::diagnostics::unresolved_in_current_window().is_empty(),
            "escaped generated text claims no style tag"
        );
    }

    #[test]
    fn test_deprecated_style_filter_gives_helpful_error() {
        let mut env = crate::template::new_environment();
        register_filters(&mut env);

        env.add_template("test", "{{ value | style('header') }}")
            .unwrap();

        let result = env
            .get_template("test")
            .unwrap()
            .render(minijinja::context! {
                value => "hello"
            });

        assert!(result.is_err());
        let err = result.unwrap_err();
        let err_msg = err.to_string();

        assert!(
            err_msg.contains("style()"),
            "Error should mention the filter name"
        );
        assert!(
            err_msg.contains("style_as") || err_msg.contains("[stylename]"),
            "Error should mention the replacement syntax"
        );
        assert!(
            err_msg.contains("1.0") || err_msg.contains("removed"),
            "Error should indicate this was a breaking change"
        );
    }

    #[test]
    fn policy_aware_registration_reaches_width_filters() {
        let mut env = crate::template::new_environment();
        register_filters_with_policy(&mut env, crate::AmbiguousWidth::Wide);
        assert_eq!(
            env.render_str("{{ '↦≈Δ' | display_width }}", ()).unwrap(),
            "5"
        );
    }
}