gust-stdlib 0.2.0

Standard library of reusable Gust state machines (circuit breaker, retry, saga, rate limiter, and more)
Documentation
use gust_lang::{GoCodegen, RustCodegen, parse_program_with_errors};

const FILES: &[&str] = &[
    "request_response.gu",
    "circuit_breaker.gu",
    "saga.gu",
    "retry.gu",
    "rate_limiter.gu",
    "health_check.gu",
];

#[test]
fn stdlib_sources_parse_and_codegen_for_rust_and_go() {
    for file in FILES {
        let source = std::fs::read_to_string(format!(
            "{}{}{}",
            env!("CARGO_MANIFEST_DIR"),
            std::path::MAIN_SEPARATOR,
            file
        ))
        .expect("stdlib file should exist");
        let program = parse_program_with_errors(&source, file).expect("stdlib source should parse");

        let rust_out = RustCodegen::new().generate(&program);
        assert!(
            rust_out.contains("Generated by Gust compiler"),
            "rust codegen failed for {file}"
        );

        let go_out = GoCodegen::new().generate(&program, "stdlibtest");
        assert!(
            go_out.contains("Code generated by Gust compiler"),
            "go codegen failed for {file}"
        );

        if *file == "saga.gu" {
            assert!(source.contains("Compensating("));
            assert!(source.contains("execute_compensate"));
            assert!(source.contains("compensate_next"));
        }
        if *file == "retry.gu" {
            assert!(source.contains("compute_backoff"));
            assert!(source.contains("sleep_ms"));
            assert!(source.contains("state Waiting("));
        }
    }
}