use async_trait::async_trait;
use vortex_array::ArrayContext;
use vortex_error::VortexResult;
use vortex_session::VortexSession;
use crate::LayoutRef;
use crate::segments::SegmentSinkRef;
use crate::sequence::SendableSequentialStream;
use crate::sequence::SequencePointer;
#[async_trait]
pub trait LayoutStrategy: 'static + Send + Sync {
async fn write_stream(
&self,
ctx: ArrayContext,
segment_sink: SegmentSinkRef,
stream: SendableSequentialStream,
eof: SequencePointer,
session: &VortexSession,
) -> VortexResult<LayoutRef>;
fn buffered_bytes(&self) -> u64 {
0
}
}
#[async_trait]
impl LayoutStrategy for std::sync::Arc<dyn LayoutStrategy> {
async fn write_stream(
&self,
ctx: ArrayContext,
segment_sink: SegmentSinkRef,
stream: SendableSequentialStream,
eof: SequencePointer,
session: &VortexSession,
) -> VortexResult<LayoutRef> {
(**self)
.write_stream(ctx, segment_sink, stream, eof, session)
.await
}
fn buffered_bytes(&self) -> u64 {
(**self).buffered_bytes()
}
}