use double_o::pattern::parse_pattern_str;
use double_o::{CommandOutput, classify};
fn main() {
let toml_pattern = r#"
# Pattern for a hypothetical "myapp test" command
command_match = "^myapp test"
[success]
pattern = '(?P<passed>\d+) tests passed, (?P<failed>\d+) failed'
summary = "{passed} passed, {failed} failed"
[failure]
strategy = "tail"
lines = 20
"#;
let custom_pattern = match parse_pattern_str(toml_pattern) {
Ok(pat) => {
println!("✓ Successfully parsed custom pattern");
pat
}
Err(e) => {
eprintln!("✗ Failed to parse pattern: {}", e);
return;
}
};
let success_output = CommandOutput {
stdout: br"Running test suite...
Test 1... OK
Test 2... OK
Test 3... OK
Result: 42 tests passed, 0 failed
Total time: 2.5s"
.to_vec(),
stderr: Vec::new(),
exit_code: 0,
};
let patterns = vec![custom_pattern];
let classification = classify(&success_output, "myapp test --verbose", &patterns);
println!("\n✓ Success classification:");
match &classification {
double_o::Classification::Success { label, summary } => {
println!(" Label: {}", label);
println!(" Summary: {}", summary);
}
_ => println!(" Unexpected classification type"),
}
let failure_output = CommandOutput {
stdout: br"Running test suite...".to_vec(),
stderr: br"Test 1... OK
Test 2... FAILED
Error: assertion failed at line 42
Test 3... FAILED
Error: timeout after 5s
Test 4... FAILED
Error: connection refused
Test 5... OK
...
[100 more lines of test output]
Test 105... FAILED
Error: stack overflow
Result: 50 tests passed, 55 failed"
.to_vec(),
exit_code: 1,
};
let fail_classification = classify(&failure_output, "myapp test", &patterns);
println!("\n✓ Failure classification:");
match &fail_classification {
double_o::Classification::Failure { label, output } => {
println!(" Label: {}", label);
println!(" Filtered output (last 20 lines):\n{}", output);
}
_ => println!(" Unexpected classification type"),
}
let grep_pattern = r#"
command_match = "^myapp build"
[success]
pattern = 'Build complete'
summary = "build succeeded"
[failure]
strategy = "grep"
grep = "Error:"
"#;
if let Ok(pat) = parse_pattern_str(grep_pattern) {
let build_output = CommandOutput {
stdout: Vec::new(),
stderr: br"Compiling module A...
Compiling module B...
Warning: deprecated feature used
Compiling module C...
Error: undefined symbol 'foo'
Error: type mismatch at line 42
Build failed"
.to_vec(),
exit_code: 1,
};
let build_classification = classify(&build_output, "myapp build", &[pat]);
println!("\n✓ Failure classification with grep strategy:");
match &build_classification {
double_o::Classification::Failure { label, output } => {
println!(" Label: {}", label);
println!(" Filtered output (only Error: lines):\n{}", output);
}
_ => println!(" Unexpected classification type"),
}
}
}