#![warn(missing_docs)]
#![allow(clippy::large_enum_variant)]
#![cfg_attr(docsrs, feature(doc_cfg))]
pub mod ast;
pub mod node;
pub mod tokenizer;
pub mod visitors;
mod private;
mod short_string;
mod util;
pub use ast::LuaVersion;
pub use short_string::ShortString;
use tokenizer::Position;
use std::{borrow::Cow, 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 Error {
pub fn error_message(&self) -> Cow<'_, str> {
match self {
Error::AstError(error) => Cow::from(error.error_message()),
Error::TokenizerError(error) => error.to_string().into(),
}
}
pub fn range(&self) -> (Position, Position) {
match self {
Error::AstError(error) => error.range(),
Error::TokenizerError(error) => error.range(),
}
}
}
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, Vec<Error>> {
parse_fallible(code, LuaVersion::new()).into_result()
}
pub fn parse_fallible(code: &str, lua_version: LuaVersion) -> ast::AstResult {
ast::AstResult::parse_fallible(code, lua_version)
}