use aerro::wire::encode::EncodeOptions;
use aerro::{Aerro, IntoStatus, StatusIntoResultExt};
#[derive(Debug, aerro::Aerro)]
pub enum CreateUser {
#[aerro(
category = Business,
code = AlreadyExists,
error = "email already taken: {email}"
)]
EmailTaken { email: String },
#[aerro(category = System, code = Internal, error = "create_user.boom")]
Boom,
}
fn main() {
let err = CreateUser::EmailTaken {
email: "alice@example.com".into(),
};
let status = err.into_status(&EncodeOptions::default());
println!(
"server emitted: code={:?} message={:?}",
status.code(),
status.message()
);
println!("details() length: {} bytes", status.details().len());
let err2 = CreateUser::Boom;
let status2 = err2.into_status_default();
println!(
"server emitted (default): code={:?} message={:?}",
status2.code(),
status2.message()
);
let recovered = status.into_aerro::<CreateUser>().unwrap();
match recovered.into_inner() {
CreateUser::EmailTaken { email } => println!("client recovered: email={email}"),
CreateUser::Boom => unreachable!(),
}
println!("type_ids known to CreateUser: {:?}", CreateUser::TYPE_IDS);
}