mod arrow;
mod native;
pub(crate) mod protocol_data;
pub use arrow::ArrowFormat;
pub use native::NativeFormat;
use crate::ArrowOptions;
#[expect(private_bounds)]
pub trait ClientFormat: sealed::ClientFormatImpl<Self::Data> + Send + Sync + 'static {
type Data: std::fmt::Debug + Clone + Send + Sync + 'static;
const FORMAT: &'static str;
}
pub(crate) mod sealed {
use super::{DeserializerState, SerializerState};
use crate::Type;
use crate::client::connection::ClientMetadata;
use crate::errors::Result;
use crate::io::{ClickHouseRead, ClickHouseWrite};
use crate::query::Qid;
pub(crate) trait ClientFormatImpl<T>: std::fmt::Debug
where
T: std::fmt::Debug + Clone + Send + Sync + 'static,
{
type Schema: std::fmt::Debug + Clone + Send + Sync + 'static;
type Deser: Default + Send + Sync + 'static;
type Ser: Default + Send + Sync + 'static;
#[expect(unused)]
fn finish_ser(_state: &mut SerializerState<Self::Ser>) {}
fn finish_deser(_state: &mut DeserializerState<Self::Deser>) {}
fn write<'a, W: ClickHouseWrite>(
writer: &'a mut W,
data: T,
qid: Qid,
header: Option<&'a [(String, Type)]>,
revision: u64,
metadata: ClientMetadata,
) -> impl Future<Output = Result<()>> + Send + 'a;
fn read<'a, R: ClickHouseRead + 'static>(
reader: &'a mut R,
revision: u64,
metadata: ClientMetadata,
state: &'a mut DeserializerState<Self::Deser>,
) -> impl Future<Output = Result<Option<T>>> + Send + 'a;
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub(crate) struct DeserializerState<T: Default = ()> {
pub(crate) options: Option<ArrowOptions>,
pub(crate) deserializer: T,
}
impl<T: Default> DeserializerState<T> {
#[must_use]
pub(crate) fn with_arrow_options(mut self, options: ArrowOptions) -> Self {
self.options = Some(options);
self
}
#[must_use]
pub(crate) fn deserializer(&mut self) -> &mut T { &mut self.deserializer }
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub(crate) struct SerializerState<T: Default = ()> {
pub(crate) options: Option<ArrowOptions>,
pub(crate) serializer: T,
}
impl<T: Default> SerializerState<T> {
#[must_use]
pub(crate) fn with_arrow_options(mut self, options: ArrowOptions) -> Self {
self.options = Some(options);
self
}
#[expect(unused)]
#[must_use]
pub(crate) fn serializer(&mut self) -> &mut T { &mut self.serializer }
}