use elicitation::contracts::{And, Established, Implies, Prop, Refines, both};
struct EmailFormatValid;
struct EmailExists;
struct EmailConfirmed;
struct UserProfileCreated;
impl Prop for EmailFormatValid {}
impl Prop for EmailExists {}
impl Prop for EmailConfirmed {}
impl Prop for UserProfileCreated {}
impl Implies<EmailFormatValid> for EmailExists {}
impl Implies<EmailExists> for EmailConfirmed {}
struct _ValidatedEmail(String);
struct _ConfirmedEmail(String);
impl Refines<String> for _ValidatedEmail {}
impl Refines<String> for _ConfirmedEmail {}
impl Refines<_ValidatedEmail> for _ConfirmedEmail {}
fn validate_email_format(email: &str) -> Result<Established<EmailFormatValid>, String> {
if !email.contains('@') {
return Err("Missing @ symbol".to_string());
}
if !email.contains('.') {
return Err("Missing domain".to_string());
}
println!("✓ Step 1: Email format valid");
Ok(Established::assert())
}
fn check_email_exists(
email: &str,
_format_proof: Established<EmailFormatValid>,
) -> Result<Established<EmailExists>, String> {
if email.starts_with("nonexistent") {
return Err("Email does not exist".to_string());
}
println!("✓ Step 2: Email exists (format was pre-validated)");
Ok(Established::assert())
}
fn send_confirmation_code(
email: &str,
_exists_proof: Established<EmailExists>,
) -> Result<String, String> {
let code = "123456";
println!(
"✓ Step 3: Confirmation code sent to {} (code: {})",
email, code
);
Ok(code.to_string())
}
fn verify_confirmation_code(
_email: &str,
code: &str,
expected_code: &str,
_exists_proof: Established<EmailExists>,
) -> Result<Established<EmailConfirmed>, String> {
if code != expected_code {
return Err("Invalid confirmation code".to_string());
}
println!("✓ Step 4: Email confirmed");
Ok(Established::assert())
}
fn create_user_profile(
email: String,
_confirmed_proof: Established<EmailConfirmed>,
) -> Result<Established<UserProfileCreated>, String> {
println!("✓ Step 5: User profile created for {}", email);
Ok(Established::assert())
}
fn send_welcome_email(email: &str, _proof: Established<And<EmailConfirmed, UserProfileCreated>>) {
println!("✓ Step 6: Welcome email sent to {}", email);
}
fn run_registration_workflow(email: &str) -> Result<(), String> {
println!("=== Starting Registration for {} ===\n", email);
let format_proof = validate_email_format(email)?;
let exists_proof = check_email_exists(email, format_proof)?;
let code = send_confirmation_code(email, exists_proof)?;
let user_code = "123456"; let confirmed_proof = verify_confirmation_code(email, user_code, &code, exists_proof)?;
let profile_proof = create_user_profile(email.to_string(), confirmed_proof)?;
let combined_proof = both(confirmed_proof, profile_proof);
send_welcome_email(email, combined_proof);
Ok(())
}
fn main() {
println!("=== Multi-Step Proof Composition Example ===\n");
match run_registration_workflow("user@example.com") {
Ok(()) => println!("\n✅ Registration completed successfully!\n"),
Err(e) => println!("\n❌ Registration failed: {}\n", e),
}
println!("=== Testing Failure Case: Bad Format ===\n");
match run_registration_workflow("invalid-email") {
Ok(()) => println!("\n✅ Registration completed\n"),
Err(e) => println!("\n❌ Registration failed: {}\n", e),
}
println!("=== Key Insights ===");
println!("1. Each step builds on previous guarantees");
println!("2. Cannot skip validation steps (type-checked)");
println!("3. No redundant validation needed");
println!("4. Implications (EmailExists → EmailFormatValid) tracked by types");
println!("5. Zero runtime cost - all proofs compile away");
println!("\n=== Proof Dependencies ===");
println!("Step 1 (validate) → EmailFormatValid");
println!("Step 2 (exists) → EmailExists (requires EmailFormatValid)");
println!("Step 3 (send code) → uses EmailExists");
println!("Step 4 (verify) → EmailConfirmed (requires EmailExists)");
println!("Step 5 (profile) → UserProfileCreated (requires EmailConfirmed)");
println!("Step 6 (welcome) → requires EmailConfirmed AND UserProfileCreated");
println!("\n=== What the Type System Prevents ===");
println!("✗ Calling check_email_exists() without format validation");
println!("✗ Creating profile without email confirmation");
println!("✗ Sending welcome email without both proofs");
println!("✗ Skipping any step in the workflow");
}