textfsm-rust 0.3.1

Template-based state machine for parsing semi-formatted text based on Google's TextFSM
Documentation
//! Example: Compile-time template validation
//!
//! This example demonstrates how to use the `validate_template!` and
//! `validate_templates!` macros to catch template errors at compile time.
//!
//! Run with: cargo run --example compile_time_validation

use textfsm_rust::{validate_template, validate_templates, Template};

// Validate a single template at compile time.
// If the template is invalid, you'll get a compile error with details.
validate_template!("templates/simple.textfsm");

// Validate all .textfsm files in a directory at compile time.
// Any invalid template will cause a compile error.
validate_templates!("templates/");

fn main() {
    // The macros above run at compile time and produce no runtime code.
    // They just ensure your templates are valid before your program runs.

    // At runtime, you still need to parse the template when you want to use it.
    // You can use include_str! to embed the template content:
    let template_str = include_str!("../templates/simple.textfsm");
    let template = Template::parse_str(template_str).expect("already validated at compile time");

    // Now use the template to parse some input
    let mut parser = template.parser();

    let input = r#"
Name: Alice, Age: 30
Name: Bob, Age: 25
Name: Charlie, Age: 35
"#;

    let results = parser.parse_text(input).unwrap();

    // Print the results
    println!("Parsed {} records:", results.len());
    println!();

    for (i, record) in results.iter().enumerate() {
        println!("Record {}:", i + 1);
        for (j, value) in record.iter().enumerate() {
            let header = template.header()[j];
            println!("  {}: {}", header, value.as_string());
        }
        println!();
    }
}