use rskit_errors::AppResult;
use rskit_storage::{FileSink, FileSource};
use tokio_util::sync::CancellationToken;
use crate::{ops::MediaOp, pipeline::Progress};
#[async_trait::async_trait]
pub trait MediaExecutor: Send + Sync {
async fn execute(
&self,
source: &FileSource,
ops: &[MediaOp],
sink: Option<&FileSink>,
) -> AppResult<FileSource>;
async fn execute_with_progress(
&self,
source: &FileSource,
ops: &[MediaOp],
sink: Option<&FileSink>,
on_progress: Box<dyn Fn(Progress) + Send + Sync>,
) -> AppResult<FileSource>;
async fn execute_cancellable(
&self,
source: &FileSource,
ops: &[MediaOp],
sink: Option<&FileSink>,
on_progress: Option<Box<dyn Fn(Progress) + Send + Sync>>,
_cancel: CancellationToken,
) -> AppResult<FileSource> {
match on_progress {
Some(cb) => self.execute_with_progress(source, ops, sink, cb).await,
None => self.execute(source, ops, sink).await,
}
}
fn supports(&self, op: &MediaOp) -> bool;
fn preview(&self, source: &FileSource, ops: &[MediaOp]) -> AppResult<Vec<String>>;
}