lune 0.2.0

A Luau script runner
Documentation
use anyhow::{bail, Result};

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DocsTagKind {
    Class,
    Within,
    Param,
    Return,
}

impl DocsTagKind {
    pub fn parse(s: &str) -> Result<Self> {
        match s.trim().to_ascii_lowercase().as_ref() {
            "class" => Ok(Self::Class),
            "within" => Ok(Self::Within),
            "param" => Ok(Self::Param),
            "return" => Ok(Self::Return),
            s => bail!("Unknown docs tag: '{}'", s),
        }
    }
}

#[derive(Clone, Debug)]
pub struct DocsTag {
    pub kind: DocsTagKind,
    pub name: String,
    pub contents: String,
}

#[derive(Clone, Debug)]
pub struct DocsTagList {
    tags: Vec<DocsTag>,
}

impl DocsTagList {
    pub fn new() -> Self {
        Self { tags: vec![] }
    }

    pub fn push(&mut self, tag: DocsTag) {
        self.tags.push(tag);
    }

    pub fn contains(&mut self, kind: DocsTagKind) -> bool {
        self.tags.iter().any(|tag| tag.kind == kind)
    }

    pub fn find(&mut self, kind: DocsTagKind) -> Option<&DocsTag> {
        self.tags.iter().find(|tag| tag.kind == kind)
    }

    pub fn is_empty(&self) -> bool {
        self.tags.is_empty()
    }
}

impl IntoIterator for DocsTagList {
    type Item = DocsTag;
    type IntoIter = std::vec::IntoIter<Self::Item>;

    fn into_iter(self) -> Self::IntoIter {
        self.tags.into_iter()
    }
}