1#![feature(new_range_api)]
2#![doc = include_str!("readme.md")]
3#![doc(html_logo_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
4#![doc(html_favicon_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
5
6pub mod ast;
7pub mod builder;
8mod kind;
9mod language;
10mod lexer;
11pub mod parser;
12pub mod serde;
13
14pub use crate::{
15 ast::{XmlNodeExt, XmlValue},
16 kind::XmlSyntaxKind,
17 language::XmlLanguage,
18 lexer::XmlLexer,
19 parser::XmlParser,
20 serde::{from_value, to_value},
21};
22
23pub fn to_string<T: ::serde::Serialize>(value: &T) -> Result<String, String> {
24 let xml_value = to_value(value).map_err(String::from)?;
25 Ok(xml_value.to_string())
26}
27
28pub fn from_str<T: ::serde::de::DeserializeOwned>(s: &str) -> Result<T, String> {
29 let xml_value = parse(s)?;
30 from_value(xml_value).map_err(String::from)
31}
32
33pub fn parse(xml: &str) -> Result<XmlValue, String> {
34 use crate::builder::XmlBuilder;
35 use oak_core::{SourceText, builder::Builder, parser::ParseSession};
36 let builder = XmlBuilder::new();
37 let source = SourceText::new(xml.to_string());
38 let mut cache = ParseSession::default();
39 let result = builder.build(&source, &[], &mut cache);
40 result.result.map(|root| root.value).map_err(|e| format!("Parse failed: {:?}, diagnostics: {:?}", e, result.diagnostics))
41}