sigil-stitch 0.3.0

Type-safe, import-aware, width-aware code generation for multiple languages
Documentation
use sigil_stitch::code_block::CodeBlock;
use sigil_stitch::spec::file_spec::FileSpec;
use sigil_stitch::spec::fun_spec::FunSpec;
use sigil_stitch::type_name::TypeName;

use super::golden;

#[test]
fn test_function_spec() {
    let mut body_b = CodeBlock::builder();
    body_b.add("local name=$1\n", ());
    body_b.add_statement("echo \"Hello, $name\"", ());
    let body = body_b.build().unwrap();

    let fun = FunSpec::builder("greet").body(body).build().unwrap();

    let file = FileSpec::builder("funcs.bash")
        .add_function(fun)
        .build()
        .unwrap();

    let output = file.render(80).unwrap();
    golden::assert_golden("bash/function_spec.bash", &output);
}

#[test]
fn test_complete_script() {
    let utils_fn = TypeName::importable("./lib/utils.sh", "log_info");

    let mut header_b = CodeBlock::builder();
    header_b.add("#!/usr/bin/env bash\n", ());
    header_b.add("set -euo pipefail", ());
    let header = header_b.build().unwrap();

    // Function
    let mut fun_body = CodeBlock::builder();
    fun_body.add("local target=$1\n", ());
    fun_body.add("if [ -z \"$target\" ]; then\n", ());
    fun_body.add("%>", ());
    fun_body.add_statement("echo \"error: no target\"", ());
    fun_body.add_statement("return 1", ());
    fun_body.add("%<", ());
    fun_body.add("fi\n", ());
    fun_body.add_statement("%T \"deploying to $target\"", (utils_fn,));
    let fun_body = fun_body.build().unwrap();

    let fun = FunSpec::builder("deploy").body(fun_body).build().unwrap();

    // Main body
    let mut main = CodeBlock::builder();
    main.add_statement("deploy \"$@\"", ());
    let main = main.build().unwrap();

    let file = FileSpec::builder("deploy.bash")
        .header(header)
        .add_function(fun)
        .add_code(main)
        .build()
        .unwrap();

    let output = file.render(80).unwrap();
    golden::assert_golden("bash/complete_script.bash", &output);
}

#[test]
fn test_function_with_doc() {
    let body = CodeBlock::of("echo \"Hello, $1!\"", ()).unwrap();
    let fun = FunSpec::builder("greet")
        .doc("Greet the user by name.")
        .body(body)
        .build()
        .unwrap();

    let file = FileSpec::builder("greet.bash")
        .add_function(fun)
        .build()
        .unwrap();
    let output = file.render(80).unwrap();

    golden::assert_golden("bash/function_with_doc.bash", &output);
}