#[derive(Debug, thiserror::Error)]
pub enum SomniaError {
    #[error("query: {0}")]
    Query(String),
    #[error("deserialization: {0}")]
    Deser(String),
    #[error("missing field '{0}'")]
    MissingField(String),
    #[error("type mismatch for '{field}': expected {expected}, got {got}")]
    TypeMismatch {
        field: String,
        expected: String,
        got: String,
    },
    #[error("connection: {0}")]
    Connection(String),
    #[error("migration: {0}")]
    Migration(String),
    #[error("serde: {0}")]
    Serde(#[from] serde_json::Error),
    #[error("{0}")]
    Message(String),
}

impl SomniaError {
    pub fn query(msg: impl Into<String>) -> Self {
        Self::Query(msg.into())
    }
    pub fn deser(msg: impl Into<String>) -> Self {
        Self::Deser(msg.into())
    }
    pub fn missing(field: impl Into<String>) -> Self {
        Self::MissingField(field.into())
    }
    pub fn msg(msg: impl Into<String>) -> Self {
        Self::Message(msg.into())
    }
    pub fn migration(msg: impl Into<String>) -> Self {
        Self::Migration(msg.into())
    }
}
