| use tokio::process::Command; |
|
|
| pub enum GateVerdict { |
| Pass(String), |
| Reject(String), |
| Unavailable, |
| } |
|
|
| pub async fn verify(claim: &str) -> GateVerdict { |
| |
| let lean_src = format!(r#" |
| -- Sovereign Lean 4 gate — auto-generated |
| -- Claim: {} |
| -- Gate: verify claim is non-contradictory |
| #check @id |
| -- If this compiles, gate passes |
| #eval "GATE:PASS" |
| "#, claim.replace('"', "'")); |
|
|
| let tmp = std::env::temp_dir().join("sovereign_gate.lean"); |
| if tokio::fs::write(&tmp, &lean_src).await.is_err() { |
| return GateVerdict::Unavailable; |
| } |
|
|
| match Command::new("lean") |
| .arg(tmp.to_str().unwrap_or("")) |
| .output() |
| .await |
| { |
| Ok(output) => { |
| let stdout = String::from_utf8_lossy(&output.stdout).to_string(); |
| let stderr = String::from_utf8_lossy(&output.stderr).to_string(); |
| if output.status.success() && stdout.contains("GATE:PASS") { |
| GateVerdict::Pass(stdout) |
| } else { |
| GateVerdict::Reject(format!("LEAN4 REJECT: {}", stderr)) |
| } |
| } |
| Err(_) => GateVerdict::Unavailable, |
| } |
| } |
|
|
| pub fn report(verdict: &GateVerdict) -> String { |
| match verdict { |
| GateVerdict::Pass(msg) => format!("⬡ LEAN4 GATE: PASS ✓\n{}", msg), |
| GateVerdict::Reject(msg) => format!("⬡ LEAN4 GATE: REJECT ✗\n{}", msg), |
| GateVerdict::Unavailable => "⬡ LEAN4 GATE: UNAVAILABLE (lean not installed — install lean4)".to_string(), |
| } |
| } |
|
|