#[cfg(feature = "graphql")]
use async_graphql::{EmptySubscription, Object, Schema};
#[cfg(feature = "graphql")]
use pleme_error::{ServiceError, Result};
#[cfg(feature = "graphql")]
use uuid::Uuid;
#[cfg(feature = "graphql")]
#[derive(Debug, Clone)]
struct User {
id: Uuid,
name: String,
email: String,
}
#[cfg(feature = "graphql")]
struct Query;
#[cfg(feature = "graphql")]
#[Object]
impl Query {
async fn user(&self, id: String) -> Result<User> {
Err(ServiceError::not_found("User", id))
}
async fn users(&self, limit: i32) -> Result<Vec<User>> {
if limit < 1 {
return Err(ServiceError::invalid_field(
"limit",
"Must be greater than 0"
));
}
if limit > 100 {
return Err(ServiceError::invalid_field(
"limit",
"Must be 100 or less"
));
}
Ok(vec![])
}
}
#[cfg(feature = "graphql")]
struct Mutation;
#[cfg(feature = "graphql")]
#[Object]
impl Mutation {
async fn update_user(&self, id: String, name: String) -> Result<User> {
Err(ServiceError::Unauthenticated("Login required".to_string()))
}
async fn delete_user(&self, id: String) -> Result<bool> {
Err(ServiceError::PermissionDenied("Admin access required".to_string()))
}
async fn cancel_order(&self, order_id: String) -> Result<bool> {
Err(ServiceError::BusinessRule(
"Cannot cancel shipped orders".to_string()
))
}
}
#[cfg(feature = "graphql")]
#[tokio::main]
async fn main() {
println!("=== GraphQL Error Conversion Examples ===\n");
let schema = Schema::new(Query, Mutation, EmptySubscription);
println!("1. Not Found Error (404):");
let query = r#"{ user(id: "550e8400-e29b-41d4-a716-446655440000") { id name } }"#;
let result = schema.execute(query).await;
println!("{:#?}\n", result.errors);
println!("2. Invalid Input Error (400):");
let query = r#"{ users(limit: 0) { id name } }"#;
let result = schema.execute(query).await;
println!("{:#?}\n", result.errors);
println!("3. Authentication Required (401):");
let query = r#"mutation { updateUser(id: "123", name: "New Name") { id name } }"#;
let result = schema.execute(query).await;
println!("{:#?}\n", result.errors);
println!("4. Permission Denied (403):");
let query = r#"mutation { deleteUser(id: "123") }"#;
let result = schema.execute(query).await;
println!("{:#?}\n", result.errors);
println!("5. Business Rule Violation (422):");
let query = r#"mutation { cancelOrder(orderId: "123") }"#;
let result = schema.execute(query).await;
println!("{:#?}\n", result.errors);
println!("\nNote: Each error includes:");
println!(" - Human-readable message");
println!(" - Machine-readable code (NOT_FOUND, INVALID_INPUT, etc.)");
println!(" - Proper GraphQL error structure");
}
#[cfg(not(feature = "graphql"))]
fn main() {
eprintln!("This example requires the 'graphql' feature.");
eprintln!("Run with: cargo run --example graphql_errors --features graphql");
}