pub mod calc;
pub mod repr;
pub mod sys;
pub use typst_macros::{scope, ty};
mod args;
mod array;
mod auto;
mod bool;
mod bytes;
mod cast;
mod content;
mod context;
mod datetime;
mod decimal;
mod dict;
mod duration;
mod element;
mod fields;
mod float;
mod func;
mod int;
mod label;
mod methods;
mod module;
mod none;
mod plugin;
mod scope;
mod selector;
mod str;
mod styles;
mod ty;
mod value;
mod version;
pub use self::args::*;
pub use self::array::*;
pub use self::auto::*;
pub use self::bytes::*;
pub use self::cast::*;
pub use self::content::*;
pub use self::context::*;
pub use self::datetime::*;
pub use self::decimal::*;
pub use self::dict::*;
pub use self::duration::*;
pub use self::element::*;
pub use self::fields::*;
pub use self::float::*;
pub use self::func::*;
pub use self::int::*;
pub use self::label::*;
pub(crate) use self::methods::*;
pub use self::module::*;
pub use self::none::*;
pub use self::plugin::*;
pub use self::repr::Repr;
pub use self::scope::*;
pub use self::selector::*;
pub use self::str::*;
pub use self::styles::*;
pub use self::ty::*;
pub use self::value::*;
pub use self::version::*;
#[rustfmt::skip]
#[doc(hidden)]
pub use {
ecow::{eco_format, eco_vec},
indexmap::IndexMap,
once_cell::sync::Lazy,
};
use ecow::EcoString;
use crate::diag::{bail, SourceResult, StrResult};
use crate::engine::Engine;
use crate::eval::EvalMode;
use crate::syntax::Spanned;
#[category]
pub static FOUNDATIONS: Category;
pub(super) fn define(global: &mut Scope, inputs: Dict) {
global.category(FOUNDATIONS);
global.define_type::<bool>();
global.define_type::<i64>();
global.define_type::<f64>();
global.define_type::<Str>();
global.define_type::<Label>();
global.define_type::<Bytes>();
global.define_type::<Content>();
global.define_type::<Array>();
global.define_type::<Dict>();
global.define_type::<Func>();
global.define_type::<Args>();
global.define_type::<Type>();
global.define_type::<Module>();
global.define_type::<Regex>();
global.define_type::<Selector>();
global.define_type::<Datetime>();
global.define_type::<Decimal>();
global.define_type::<Duration>();
global.define_type::<Version>();
global.define_type::<Plugin>();
global.define_func::<repr::repr>();
global.define_func::<panic>();
global.define_func::<assert>();
global.define_func::<eval>();
global.define_func::<style>();
global.define_module(calc::module());
global.define_module(sys::module(inputs));
}
#[func(keywords = ["error"])]
pub fn panic(
#[variadic]
values: Vec<Value>,
) -> StrResult<Never> {
let mut msg = EcoString::from("panicked");
if !values.is_empty() {
msg.push_str(" with: ");
for (i, value) in values.iter().enumerate() {
if i > 0 {
msg.push_str(", ");
}
msg.push_str(&value.repr());
}
}
Err(msg)
}
#[func(scope)]
pub fn assert(
condition: bool,
#[named]
message: Option<EcoString>,
) -> StrResult<NoneValue> {
if !condition {
if let Some(message) = message {
bail!("assertion failed: {message}");
} else {
bail!("assertion failed");
}
}
Ok(NoneValue)
}
#[scope]
impl assert {
#[func(title = "Assert Equal")]
pub fn eq(
left: Value,
right: Value,
#[named]
message: Option<EcoString>,
) -> StrResult<NoneValue> {
if left != right {
if let Some(message) = message {
bail!("equality assertion failed: {message}");
} else {
bail!(
"equality assertion failed: value {} was not equal to {}",
left.repr(),
right.repr()
);
}
}
Ok(NoneValue)
}
#[func(title = "Assert Not Equal")]
pub fn ne(
left: Value,
right: Value,
#[named]
message: Option<EcoString>,
) -> StrResult<NoneValue> {
if left == right {
if let Some(message) = message {
bail!("inequality assertion failed: {message}");
} else {
bail!(
"inequality assertion failed: value {} was equal to {}",
left.repr(),
right.repr()
);
}
}
Ok(NoneValue)
}
}
#[func(title = "Evaluate")]
pub fn eval(
engine: &mut Engine,
source: Spanned<String>,
#[named]
#[default(EvalMode::Code)]
mode: EvalMode,
#[named]
#[default]
scope: Dict,
) -> SourceResult<Value> {
let Spanned { v: text, span } = source;
let dict = scope;
let mut scope = Scope::new();
for (key, value) in dict {
scope.define_spanned(key, value, span);
}
crate::eval::eval_string(engine.world, &text, span, mode, scope)
}