1use xee_name::{Namespaces, FN_NAMESPACE};
2use xot::{Node, Xot};
3
4use xee_interpreter::context::StaticContext;
5use xee_interpreter::error;
6use xee_interpreter::interpreter::Program;
7use xee_interpreter::sequence;
8
9use crate::ast_ir::parse;
10
11pub fn evaluate_program(
12 xot: &mut Xot,
13 program: &Program,
14 root: Node,
15) -> error::SpannedResult<sequence::Sequence> {
16 let mut documents = xee_interpreter::xml::Documents::new();
17 let handle = documents.add_root(None, root).unwrap();
18 let root = documents.get_node_by_handle(handle).unwrap();
19 let mut dynamic_context_builder = program.dynamic_context_builder();
20 dynamic_context_builder.context_node(root);
21 dynamic_context_builder.documents(documents);
22 let context = dynamic_context_builder.build();
23 let runnable = program.runnable(&context);
24 runnable.many(xot)
25}
26
27pub fn evaluate(xot: &mut Xot, xml: &str, xslt: &str) -> error::SpannedResult<sequence::Sequence> {
28 let namespaces = Namespaces::new(
29 Namespaces::default_namespaces(),
30 "".to_string(),
31 FN_NAMESPACE.to_string(),
32 );
33 let static_context = StaticContext::from_namespaces(namespaces);
34 let root = xot.parse(xml).unwrap();
35 let program = parse(static_context, xslt).unwrap();
36 evaluate_program(xot, &program, root)
37}