qa-spec 0.5.0

Core QA specification models and validation utilities.
Documentation
use serde_json::{Map, Number, Value};

use crate::spec::form::FormSpec;
use crate::spec::question::{QuestionSpec, QuestionType};
use crate::visibility::VisibilityMap;

pub fn generate(spec: &FormSpec, visibility: &VisibilityMap) -> Value {
    let mut output = Map::new();

    for question in &spec.questions {
        if !visibility.get(&question.id).copied().unwrap_or(true) {
            continue;
        }
        output.insert(question.id.clone(), example_for(question));
    }

    Value::Object(output)
}

fn example_for(question: &QuestionSpec) -> Value {
    if let Some(default_value) = &question.default_value {
        return Value::String(default_value.clone());
    }

    match question.kind {
        QuestionType::String | QuestionType::Enum => {
            Value::String(format!("example-{}", question.id))
        }
        QuestionType::Boolean => Value::Bool(false),
        QuestionType::Integer => Value::Number(Number::from(1)),
        QuestionType::Number => {
            Value::Number(Number::from_f64(1.0).unwrap_or_else(|| Number::from(1)))
        }
        QuestionType::List => Value::Array(Vec::new()),
    }
}