pub mod helper;
mod tag;
#[cfg(feature = "ratatui")]
#[cfg_attr(docsrs, doc(cfg(feature = "ratatui")))]
pub mod ratatui;
#[cfg(feature = "ratatui")]
pub use self::ratatui::RatatuiTextGenerator;
#[cfg(feature = "ansi")]
#[cfg_attr(docsrs, doc(cfg(feature = "ansi")))]
pub mod ansi;
#[cfg(feature = "ansi")]
pub use self::ansi::ANSIStringsGenerator;
#[cfg(feature = "crossterm")]
#[cfg_attr(docsrs, doc(cfg(feature = "crossterm")))]
pub mod crossterm;
#[cfg(feature = "crossterm")]
pub use self::crossterm::CrosstermCommandsGenerator;
use std::fmt::{Debug, Display};
use crate::{error::LocatedError, parser::ItemG, Error};
pub use tag::{Tag, TagConvertor, TagG};
pub trait Generator<'a> {
type Convertor: TagConvertor<'a>;
type Output;
type Err: LocatedError + Display + Debug + Into<Error<'a, Self::Err>>;
fn convertor(&mut self) -> &mut Self::Convertor;
fn generate(&mut self, ir: Vec<Vec<ItemG<'a, Self>>>) -> Result<Self::Output, Self::Err>;
}
impl<'a, G: Generator<'a>> Generator<'a> for &mut G {
type Convertor = G::Convertor;
type Output = G::Output;
type Err = G::Err;
fn convertor(&mut self) -> &mut Self::Convertor {
<G as Generator<'a>>::convertor(self)
}
fn generate(&mut self, ir: Vec<Vec<ItemG<'a, G>>>) -> Result<Self::Output, Self::Err> {
<G as Generator<'a>>::generate(self, ir)
}
}