use err_mac::create_err_with_impls;
use std::fs;
#[derive(Debug)]
struct ValidationError {
field: String,
message: String,
}
#[derive(Debug)]
struct DatabaseError {
code: i32,
message: String,
}
create_err_with_impls!(
#[derive(Debug)]
pub ApplicationError,
NotFound,
Unauthorized,
Validation(ValidationError),
Database(DatabaseError),
Io(std::io::Error),
;
InvalidConfig {
setting: String,
allowed_values: Vec<String>
}
);
fn validate_user_input(input: &str) -> Result<(), ValidationError> {
if input.is_empty() {
return Err(ValidationError {
field: "user_input".to_string(),
message: "Input cannot be empty".to_string(),
});
}
Ok(())
}
fn query_database(id: i32) -> Result<(), DatabaseError> {
if id < 0 {
return Err(DatabaseError {
code: 400,
message: "Invalid ID".to_string(),
});
}
Ok(())
}
fn process_user_request(user_input: &str, user_id: i32) -> Result<(), ApplicationError> {
validate_user_input(user_input)?;
query_database(user_id)?;
fs::read_to_string("config.txt")?;
if user_id > 1000 {
return Err(ApplicationError::InvalidConfig {
setting: "user_id".to_string(),
allowed_values: vec!["0-1000".to_string()],
});
}
Ok(())
}
fn main() {
match process_user_request("", 1001) {
Ok(()) => println!("Request processed successfully"),
Err(e) => println!("Error processing request: {}", e),
}
}