mdstream 0.3.0

Streaming-first Markdown middleware for LLM output (committed + pending blocks, render-agnostic).
Documentation
use super::MdStream;
use crate::boundary::BoundaryPlugin;
use crate::options::Options;
use crate::transform::PendingTransformer;
use crate::transform::{IncompleteImageDropTransformer, IncompleteLinkPlaceholderTransformer};

#[derive(Debug)]
pub struct MdStreamBuilder {
    stream: MdStream,
}

impl MdStreamBuilder {
    pub fn new(opts: Options) -> Self {
        Self {
            stream: MdStream::new(opts),
        }
    }

    pub fn streamdown_defaults() -> Self {
        let opts = Options {
            terminator: crate::pending::TerminatorOptions {
                links: false,
                images: false,
                ..Default::default()
            },
            ..Default::default()
        };

        Self::new(opts.clone())
            .pending_transformer(IncompleteLinkPlaceholderTransformer {
                incomplete_link_url: opts.terminator.incomplete_link_url,
                window_bytes: opts.terminator_window_bytes,
            })
            .pending_transformer(IncompleteImageDropTransformer {
                window_bytes: opts.terminator_window_bytes,
            })
    }

    pub fn pending_transformer<T>(mut self, transformer: T) -> Self
    where
        T: PendingTransformer + 'static,
    {
        self.stream.push_pending_transformer(transformer);
        self
    }

    pub fn boundary_plugin<T>(mut self, plugin: T) -> Self
    where
        T: BoundaryPlugin + 'static,
    {
        self.stream.push_boundary_plugin(plugin);
        self
    }

    pub fn build(self) -> MdStream {
        self.stream
    }
}

impl Default for MdStreamBuilder {
    fn default() -> Self {
        Self::new(Options::default())
    }
}