diff --git a/src/gemini.rs b/src/gemini.rs index faf88a2..d2d9f23 100644 --- a/src/gemini.rs +++ b/src/gemini.rs @@ -2,6 +2,58 @@ /// here: https://gemini.circumlunar.space/docs/specification.html use std::io::Write; +/// Build a gemini document up from a series of nodes. +#[derive(Default)] +pub struct Builder { + nodes: Vec, +} + +impl Builder { + pub fn new() -> Builder { + Builder::default() + } + + pub fn text>(mut self, data: T) -> Builder { + self.nodes.push(Node::Text(data.into())); + self + } + + pub fn link>(mut self, to: T, name: Option) -> Builder { + self.nodes.push(Node::Link { + to: to.into(), + name: name, + }); + self + } + + pub fn preformatted>(mut self, data: T) -> Builder { + self.nodes.push(Node::Preformatted(data.into())); + self + } + + pub fn heading>(mut self, level: u8, body: T) -> Builder { + self.nodes.push(Node::Heading { + level: level, + body: body.into(), + }); + self + } + + pub fn list_item>(mut self, item: T) -> Builder { + self.nodes.push(Node::ListItem(item.into())); + self + } + + pub fn quote>(mut self, body: T) -> Builder { + self.nodes.push(Node::Quote(body.into())); + self + } + + pub fn build(self) -> Vec { + self.nodes + } +} + /// Individual nodes of the document. Each node correlates to a line in the file. #[derive(Debug, PartialEq, Eq)] pub enum Node {