use std::fs::File;
use std::io::{Cursor, Read};
use std::path::Path;
use crate::subripfile::{SubRipFile, SubtitleError};
#[cfg(feature = "async")]
use tokio::fs::File as AsyncFile;
#[cfg(feature = "async")]
use tokio::io::{AsyncRead, AsyncReadExt};
#[allow(clippy::wrong_self_convention)]
pub trait BaseConverter {
fn from_file<P: AsRef<Path>>(&self, file: P) -> Result<SubRipFile, SubtitleError> {
let mut file = File::open(file)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
self.parse(Cursor::new(buffer))
}
fn from_string(&self, data: &str) -> Result<SubRipFile, SubtitleError> {
let bytes = data.as_bytes();
self.parse(Cursor::new(bytes))
}
fn from_bytes(&self, data: &[u8]) -> Result<SubRipFile, SubtitleError> {
self.parse(Cursor::new(data))
}
fn parse<R: Read>(&self, stream: R) -> Result<SubRipFile, SubtitleError>;
}
#[cfg(feature = "async")]
#[async_trait::async_trait]
#[allow(clippy::wrong_self_convention)]
pub trait AsyncBaseConverter: Send + Sync {
async fn from_file_async<P: AsRef<Path> + Send>(
&self,
file: P,
) -> Result<SubRipFile, SubtitleError> {
let mut file = AsyncFile::open(file).await?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer).await?;
self.parse_async(Cursor::new(buffer)).await
}
async fn from_string_async(&self, data: &str) -> Result<SubRipFile, SubtitleError> {
let bytes = data.as_bytes();
self.parse_async(Cursor::new(bytes)).await
}
async fn from_bytes_async(&self, data: &[u8]) -> Result<SubRipFile, SubtitleError> {
self.parse_async(Cursor::new(data)).await
}
async fn parse_async<R: AsyncRead + Unpin + Send>(
&self,
stream: R,
) -> Result<SubRipFile, SubtitleError>;
}