typst_shim/stable/
eval.rs1use comemo::Track;
4use typst::World;
5use typst::diag::SourceResult;
6use typst::engine::{Engine, Route, Sink, Traced};
7use typst::foundations::{Context, Func, Module, Value};
8use typst::introspection::Introspector;
9use typst::syntax::Source;
10
11pub use typst_eval::*;
12
13pub fn eval_compat(world: &dyn World, source: &Source) -> SourceResult<Module> {
15 let route = Route::default();
16 let traced = Traced::default();
17 let mut sink = Sink::default();
18
19 typst_eval::eval(
20 &typst::ROUTINES,
21 world.track(),
22 traced.track(),
23 sink.track_mut(),
24 route.track(),
25 source,
26 )
27}
28
29pub struct TypstEngine<'a> {
31 pub introspector: Introspector,
33 pub traced: Traced,
35 pub route: Route<'static>,
38 pub sink: Sink,
44 pub world: &'a dyn World,
46}
47
48impl<'a> TypstEngine<'a> {
49 pub fn new(world: &'a dyn World) -> Self {
51 Self {
52 introspector: Introspector::default(),
53 traced: Traced::default(),
54 route: Route::default(),
55 sink: Sink::default(),
56 world,
57 }
58 }
59
60 pub fn as_engine(&'a mut self) -> Engine<'a> {
62 Engine {
63 routines: &typst::ROUTINES,
64 world: self.world.track(),
65 introspector: self.introspector.track(),
66 traced: self.traced.track(),
67 sink: self.sink.track_mut(),
68 route: self.route.clone(),
69 }
70 }
71
72 pub fn apply(&'a mut self, func: &Func, ctx: Context, args: Vec<Value>) -> SourceResult<Value> {
74 func.call(&mut self.as_engine(), ctx.track(), args)
75 }
76
77 pub fn call(&'a mut self, func: &Func, ctx: Context) -> SourceResult<Value> {
79 self.apply(func, ctx, vec![])
80 }
81}