Skip to main content

floe_core/io/write/
accepted.rs

1use std::path::Path;
2
3use polars::prelude::DataFrame;
4
5use crate::io::format::{AcceptedSinkAdapter, AcceptedWriteOutput};
6use crate::io::storage::Target;
7use crate::{config, io, FloeResult};
8
9use super::modes;
10
11pub struct AcceptedWriteRequest<'a> {
12    pub target: &'a Target,
13    pub df: &'a mut DataFrame,
14    pub output_stem: &'a str,
15    pub temp_dir: Option<&'a Path>,
16    pub cloud: &'a mut io::storage::CloudClient,
17    pub resolver: &'a config::StorageResolver,
18    pub entity: &'a config::EntityConfig,
19    pub mode: config::WriteMode,
20}
21
22pub trait AcceptedWriter: Send + Sync {
23    fn write(&self, request: AcceptedWriteRequest<'_>) -> FloeResult<AcceptedWriteOutput>;
24}
25
26pub struct AdapterAcceptedWriter<'a> {
27    adapter: &'a dyn AcceptedSinkAdapter,
28}
29
30impl<'a> AdapterAcceptedWriter<'a> {
31    pub fn new(adapter: &'a dyn AcceptedSinkAdapter) -> Self {
32        Self { adapter }
33    }
34}
35
36impl AcceptedWriter for AdapterAcceptedWriter<'_> {
37    fn write(&self, request: AcceptedWriteRequest<'_>) -> FloeResult<AcceptedWriteOutput> {
38        modes::ensure_mode_supported(request.mode)?;
39        self.adapter.write_accepted(
40            request.target,
41            request.df,
42            request.output_stem,
43            request.temp_dir,
44            request.cloud,
45            request.resolver,
46            request.entity,
47        )
48    }
49}
50
51pub fn write_with_adapter(
52    adapter: &dyn AcceptedSinkAdapter,
53    request: AcceptedWriteRequest<'_>,
54) -> FloeResult<AcceptedWriteOutput> {
55    AdapterAcceptedWriter::new(adapter).write(request)
56}