use crate::{FromDatum, IntoDatum, pg_sys};
#[derive(Debug, Clone, Copy)]
pub struct AnyElement {
datum: pg_sys::Datum,
typoid: pg_sys::Oid,
}
impl AnyElement {
pub fn datum(&self) -> pg_sys::Datum {
self.datum
}
pub fn oid(&self) -> pg_sys::Oid {
self.typoid
}
#[inline]
pub unsafe fn into<T: FromDatum>(&self) -> Option<T> {
T::from_polymorphic_datum(self.datum(), false, self.oid())
}
}
impl FromDatum for AnyElement {
const GET_TYPOID: bool = true;
#[inline]
unsafe fn from_datum(_datum: pg_sys::Datum, _is_null: bool) -> Option<AnyElement> {
panic!(
"Can't create a polymorphic type using from_datum, call FromDatum::from_polymorphic_datum instead"
)
}
#[inline]
unsafe fn from_polymorphic_datum(
datum: pg_sys::Datum,
is_null: bool,
typoid: pg_sys::Oid,
) -> Option<AnyElement> {
if is_null { None } else { Some(AnyElement { datum, typoid }) }
}
}
impl IntoDatum for AnyElement {
#[inline]
fn into_datum(self) -> Option<pg_sys::Datum> {
Some(self.datum)
}
fn type_oid() -> pg_sys::Oid {
pg_sys::ANYELEMENTOID
}
}
crate::impl_sql_translatable!(AnyElement, "anyelement");