schemaui 0.11.0

A Rust library for generating TUI and Web UIs from JSON Schemas for configuration management.
Documentation
use crate::tui::view::components::fields::{error_lines, meta_lines};
use crate::{
    tui::model::{FieldKind, FieldSchema},
    tui::state::FieldState,
};
use ratatui::style::{Color, Modifier};

fn make_field() -> FieldState {
    FieldState::from_schema(FieldSchema {
        name: "test".into(),
        path: vec!["test".into()],
        pointer: "/test".into(),
        title: "Test".into(),
        description: None,
        kind: FieldKind::String,
        required: false,
        default: None,
        metadata: Default::default(),
    })
}

#[test]
fn meta_line_selected_uses_dark_text() {
    let field = make_field();
    let lines = meta_lines(&field, true, 40);
    let span = lines
        .first()
        .and_then(|line| line.spans.first())
        .expect("type span");
    assert_eq!(span.style.fg, Some(Color::Blue));
    assert!(span.style.add_modifier.contains(Modifier::BOLD));
}

#[test]
fn meta_line_unselected_uses_gray() {
    let field = make_field();
    let lines = meta_lines(&field, false, 40);
    let span = lines
        .first()
        .and_then(|line| line.spans.first())
        .expect("type span");
    assert_eq!(span.style.fg, Some(Color::DarkGray));
    assert!(!span.style.add_modifier.contains(Modifier::BOLD));
}

#[test]
fn error_lines_wrap_and_cap_at_three_lines() {
    let mut field = make_field();
    field.set_error(
        "this validation error is intentionally long so the renderer must wrap it across multiple lines without letting the panel grow forever".to_string(),
    );

    let lines = error_lines(&field, 28).expect("error lines");
    assert_eq!(lines.len(), 4, "label + at most 3 wrapped lines");

    let last = lines
        .last()
        .expect("last wrapped line")
        .spans
        .iter()
        .map(|span| span.content.as_ref())
        .collect::<String>();
    assert!(
        last.contains(''),
        "truncated final line should end with ellipsis: {last}"
    );
}