1use xee_xpath_compiler::context::Variables;
2use xot::Xot;
3
4use crate::ast_core as ast;
5use crate::error::ElementError as Error;
6use crate::instruction::SequenceConstructorParser;
7use crate::staticeval::static_evaluate;
8use crate::{content::Content, context::Context, element::XsltParser, names::Names, state::State};
9
10type Result<V> = std::result::Result<V, Error>;
11
12pub fn parse_transform(s: &str) -> Result<ast::Transform> {
13 let mut xot = Xot::new();
14 let names = Names::new(&mut xot);
15 let (node, span_info) = xot
16 .parse_with_span_info(s)
17 .map_err(|_e| Error::Unsupported)?;
18 let node = xot.document_element(node).unwrap();
19 let mut state = State::new(xot, span_info, names);
20
21 let mut xot = Xot::new();
22 static_evaluate(&mut state, node, Variables::new(), &mut xot)
23 .map_err(|_e| Error::Unsupported)?;
24 let parser = XsltParser::new(&state);
25 parser.parse_transform(node)
26}
27
28pub fn parse_sequence_constructor_item(s: &str) -> Result<ast::SequenceConstructorItem> {
29 let mut xot = Xot::new();
30 let names = Names::new(&mut xot);
31 let (node, span_info) = xot.parse_with_span_info(s).unwrap();
32 let state = State::new(xot, span_info, names);
33 let node = state.xot.document_element(node).unwrap();
34
35 if let Some(element) = state.xot.element(node) {
36 let context = Context::new(state.xot.prefixes(node));
37 let content = Content::new(node, &state, context);
38 content.parse_element(
39 element,
40 ast::SequenceConstructorItem::parse_sequence_constructor_item,
41 )
42 } else {
43 Err(Error::Internal)
44 }
45}