#![allow(ambiguous_glob_reexports)]
mod composite;
pub use self::composite::*;
pub mod common;
pub use self::common::*;
pub mod constructor;
pub use self::constructor::*;
mod expressions;
pub use self::expressions::*;
mod functions;
pub use self::functions::*;
mod interface;
pub use self::interface::*;
mod indent_display;
use indent_display::*;
pub mod const_eval;
mod library;
pub use self::library::*;
mod mapping;
pub use self::mapping::*;
mod module;
pub use self::module::*;
mod passes;
pub use self::passes::*;
mod program;
pub use self::program::*;
mod statement;
pub use self::statement::*;
mod storage;
pub use self::storage::*;
mod types;
pub use self::types::*;
mod stub;
pub use self::stub::*;
pub use common::node::*;
#[allow(clippy::large_enum_variant)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Ast {
Program(Program),
Library(Library),
}
impl std::fmt::Display for Ast {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Ast::Program(program) => write!(f, "{}", program),
Ast::Library(library) => write!(f, "{}", library),
}
}
}
impl Default for Ast {
fn default() -> Self {
Ast::Program(Program::default())
}
}
impl Ast {
pub fn map(self, program_fn: impl FnOnce(Program) -> Program, library_fn: impl FnOnce(Library) -> Library) -> Self {
match self {
Ast::Program(p) => Ast::Program(program_fn(p)),
Ast::Library(l) => Ast::Library(library_fn(l)),
}
}
pub fn try_map<E>(
self,
program_fn: impl FnOnce(Program) -> Result<Program, E>,
library_fn: impl FnOnce(Library) -> Result<Library, E>,
) -> Result<Self, E> {
match self {
Ast::Program(p) => Ok(Ast::Program(program_fn(p)?)),
Ast::Library(l) => Ok(Ast::Library(library_fn(l)?)),
}
}
pub fn visit(&self, program_fn: impl FnOnce(&Program), library_fn: impl FnOnce(&Library)) {
match self {
Ast::Program(p) => program_fn(p),
Ast::Library(l) => library_fn(l),
}
}
}