use no_panic::no_panic;
use crate::pg_sys::Datum;
pub struct PgDatum(Option<Datum>);
impl PgDatum {
pub fn from_raw<B: Into<bool>>(datum: Datum, is_null: B) -> Self {
let datum = if is_null.into() { None } else { Some(datum) };
PgDatum(datum)
}
#[no_panic]
pub fn is_null(&self) -> bool {
self.0.is_none()
}
#[no_panic]
pub fn into_datum(self) -> Datum {
match self.0 {
Some(datum) => datum,
None => 0 as Datum,
}
}
}
pub trait TryFromPgDatum: Sized {
fn try_from(datum: PgDatum) -> Result<Self, &'static str>;
}
impl TryFromPgDatum for i32 {
fn try_from(datum: PgDatum) -> Result<Self, &'static str> {
if let Some(datum) = datum.0 {
Ok(datum as i32)
} else {
Err("datum was NULL")
}
}
}
impl From<i32> for PgDatum {
fn from(value: i32) -> Self {
PgDatum(Some(value as Datum))
}
}
impl From<()> for PgDatum {
fn from(_value: ()) -> Self {
PgDatum(None)
}
}