use crate::printer::{Printable, Printer};
pub use code::*;
pub use header::*;
pub use note::*;
pub use prefix::*;
pub use separator::*;
pub use stack::*;
pub use stack_trace::*;
pub use step::*;
pub use text::*;
mod code;
mod header;
mod note;
mod prefix;
mod separator;
mod stack;
mod stack_trace;
mod step;
mod text;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Clone)]
pub enum LogBlock<'a> {
Text(TextBlock<'a>),
Prefix(PrefixBlock<'a>),
Separator(SeparatorBlock),
Header(HeaderBlock<'a>),
Note(NoteBlock<'a>),
Stack(StackBlock<'a>),
Code(CodeBlock<'a>),
Steps(StepsBlock<'a>),
}
impl<'a> LogBlock<'a> {
pub fn make_owned(self) -> LogBlock<'static> {
match self {
LogBlock::Text(v) => LogBlock::Text(v.make_owned()),
LogBlock::Prefix(v) => LogBlock::Prefix(v.make_owned()),
LogBlock::Separator(v) => LogBlock::Separator(v),
LogBlock::Header(v) => LogBlock::Header(v.make_owned()),
LogBlock::Note(v) => LogBlock::Note(v.make_owned()),
LogBlock::Stack(v) => LogBlock::Stack(v.make_owned()),
LogBlock::Code(v) => LogBlock::Code(v.make_owned()),
LogBlock::Steps(v) => LogBlock::Steps(v.make_owned()),
}
}
}
impl<'a> Printable<'a> for LogBlock<'a> {
fn print<'s>(&'s self, printer: &mut Printer<'a>)
where
'a: 's,
{
match self {
LogBlock::Text(v) => v.print(printer),
LogBlock::Prefix(v) => v.print(printer),
LogBlock::Separator(v) => v.print(printer),
LogBlock::Header(v) => v.print(printer),
LogBlock::Note(v) => v.print(printer),
LogBlock::Stack(v) => v.print(printer),
LogBlock::Code(v) => v.print(printer),
LogBlock::Steps(v) => v.print(printer),
}
}
}
impl<'a> From<TextBlock<'a>> for LogBlock<'a> {
fn from(block: TextBlock<'a>) -> Self {
LogBlock::Text(block)
}
}
impl<'a> From<PrefixBlock<'a>> for LogBlock<'a> {
fn from(block: PrefixBlock<'a>) -> Self {
LogBlock::Prefix(block)
}
}
impl<'a> From<SeparatorBlock> for LogBlock<'a> {
fn from(block: SeparatorBlock) -> Self {
LogBlock::Separator(block)
}
}
impl<'a> From<HeaderBlock<'a>> for LogBlock<'a> {
fn from(block: HeaderBlock<'a>) -> Self {
LogBlock::Header(block)
}
}
impl<'a> From<NoteBlock<'a>> for LogBlock<'a> {
fn from(block: NoteBlock<'a>) -> Self {
LogBlock::Note(block)
}
}
impl<'a> From<StackBlock<'a>> for LogBlock<'a> {
fn from(block: StackBlock<'a>) -> Self {
LogBlock::Stack(block)
}
}
impl<'a> From<CodeBlock<'a>> for LogBlock<'a> {
fn from(block: CodeBlock<'a>) -> Self {
LogBlock::Code(block)
}
}
impl<'a> From<StepsBlock<'a>> for LogBlock<'a> {
fn from(block: StepsBlock<'a>) -> Self {
LogBlock::Steps(block)
}
}