use crate::formal::semantics::{posix_semantics, rash_semantics};
use crate::formal::{AbstractState, FormalEmitter, TinyAst};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerificationReport {
pub ast: TinyAst,
pub emitted_code: String,
pub initial_state: AbstractState,
pub annotated_ast: AnnotatedAst,
pub rash_trace: ExecutionTrace,
pub posix_trace: ExecutionTrace,
pub equivalence_analysis: EquivalenceAnalysis,
pub emitter_justifications: Vec<EmitterJustification>,
pub verification_result: VerificationResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnnotatedAst {
pub node: TinyAst,
pub precondition: AbstractState,
pub postcondition: AbstractState,
pub transformation: StateTransformation,
pub children: Vec<AnnotatedAst>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StateTransformation {
pub env_changes: HashMap<String, EnvChange>,
pub cwd_change: Option<CwdChange>,
pub fs_changes: Vec<FilesystemChange>,
pub output_produced: Vec<String>,
pub errors_produced: Vec<String>,
pub exit_code_change: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EnvChange {
Added {
value: String,
},
Modified {
old_value: String,
new_value: String,
},
Removed {
old_value: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CwdChange {
pub from: String,
pub to: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum FilesystemChange {
DirectoryCreated { path: String },
FileCreated { path: String, content: String },
ItemRemoved { path: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionTrace {
pub initial_state: AbstractState,
pub steps: Vec<ExecutionStep>,
pub final_state: AbstractState,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionStep {
pub step_number: usize,
pub operation: String,
pub state_before: AbstractState,
pub state_after: AbstractState,
pub errors: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EquivalenceAnalysis {
pub are_equivalent: bool,
pub env_comparison: EnvComparison,
pub cwd_comparison: CwdComparison,
pub fs_comparison: FilesystemComparison,
pub output_comparison: OutputComparison,
pub exit_code_comparison: ExitCodeComparison,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvComparison {
pub matches: bool,
pub rash_only: HashMap<String, String>,
pub posix_only: HashMap<String, String>,
pub different_values: HashMap<String, (String, String)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CwdComparison {
pub matches: bool,
pub rash_cwd: String,
pub posix_cwd: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilesystemComparison {
pub matches: bool,
pub differences: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OutputComparison {
pub stdout_matches: bool,
pub stderr_matches: bool,
pub rash_stdout: Vec<String>,
pub posix_stdout: Vec<String>,
pub rash_stderr: Vec<String>,
pub posix_stderr: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExitCodeComparison {
pub matches: bool,
pub rash_exit_code: i32,
pub posix_exit_code: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmitterJustification {
pub ast_node: String,
pub generated_code: String,
pub reasoning: String,
pub considerations: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum VerificationResult {
Success { confidence: f64 },
Failure { reasons: Vec<String> },
Partial { issues: Vec<String> },
}
pub struct ProofInspector;
include!("inspector_proofinspector.rs");