limu 0.2.1

A diagram layout engine. It reads Mermaid and leaves the drawing to your program.
Documentation
//! The tokens of a requirement diagram, as Pele's tokens.ts has them.

/// A token's type, Pele's T. The parser takes runs of them in their order, as from
/// REQUIREMENT to DESIGN_CONSTRAINT, so the order is Pele's.
#[allow(
    non_camel_case_types,
    clippy::upper_case_acronyms,
    clippy::enum_variant_names
)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u8)]
pub(crate) enum T {
    END,
    ERROR,
    title,
    acc_title,
    acc_title_value,
    acc_descr,
    acc_descr_value,
    acc_descr_multiline_value,
    direction_tb,
    direction_bt,
    direction_rl,
    direction_lr,
    NEWLINE,
    EOF,
    RD,
    STRUCT_START,
    STRUCT_STOP,
    STYLE_SEPARATOR,
    COLONSEP,
    ID,
    TEXT,
    RISK,
    VERIFYMTHD,
    REQUIREMENT,
    FUNCTIONAL_REQUIREMENT,
    INTERFACE_REQUIREMENT,
    PERFORMANCE_REQUIREMENT,
    PHYSICAL_REQUIREMENT,
    DESIGN_CONSTRAINT,
    LOW_RISK,
    MED_RISK,
    HIGH_RISK,
    VERIFY_ANALYSIS,
    VERIFY_DEMONSTRATION,
    VERIFY_INSPECTION,
    VERIFY_TEST,
    ELEMENT,
    CONTAINS,
    COPIES,
    DERIVES,
    SATISFIES,
    VERIFIES,
    REFINES,
    TRACES,
    TYPE,
    DOCREF,
    STYLE,
    CLASSDEF,
    CLASS,
    ALPHA,
    COLON,
    SEMICOLON,
    PERCENT,
    MINUS,
    BRKT,
    END_ARROW_L,
    END_ARROW_R,
    LINE,
    qString,
    unqString,
    COMMA,
}

/// The names of the types, as Jison's errors give them, in the order of T, Pele's
/// TOKEN_NAMES.
pub(crate) const TOKEN_NAMES: [&str; 61] = [
    "$end",
    "INVALID",
    "title",
    "acc_title",
    "acc_title_value",
    "acc_descr",
    "acc_descr_value",
    "acc_descr_multiline_value",
    "direction_tb",
    "direction_bt",
    "direction_rl",
    "direction_lr",
    "NEWLINE",
    "EOF",
    "RD",
    "STRUCT_START",
    "STRUCT_STOP",
    "STYLE_SEPARATOR",
    "COLONSEP",
    "ID",
    "TEXT",
    "RISK",
    "VERIFYMTHD",
    "REQUIREMENT",
    "FUNCTIONAL_REQUIREMENT",
    "INTERFACE_REQUIREMENT",
    "PERFORMANCE_REQUIREMENT",
    "PHYSICAL_REQUIREMENT",
    "DESIGN_CONSTRAINT",
    "LOW_RISK",
    "MED_RISK",
    "HIGH_RISK",
    "VERIFY_ANALYSIS",
    "VERIFY_DEMONSTRATION",
    "VERIFY_INSPECTION",
    "VERIFY_TEST",
    "ELEMENT",
    "CONTAINS",
    "COPIES",
    "DERIVES",
    "SATISFIES",
    "VERIFIES",
    "REFINES",
    "TRACES",
    "TYPE",
    "DOCREF",
    "STYLE",
    "CLASSDEF",
    "CLASS",
    "ALPHA",
    "COLON",
    "SEMICOLON",
    "PERCENT",
    "MINUS",
    "BRKT",
    "END_ARROW_L",
    "END_ARROW_R",
    "LINE",
    "qString",
    "unqString",
    "COMMA",
];

impl T {
    /// The type's name, as Jison's errors give it.
    pub(crate) fn name(self) -> &'static str {
        TOKEN_NAMES[self as usize]
    }
}

/// The longest keyword, in characters, Pele's LONGEST_KEYWORD.
pub(crate) const LONGEST_KEYWORD: usize = 22;

/// The keyword a word is, written in lower case, as Pele's KEYWORDS finds it. Every keyword
/// is matched without regard to case and ends at a word boundary.
pub(crate) fn keyword(lower: &str) -> Option<T> {
    Some(match lower {
        "requirementdiagram" => T::RD,
        "id" => T::ID,
        "text" => T::TEXT,
        "risk" => T::RISK,
        "verifymethod" => T::VERIFYMTHD,
        "requirement" => T::REQUIREMENT,
        "functionalrequirement" => T::FUNCTIONAL_REQUIREMENT,
        "interfacerequirement" => T::INTERFACE_REQUIREMENT,
        "performancerequirement" => T::PERFORMANCE_REQUIREMENT,
        "physicalrequirement" => T::PHYSICAL_REQUIREMENT,
        "designconstraint" => T::DESIGN_CONSTRAINT,
        "low" => T::LOW_RISK,
        "medium" => T::MED_RISK,
        "high" => T::HIGH_RISK,
        "analysis" => T::VERIFY_ANALYSIS,
        "demonstration" => T::VERIFY_DEMONSTRATION,
        "inspection" => T::VERIFY_INSPECTION,
        "test" => T::VERIFY_TEST,
        "element" => T::ELEMENT,
        "contains" => T::CONTAINS,
        "copies" => T::COPIES,
        "derives" => T::DERIVES,
        "satisfies" => T::SATISFIES,
        "verifies" => T::VERIFIES,
        "refines" => T::REFINES,
        "traces" => T::TRACES,
        "type" => T::TYPE,
        "docref" => T::DOCREF,
        "style" => T::STYLE,
        "classdef" => T::CLASSDEF,
        "class" => T::CLASS,
        _ => return None,
    })
}