use rupg_common::SqlState;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TypeError {
pub sqlstate: SqlState,
pub message: String,
pub detail: Option<String>,
pub hint: Option<String>,
pub context: Option<String>,
}
impl TypeError {
pub(crate) fn new(sqlstate: SqlState, message: String) -> TypeError {
TypeError { sqlstate, message, detail: None, hint: None, context: None }
}
pub(crate) fn syntax(type_name: &str, input: &str) -> TypeError {
TypeError::new(
SqlState::INVALID_TEXT_REPRESENTATION,
format!("invalid input syntax for type {type_name}: \"{input}\""),
)
}
pub(crate) fn range(input: &str, type_name: &str) -> TypeError {
TypeError::new(
SqlState::NUMERIC_VALUE_OUT_OF_RANGE,
format!("value \"{input}\" is out of range for type {type_name}"),
)
}
}
impl std::fmt::Display for TypeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.message)
}
}
impl std::error::Error for TypeError {}
impl From<TypeError> for rupg_common::Error {
fn from(error: TypeError) -> rupg_common::Error {
let mut out = rupg_common::Error::new(error.sqlstate, error.message);
if let Some(detail) = error.detail {
out = out.with_detail(detail);
}
if let Some(hint) = error.hint {
out = out.with_hint(hint);
}
out
}
}