pub use polyvers_macros::versioned;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("unknown version `{requested}`; known versions: {known:?}")]
UnknownVersion {
requested: String,
known: &'static [&'static str],
},
#[error("format error: {0}")]
Format(Box<dyn std::error::Error + Send + Sync>),
}
impl Error {
pub fn unknown_version(requested: &str, known: &'static [&'static str]) -> Self {
Self::UnknownVersion {
requested: requested.to_owned(),
known,
}
}
pub fn format<E>(err: E) -> Self
where
E: std::error::Error + Send + Sync + 'static,
{
Self::Format(Box::new(err))
}
pub fn format_str<S: Into<String>>(message: S) -> Self {
#[derive(Debug)]
struct StringError(String);
impl std::fmt::Display for StringError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
impl std::error::Error for StringError {}
Self::Format(Box::new(StringError(message.into())))
}
}