use std::fs;
use std::path::Path;
use crate::subripfile::{SubRipFile, SubtitleError};
#[cfg(feature = "async")]
use tokio::fs as async_fs;
#[allow(clippy::wrong_self_convention)]
pub trait BaseProcessor {
fn from_srt(
&self,
srt: SubRipFile,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
self.process(srt, language)
}
fn from_file<P: AsRef<Path>>(
&self,
file: P,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
let content = fs::read_to_string(file)?;
self.from_string(&content, language)
}
fn from_string(
&self,
data: &str,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
let srt = SubRipFile::from_string(data)?;
self.process(srt, language)
}
fn process(
&self,
srt: SubRipFile,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError>;
}
#[cfg(feature = "async")]
#[async_trait::async_trait]
#[allow(clippy::wrong_self_convention)]
pub trait AsyncBaseProcessor: Send + Sync {
async fn from_srt_async(
&self,
srt: SubRipFile,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
self.process_async(srt, language).await
}
async fn from_file_async<P: AsRef<Path> + Send>(
&self,
file: P,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
let content = async_fs::read_to_string(file).await?;
self.from_string_async(&content, language).await
}
async fn from_string_async(
&self,
data: &str,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError> {
let owned_data = data.to_string();
let srt =
crate::async_utils::run_blocking(move || SubRipFile::from_string(&owned_data)).await?;
self.process_async(srt, language).await
}
async fn process_async(
&self,
srt: SubRipFile,
language: Option<&str>,
) -> Result<(SubRipFile, bool), SubtitleError>;
}