use crate::parse::Span;
#[derive(Debug, Clone, PartialEq)]
pub struct Sexpr {
pub kind: SexprKind,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum SexprKind {
List(Vec<Sexpr>),
Symbol(String),
String(String),
Number(String),
}
impl Sexpr {
#[must_use]
pub fn as_list(&self) -> Option<&[Sexpr]> {
if let SexprKind::List(items) = &self.kind {
Some(items)
} else {
None
}
}
#[must_use]
pub fn as_symbol(&self) -> Option<&str> {
if let SexprKind::Symbol(s) = &self.kind {
Some(s.as_str())
} else {
None
}
}
#[must_use]
pub fn as_string(&self) -> Option<&str> {
if let SexprKind::String(s) = &self.kind {
Some(s.as_str())
} else {
None
}
}
#[must_use]
pub fn as_number(&self) -> Option<&str> {
if let SexprKind::Number(s) = &self.kind {
Some(s.as_str())
} else {
None
}
}
}