meow-meow-script 0.6.0

A host-neutral parser, runtime, and evaluator for Meow Meow Script
Documentation
use meow_meow_script::{
    ComponentSpec, HostApiSpec, HostCapabilities, JsonLinesHost, Runtime, ValueSignature,
    ValueType,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let runtime = configured_runtime()?;
    let host = JsonLinesHost::new(Vec::new(), configured_capabilities());
    let mut session = runtime.session(host)?;

    session.eval(
        r#"
        button.new("save") {
            label = "Save"
        }

        audit.write("button emitted")
        "#,
    )?;

    let bytes = session.host_mut().into_inner_ref();
    print!("{}", String::from_utf8_lossy(bytes));

    Ok(())
}

fn configured_runtime() -> Result<Runtime, Box<dyn std::error::Error>> {
    let mut builder = Runtime::builder();
    builder.register_component(
        ComponentSpec::new("Button")
            .alias("button")
            .constructor(
                "new",
                ValueSignature::new(vec![ValueType::String], ValueType::Component),
            )
            .property("label", ValueType::String)
            .method("click", ValueSignature::new(vec![], ValueType::Null)),
    )?;
    builder.register_host_api(
        HostApiSpec::method(
            "audit",
            "write",
            ValueSignature::new(vec![ValueType::String], ValueType::Null),
        )
        .requires("audit.write"),
    )?;
    Ok(builder.build())
}

fn configured_capabilities() -> HostCapabilities {
    HostCapabilities::default()
        .supports_component("Button")
        .supports_api("audit.write")
}