#![deny(missing_docs,
missing_debug_implementations, missing_copy_implementations,
trivial_casts, trivial_numeric_casts,
unsafe_code,
unstable_features,
unused_import_braces, unused_qualifications)]
#[macro_use]
extern crate error_chain;
extern crate combine;
mod formats;
pub mod timetypes;
pub mod errors;
pub use formats::srt::SrtFile;
pub use formats::idx::IdxFile;
pub use formats::ssa::SsaFile;
pub use formats::SubtitleFormat;
pub use formats::{get_subtitle_format_by_ending, get_subtitle_format_by_ending_err, parse_file_from_string};
use errors::*;
use timetypes::TimeSpan;
pub trait SubtitleFile {
fn get_subtitle_entries(&self) -> Result<Vec<SubtitleEntry>>;
fn update_subtitle_entries(&mut self, i: &[SubtitleEntry]) -> Result<()>;
fn to_data(&self) -> Result<Vec<u8>>;
}
pub trait ParseSubtitleString: Sized {
fn parse_from_string(s: String) -> Result<Self>;
}
pub trait ParseSubtitle: Sized {
fn parse(b: &[u8]) -> Result<Self>;
}
impl<T> ParseSubtitle for T
where T: ParseSubtitleString
{
fn parse(b: &[u8]) -> Result<Self> {
let s = String::from_utf8(b.to_vec())?;
Self::parse_from_string(s)
}
}
#[derive(Debug)]
pub struct SubtitleEntry {
pub timespan: TimeSpan,
pub line: Option<String>,
}
impl SubtitleEntry {
fn new(timespan: TimeSpan, line: String) -> SubtitleEntry {
SubtitleEntry {
timespan: timespan,
line: Some(line),
}
}
}
impl From<TimeSpan> for SubtitleEntry {
fn from(f: TimeSpan) -> SubtitleEntry {
SubtitleEntry {
timespan: f,
line: None,
}
}
}