greentic-x 0.4.13

Greentic-X CLI for catalog-driven composition, scaffolding, validation, and simulation.
Documentation
use serde_json::Value;

use crate::WizardAnswerDocument;

pub(crate) const GREENTIC_DEV_LAUNCHER_WIZARD_ID: &str = "greentic-dev.wizard.launcher.main";
pub(crate) const GREENTIC_DEV_LAUNCHER_SCHEMA_ID: &str = "greentic-dev.launcher.main";
pub(crate) const GREENTIC_DEV_LAUNCHER_SELECTED_ACTION_BUNDLE: &str = "bundle";

pub(crate) fn build_bundle_launcher_document(
    locale: &str,
    schema_version: &str,
    delegated_answer_document: &WizardAnswerDocument,
) -> Result<WizardAnswerDocument, String> {
    let delegated = serde_json::to_value(delegated_answer_document)
        .map_err(|err| format!("failed to encode delegated answer document: {err}"))?;
    let answers = serde_json::Map::from_iter([
        (
            "selected_action".to_owned(),
            Value::String(GREENTIC_DEV_LAUNCHER_SELECTED_ACTION_BUNDLE.to_owned()),
        ),
        ("delegate_answer_document".to_owned(), delegated),
    ]);
    Ok(WizardAnswerDocument {
        wizard_id: GREENTIC_DEV_LAUNCHER_WIZARD_ID.to_owned(),
        schema_id: GREENTIC_DEV_LAUNCHER_SCHEMA_ID.to_owned(),
        schema_version: schema_version.to_owned(),
        locale: locale.to_owned(),
        answers,
        locks: serde_json::Map::new(),
    })
}

#[cfg(test)]
mod tests {
    use super::*;
    use serde_json::json;

    #[test]
    fn builds_greentic_dev_launcher_document_for_bundle_delegate() {
        let delegated = WizardAnswerDocument {
            wizard_id: "greentic-bundle.wizard.run".to_owned(),
            schema_id: "greentic-bundle.wizard.answers".to_owned(),
            schema_version: "1.0.0".to_owned(),
            locale: "en".to_owned(),
            answers: serde_json::Map::from_iter([(
                "solution_id".to_owned(),
                Value::String("demo".to_owned()),
            )]),
            locks: serde_json::Map::new(),
        };

        let launcher = build_bundle_launcher_document("en", "1.0.0", &delegated).expect("launcher");

        assert_eq!(launcher.wizard_id, GREENTIC_DEV_LAUNCHER_WIZARD_ID);
        assert_eq!(launcher.schema_id, GREENTIC_DEV_LAUNCHER_SCHEMA_ID);
        assert_eq!(
            launcher.answers["selected_action"],
            GREENTIC_DEV_LAUNCHER_SELECTED_ACTION_BUNDLE
        );
        assert_eq!(
            launcher.answers["delegate_answer_document"],
            json!({
                "wizard_id": "greentic-bundle.wizard.run",
                "schema_id": "greentic-bundle.wizard.answers",
                "schema_version": "1.0.0",
                "locale": "en",
                "answers": {
                    "solution_id": "demo"
                },
                "locks": {}
            })
        );
    }
}