use super::sealed::Sealed;
use super::wire_type::WireType;
pub trait WireSource: Sealed {
type Payload<'a>;
fn wire_type(payload: &Self::Payload<'_>) -> WireType;
fn column_name<'a>(payload: &'a Self::Payload<'_>) -> &'a str;
}
pub trait WireColumnTypes {
fn column_type(&self, column_index: usize) -> WireType;
}
pub trait WireSchema {
type Table: crate::schema::NamedColumns + WireColumnTypes;
fn get(&self, table_name: &str) -> Option<&Self::Table>;
}
pub trait Digestable<F, T, S, B>
where
F: crate::builders::Format<S, B>,
T: crate::schema::NamedColumns + WireColumnTypes,
{
type Src: WireSource;
type Error;
fn digest_into<Sch, A>(
&self,
builder: crate::builders::DiffSetBuilder<F, T, S, B>,
schema: &Sch,
adapter: &A,
) -> Result<crate::builders::DiffSetBuilder<F, T, S, B>, Self::Error>
where
Sch: WireSchema<Table = T>,
A: super::WireAdapter<Self::Src, S, B>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PgBinary;
impl Sealed for PgBinary {}
impl WireSource for PgBinary {
type Payload<'a> = PgBinaryColumn<'a>;
fn wire_type(payload: &Self::Payload<'_>) -> WireType {
payload.wire_type
}
fn column_name<'a>(payload: &'a Self::Payload<'_>) -> &'a str {
payload.column_name
}
}
#[derive(Debug, Clone, Copy)]
pub struct PgBinaryColumn<'a> {
pub column_name: &'a str,
pub wire_type: WireType,
pub raw: Option<&'a [u8]>,
}
impl PgBinaryColumn<'_> {
pub fn decoded_by<D, S, B>(
self,
decoder: &D,
) -> Result<crate::encoding::Value<S, B>, super::error::DecodeError>
where
D: super::decoder::Decoder<PgBinary, S, B>,
{
decoder.decode(self)
}
}