floe-core 0.3.1

Core library for Floe, a YAML-driven technical ingestion tool.
Documentation
use std::path::Path;

use polars::prelude::DataFrame;

use crate::io::format::{AcceptedSinkAdapter, AcceptedWriteOutput};
use crate::io::storage::Target;
use crate::{config, io, FloeResult};

pub struct AcceptedWriteRequest<'a> {
    pub target: &'a Target,
    pub df: &'a mut DataFrame,
    pub output_stem: &'a str,
    pub temp_dir: Option<&'a Path>,
    pub cloud: &'a mut io::storage::CloudClient,
    pub resolver: &'a config::StorageResolver,
    pub catalogs: &'a config::CatalogResolver,
    pub entity: &'a config::EntityConfig,
    pub mode: config::WriteMode,
}

pub trait AcceptedWriter: Send + Sync {
    fn write(&self, request: AcceptedWriteRequest<'_>) -> FloeResult<AcceptedWriteOutput>;
}

pub struct AdapterAcceptedWriter<'a> {
    adapter: &'a dyn AcceptedSinkAdapter,
}

impl<'a> AdapterAcceptedWriter<'a> {
    pub fn new(adapter: &'a dyn AcceptedSinkAdapter) -> Self {
        Self { adapter }
    }
}

impl AcceptedWriter for AdapterAcceptedWriter<'_> {
    fn write(&self, request: AcceptedWriteRequest<'_>) -> FloeResult<AcceptedWriteOutput> {
        self.adapter.write_accepted(
            request.target,
            request.df,
            request.mode,
            request.output_stem,
            request.temp_dir,
            request.cloud,
            request.resolver,
            request.catalogs,
            request.entity,
        )
    }
}

pub fn write_with_adapter(
    adapter: &dyn AcceptedSinkAdapter,
    request: AcceptedWriteRequest<'_>,
) -> FloeResult<AcceptedWriteOutput> {
    AdapterAcceptedWriter::new(adapter).write(request)
}