libhanzzok 0.1.5

Hanzzok compiler library
Documentation
use core::fmt;

use crate::syntax::Token;

use super::InlineObjectNode;

#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)]
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum BlockConstructorForm {
    Basic,
    Shortened,
    Bookend,
    Leading,
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)]
#[derive(Clone, Debug)]
pub struct BlockConstructorNode {
    pub(crate) form: BlockConstructorForm,
    pub(crate) name: String,
    pub(crate) main_text: Vec<InlineObjectNode>,
    pub(crate) param: Option<String>,
    pub(crate) multiline_text: Vec<Vec<InlineObjectNode>>,
    pub(crate) tokens: Vec<Token>,
}

impl fmt::Display for BlockConstructorNode {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "BlockConstructor(form={:?}, name={}, main_text=[",
            self.form, self.name,
        )?;
        let mut has_written = false;
        for node in &self.main_text {
            if has_written {
                write!(f, ", ")?;
            }
            node.fmt(f)?;
            has_written = true;
        }
        write!(f, "], param={:?}, multiline_text=[", self.param)?;
        let mut has_written = false;
        for nodes in &self.multiline_text {
            if has_written {
                write!(f, ", ")?;
            }
            write!(f, "[")?;
            let mut inner_has_written = false;
            for node in nodes {
                if inner_has_written {
                    write!(f, ", ")?;
                }
                node.fmt(f)?;
                inner_has_written = true;
            }
            write!(f, "]")?;
            has_written = true;
        }
        write!(f, "])")
    }
}