use snafu::Snafu;
use std::env;
use std::sync::LazyLock;
use tibba_error::Error as BaseError;
#[derive(Snafu, Debug)]
pub enum Error {
#[cfg(feature = "compression")]
#[snafu(display("{source}"))]
Zstd { source: std::io::Error },
#[cfg(feature = "compression")]
#[snafu(display("{source}"))]
Lz4Decompress {
source: lz4_flex::block::DecompressError,
},
#[cfg(feature = "compression")]
#[snafu(display("decompressed size {size} exceeds limit {limit}"))]
DecompressTooLarge { size: usize, limit: usize },
#[cfg(feature = "http")]
#[snafu(display("{source}"))]
InvalidHeaderName {
source: axum::http::header::InvalidHeaderName,
},
#[cfg(feature = "http")]
#[snafu(display("{source}"))]
InvalidHeaderValue {
source: axum::http::header::InvalidHeaderValue,
},
#[snafu(display("{message}"))]
Invalid { message: String },
#[snafu(display("{source}"))]
Deserialize { source: serde_urlencoded::de::Error },
}
impl From<Error> for BaseError {
fn from(val: Error) -> Self {
let err = match val {
#[cfg(feature = "compression")]
Error::Zstd { source } => BaseError::new(source).with_sub_category("zstd"),
#[cfg(feature = "compression")]
Error::Lz4Decompress { source } => {
BaseError::new(source).with_sub_category("lz4_decompress")
}
#[cfg(feature = "compression")]
Error::DecompressTooLarge { size, limit } => {
BaseError::new(format!("decompressed size {size} exceeds limit {limit}"))
.with_sub_category("decompress_too_large")
.with_exception(true)
}
#[cfg(feature = "http")]
Error::InvalidHeaderName { source } => {
BaseError::new(source).with_sub_category("invalid_header_name")
}
#[cfg(feature = "http")]
Error::InvalidHeaderValue { source } => {
BaseError::new(source).with_sub_category("invalid_header_value")
}
Error::Invalid { message } => BaseError::new(message).with_sub_category("invalid"),
Error::Deserialize { source } => {
BaseError::new(source).with_sub_category("deserialize")
}
};
err.with_category("util")
}
}
pub const DEFAULT_RUST_ENV: &str = "production";
static RUST_ENV: LazyLock<String> =
LazyLock::new(|| env::var("RUST_ENV").unwrap_or_else(|_| DEFAULT_RUST_ENV.to_string()));
pub fn get_env() -> &'static str {
&RUST_ENV
}
pub fn is_development() -> bool {
get_env() == "dev"
}
pub fn is_test() -> bool {
get_env() == "test"
}
pub fn is_production() -> bool {
!is_development() && !is_test()
}
#[cfg(feature = "compression")]
mod compression;
mod datetime;
#[cfg(feature = "http")]
mod http;
mod request;
mod response;
mod string;
mod uri;
mod validate;
mod value;
#[cfg(feature = "compression")]
pub use compression::*;
pub use datetime::*;
#[cfg(feature = "http")]
pub use http::*;
pub use request::*;
pub use response::*;
pub use string::*;
pub use uri::*;
pub use validate::*;
pub use value::*;