Skip to main content

oak_xml/
lib.rs

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}