#![warn(missing_docs)]
#![allow(clippy::large_enum_variant)]
pub mod ast;
pub mod node;
pub mod tokenizer;
pub mod visitors;
mod private;
mod util;
use full_moon_derive::Owned;
use std::fmt;
#[cfg(all(test, not(feature = "serde")))]
compile_error!("Serde feature must be enabled for tests");
#[derive(Clone, Debug, PartialEq, Owned)]
pub enum Error<'a> {
AstError(ast::AstError<'a>),
TokenizerError(tokenizer::TokenizerError),
}
impl<'a> fmt::Display for Error<'a> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match self {
Error::AstError(error) => {
write!(formatter, "error occurred while creating ast: {}", error)
}
Error::TokenizerError(error) => {
write!(formatter, "error occurred while tokenizing: {}", error)
}
}
}
}
impl<'a> std::error::Error for Error<'a> {}
pub fn parse(code: &str) -> Result<ast::Ast, Error> {
let tokens = tokenizer::tokens(code).map_err(Error::TokenizerError)?;
ast::Ast::from_tokens(tokens).map_err(Error::AstError)
}
pub fn print(ast: &ast::Ast) -> String {
format!("{}{}", ast.nodes(), ast.eof())
}