sigil-stitch 0.2.0

Type-safe, import-aware, width-aware code generation for multiple languages
Documentation
mod golden;

use sigil_stitch::code_block::{CodeBlock, StringLitArg};
use sigil_stitch::lang::cpp_lang::CppLang;
use sigil_stitch::spec::file_spec::FileSpec;
use sigil_stitch::type_name::TypeName;

#[test]
fn test_cpp_includes() {
    let cout = TypeName::<CppLang>::importable("iostream", "std::cout");
    let vector = TypeName::<CppLang>::importable("vector", "std::vector");
    let myclass = TypeName::<CppLang>::importable("./myclass.hpp", "MyClass");

    let mut b = CodeBlock::<CppLang>::builder();
    b.add_statement("%T << %S", (cout, StringLitArg("hello".to_string())));
    b.add_statement("%T v", (vector,));
    b.add_statement("%T obj", (myclass,));
    let block = b.build().unwrap();

    let mut fb = FileSpec::builder_with("test.cpp", CppLang::new());
    fb.add_code(block);
    let file = fb.build().unwrap();
    let output = file.render(80).unwrap();

    golden::assert_golden("cpp/includes.cpp", &output);
}

#[test]
fn test_cpp_namespace_wrapping() {
    let mut b = CodeBlock::<CppLang>::builder();
    b.add("int square(int x) {", ());
    b.add_line();
    b.add("%>", ());
    b.add("return x * x;", ());
    b.add_line();
    b.add("%<", ());
    b.add("}", ());
    b.add_line();
    let block = b.build().unwrap();

    let mut fb = FileSpec::builder_with("math.hpp", CppLang::header());
    fb.header(CodeBlock::<CppLang>::of("#pragma once", ()).unwrap());
    fb.add_raw("\nnamespace math {\n");
    fb.add_code(block);
    fb.add_raw("\n} // namespace math\n");
    let file = fb.build().unwrap();
    let output = file.render(80).unwrap();

    golden::assert_golden("cpp/namespace_wrapping.cpp", &output);
}

#[test]
fn test_cpp_control_flow() {
    let mut b = CodeBlock::<CppLang>::builder();
    b.begin_control_flow("if (x > 0)", ());
    b.add_statement("return 1", ());
    b.next_control_flow("else if (x < 0)", ());
    b.add_statement("return -1", ());
    b.next_control_flow("else", ());
    b.add_statement("return 0", ());
    b.end_control_flow();
    let block = b.build().unwrap();

    let mut fb = FileSpec::builder_with("flow.cpp", CppLang::new());
    fb.add_code(block);
    let file = fb.build().unwrap();
    let output = file.render(80).unwrap();

    golden::assert_golden("cpp/control_flow.cpp", &output);
}