1#![doc = include_str!("readme.md")]
2#![feature(new_range_api)]
3#![feature(adt_const_params)]
4#![allow(incomplete_features)]
5#![warn(missing_docs)]
6#![doc(html_logo_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
7#![doc(html_favicon_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
8
9pub mod ast;
11pub mod builder;
13
14pub mod language;
16pub mod lexer;
18#[cfg(any(feature = "lsp", feature = "oak-highlight", feature = "oak-pretty-print"))]
20pub mod lsp;
21pub mod parser;
26
27pub use crate::{
28 ast::{DsvField, DsvRecord, DsvRoot},
29 builder::DsvBuilder,
30 language::{Dsv, DsvLanguage},
31 lexer::DsvLexer,
32 parser::DsvParser,
33};
34
35#[cfg(feature = "lsp")]
36pub use crate::lsp::DsvLanguageService;
37
38#[cfg(feature = "serde")]
39pub use crate::language::from_value;
40#[cfg(feature = "serde")]
41pub use crate::language::to_value;
42
43#[cfg(feature = "serde")]
45pub fn to_string_with_config<const LANG: DsvLanguage, T: ::serde::Serialize>(value: &T) -> Result<String, oak_core::OakError> {
46 use oak_core::source::ToSource;
47 let dsv_root = to_value::<LANG, T>(value)?;
48 let mut buffer = oak_core::source::SourceBuffer::default();
49 dsv_root.to_source(&mut buffer);
50 Ok(buffer.finish())
51}
52
53#[cfg(feature = "serde")]
55pub fn from_str_with_config<const LANG: DsvLanguage, T: ::serde::de::DeserializeOwned>(s: &str) -> Result<T, oak_core::OakError> {
56 use oak_core::{Builder, Lexer, Parser};
57 let mut session = oak_core::parser::session::ParseSession::<Dsv<LANG>>::default();
58 let lexer = crate::lexer::DsvLexer::<LANG>::new();
59 lexer.lex(s, &[], &mut session);
60 let parser = crate::parser::DsvParser::<LANG>::new();
61 let parse_result = parser.parse(s, &[], &mut session);
62 let _green_tree = parse_result.result?;
63
64 let builder = crate::builder::DsvBuilder::<LANG>::new();
65 let mut builder_cache = oak_core::parser::session::ParseSession::<Dsv<LANG>>::default();
66 let diagnostics = builder.build(s, &[], &mut builder_cache);
67 let ast_root = diagnostics.result?;
68
69 from_value(ast_root)
70}
71
72pub fn parse<const LANG: DsvLanguage>(dsv: &str) -> Result<crate::ast::DsvRoot<LANG>, oak_core::OakError> {
74 use oak_core::{Builder, parser::session::ParseSession, source::SourceText};
75 let builder = DsvBuilder::<LANG>::new();
76 let source = SourceText::new(dsv.to_string());
77 let mut cache = ParseSession::default();
78 let result = builder.build(&source, &[], &mut cache);
79 result.result
80}