#![cfg_attr(
feature = "unstable-error-generic-member-access",
feature(error_generic_member_access)
)]
#![allow(
clippy::print_stdout,
clippy::print_stderr,
reason = "examples print to demonstrate library output"
)]
use oopsie::oopsie;
use oopsie::prelude::*;
#[oopsie]
pub enum AppError {
#[oopsie("connection to {host} failed")]
Connect {
host: String,
source: std::io::Error,
},
#[oopsie("key not found: {key}")]
MissingKey { key: String },
}
fn connect(host: &str) -> Result<std::net::TcpStream, AppError> {
std::net::TcpStream::connect(host).context(app_oopsies::Connect { host })
}
fn lookup(key: &str) -> Result<String, AppError> {
None.context(app_oopsies::MissingKey { key })
}
fn main() {
if let Err(err) = connect("127.0.0.1:1") {
println!("{err}");
for cause in err.chain().skip(1) {
println!(" caused by: {cause}");
}
println!("root cause: {}", err.root_cause());
}
if let Err(err) = lookup("api_token") {
println!("{err}");
}
}