use haloumi_lowering::{Lowering, Result, lowerable::LowerableStmt};

pub struct Comment(String);

impl Comment {
    pub fn new(s: impl AsRef<str>) -> Self {
        Self(s.as_ref().to_owned())
    }

    pub fn value(&self) -> &str {
        self.0.as_str()
    }
}

impl LowerableStmt for Comment {
    fn lower<L>(self, l: &L) -> Result<()>
    where
        L: Lowering + ?Sized,
    {
        l.generate_comment(self.0)
    }
}

impl Clone for Comment {
    fn clone(&self) -> Self {
        Self(self.0.clone())
    }
}

impl PartialEq for Comment {
    fn eq(&self, other: &Self) -> bool {
        self.0 == other.0
    }
}

impl std::fmt::Debug for Comment {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "comment '{}'", self.0)
    }
}
