validation_usage/
validation_usage.rs

1//! Template validation example showing linting and quality checks.
2//!
3//! This example demonstrates how to use the validation system to check
4//! template quality, catch common errors, and enforce best practices.
5
6use tron::{TronTemplate, TronRef, Result};
7use tron::validation::{TemplateValidator, ValidationConfig, Severity, IssueCategory};
8
9fn main() -> Result<()> {
10    println!("=== Tron Template Validation Example ===\n");
11
12    // Example 1: Basic validation
13    example_basic_validation()?;
14    
15    // Example 2: Validation with issues
16    example_validation_with_issues()?;
17    
18    // Example 3: Custom validation configuration
19    example_custom_validation()?;
20    
21    // Example 4: Security validation
22    example_security_validation()?;
23    
24    // Example 5: Multiple template validation
25    example_multiple_template_validation()?;
26
27    Ok(())
28}
29
30fn example_basic_validation() -> Result<()> {
31    println!("1. Basic Template Validation (Good Template):");
32    
33    let template = TronTemplate::new(
34        "fn @[function_name]@(@[parameters]@) -> @[return_type]@ {\n    @[function_body]@\n}"
35    )?;
36    
37    let validator = TemplateValidator::new();
38    let report = validator.validate(&template)?;
39    
40    println!("   Template: fn @[function_name]@(@[parameters]@) -> @[return_type]@ {{ @[function_body]@ }}");
41    println!("   {}", report);
42    
43    Ok(())
44}
45
46fn example_validation_with_issues() -> Result<()> {
47    println!("2. Validation with Issues:");
48    
49    // Template with several issues
50    let template = TronTemplate::new(
51        "fn @[n]@() { @[x]@; }   \nlet @[a]@ = @[b]@;    "
52    )?;
53    
54    let validator = TemplateValidator::new();
55    let report = validator.validate(&template)?;
56    
57    println!("   Template with issues:");
58    println!("   {}", report);
59    
60    // Show issue breakdown
61    let errors = report.issues_by_severity(Severity::Error);
62    let warnings = report.issues_by_severity(Severity::Warning);
63    let info = report.issues_by_severity(Severity::Info);
64    
65    println!("   Breakdown: {} errors, {} warnings, {} info", 
66        errors.len(), warnings.len(), info.len());
67    
68    Ok(())
69}
70
71fn example_custom_validation() -> Result<()> {
72    println!("3. Custom Validation Configuration:");
73    
74    // Create custom validation config
75    let mut config = ValidationConfig::default();
76    config.min_placeholder_length = 5; // Require longer placeholder names
77    config.check_placeholder_naming = true;
78    config.check_security = false; // Skip security checks for this example
79    config.check_performance = true;
80    
81    let template = TronTemplate::new("Hello @[name]@! Your @[age]@ is recorded.")?;
82    
83    let validator = TemplateValidator::with_config(config);
84    let report = validator.validate(&template)?;
85    
86    println!("   Custom config (min_placeholder_length = 5):");
87    println!("   Template: Hello @[name]@! Your @[age]@ is recorded.");
88    println!("   {}", report);
89    
90    Ok(())
91}
92
93fn example_security_validation() -> Result<()> {
94    println!("4. Security Validation:");
95    
96    // Template with potential security issues
97    let template = TronTemplate::new(
98        r#"
99function processData() {
100    eval(@[user_code]@);
101    var password = "@[user_password]@";
102    return "<script>alert('XSS');</script>";
103}
104"#
105    )?;
106    
107    let validator = TemplateValidator::new();
108    let report = validator.validate(&template)?;
109    
110    println!("   Template with security concerns:");
111    println!("   {}", report);
112    
113    // Show only security issues
114    let security_issues = report.issues_by_category(&IssueCategory::Security);
115    if !security_issues.is_empty() {
116        println!("   Security-specific issues:");
117        for (i, issue) in security_issues.iter().enumerate() {
118            println!("     {}. {}", i + 1, issue.message());
119            if let Some(suggestion) = issue.suggestion() {
120                println!("        Suggestion: {}", suggestion);
121            }
122        }
123    }
124    
125    Ok(())
126}
127
128fn example_multiple_template_validation() -> Result<()> {
129    println!("5. Multiple Template Validation:");
130    
131    let templates = vec![
132        TronTemplate::new("fn @[function_name]@(@[params]@) -> @[return_type]@ { @[body]@ }")?,
133        TronTemplate::new("struct @[n]@ { @[f]@ }")?,  // Short placeholder names
134        TronTemplate::new("Hello @[user_name]@! Welcome to @[application_name]@.")?,  // Good template
135        TronTemplate::new("const @[C]@ = @[value]@;")?,  // Uppercase in placeholder
136    ];
137    
138    let validator = TemplateValidator::new();
139    
140    // Validate each template and collect results
141    for (index, template) in templates.iter().enumerate() {
142        let report = validator.validate(template)?;
143        
144        println!("   Template #{}: {} issue(s)", 
145            index + 1, 
146            report.issues().len()
147        );
148        
149        if report.has_issues() {
150            // Show first few issues
151            for issue in report.issues().iter().take(2) {
152                println!("     - [{}] {}: {}", 
153                    issue.severity(), 
154                    issue.category(),
155                    issue.message()
156                );
157            }
158            if report.issues().len() > 2 {
159                println!("     ... and {} more", report.issues().len() - 2);
160            }
161        } else {
162            println!("     ✓ No issues found");
163        }
164        println!();
165    }
166    
167    // Demonstrate template reference validation
168    println!("   Template Reference Validation:");
169    let template = TronTemplate::new("fn main() { @[body]@ }")?;
170    let template_ref = TronRef::new(template)
171        .with_dependency("unsafe_crate = \"0.1\"");
172    
173    let report = validator.validate_ref(&template_ref)?;
174    println!("   TronRef validation: {} issue(s)", report.issues().len());
175    
176    Ok(())
177}