#![warn(missing_docs)]
#![allow(clippy::large_enum_variant)]
#![cfg_attr(doc_cfg, feature(doc_auto_cfg))]
pub mod ast;
pub mod node;
pub mod tokenizer;
pub mod visitors;
mod atom;
mod private;
mod short_string;
mod util;
#[cfg(feature = "roblox")]
mod tokenizer_luau;
pub use short_string::ShortString;
use std::fmt;
#[cfg(all(test, not(feature = "serde")))]
compile_error!("Serde feature must be enabled for tests");
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum Error {
AstError(ast::AstError),
TokenizerError(tokenizer::TokenizerError),
}
impl fmt::Display for Error {
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 std::error::Error for Error {}
#[allow(clippy::result_large_err)]
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())
}