use pleme_error::{ServiceError, Result};
use uuid::Uuid;
#[derive(Debug)]
struct User {
id: Uuid,
email: String,
}
fn find_user(id: Uuid) -> Result<User> {
Err(ServiceError::not_found("User", id))
}
fn validate_email(email: &str) -> Result<()> {
if !email.contains('@') {
return Err(ServiceError::invalid_field("email", "Must contain @"));
}
if email.len() < 3 {
return Err(ServiceError::invalid_field("email", "Too short"));
}
Ok(())
}
fn cancel_order(order_status: &str) -> Result<()> {
if order_status == "shipped" {
return Err(ServiceError::BusinessRule(
"Cannot cancel shipped orders".to_string()
));
}
Ok(())
}
fn register_user(email: String) -> Result<User> {
validate_email(&email)?;
let user = User {
id: Uuid::new_v4(),
email,
};
Ok(user) }
fn handle_with_retry(error: ServiceError) {
if error.is_retryable() {
println!("Error is retryable: {}", error);
println!("Implementing exponential backoff...");
} else {
println!("Error is not retryable: {}", error);
println!("Failing fast.");
}
}
fn log_error_appropriately(error: ServiceError) {
if error.is_severe() {
eprintln!("SEVERE: {}", error);
} else {
println!("Expected error: {}", error);
}
}
fn main() {
println!("=== Basic pleme-error Examples ===\n");
println!("1. Not Found Error:");
let user_id = Uuid::new_v4();
match find_user(user_id) {
Ok(_) => println!("User found!"),
Err(e) => println!("Error: {}", e),
}
println!();
println!("2. Invalid Input Error:");
match validate_email("invalid") {
Ok(_) => println!("Email is valid!"),
Err(e) => println!("Error: {}", e),
}
println!();
println!("3. Business Rule Violation:");
match cancel_order("shipped") {
Ok(_) => println!("Order cancelled!"),
Err(e) => println!("Error: {}", e),
}
println!();
println!("4. Railway-Oriented Programming:");
match register_user("invalid".to_string()) {
Ok(user) => println!("User registered: {:?}", user),
Err(e) => println!("Registration failed: {}", e),
}
println!();
println!("5. Error Retryability:");
let db_error = ServiceError::database_msg("Connection timeout");
handle_with_retry(db_error);
let not_found = ServiceError::not_found("User", "123");
handle_with_retry(not_found);
println!();
println!("6. Error Severity:");
let severe = ServiceError::internal_msg("Panic in worker thread");
log_error_appropriately(severe);
let expected = ServiceError::not_found("User", "123");
log_error_appropriately(expected);
}