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")]
8pub mod ast;
12pub mod builder;
14
15pub mod language;
17pub mod lexer;
19#[cfg(any(feature = "lsp", feature = "oak-highlight", feature = "oak-pretty-print"))]
21pub mod lsp;
22pub mod parser;
27
28pub use crate::{
29 ast::{DsvField, DsvRecord, DsvRoot},
30 builder::DsvBuilder,
31 language::{Dsv, DsvLanguage},
32 lexer::DsvLexer,
33 parser::DsvParser,
34};
35
36#[cfg(feature = "lsp")]
37pub use crate::lsp::DsvLanguageService;
38
39#[cfg(feature = "serde")]
40pub use crate::language::from_value;
41#[cfg(feature = "serde")]
42pub use crate::language::to_value;
43
44#[cfg(feature = "serde")]
46pub fn to_string_with_config<const LANG: DsvLanguage, T: ::serde::Serialize>(value: &T) -> Result<String, oak_core::OakError> {
47 use oak_core::source::ToSource;
48 let dsv_root = to_value::<LANG, T>(value)?;
49 let mut buffer = oak_core::source::SourceBuffer::default();
50 dsv_root.to_source(&mut buffer);
51 Ok(buffer.finish())
52}
53
54#[cfg(feature = "serde")]
56pub fn from_str_with_config<const LANG: DsvLanguage, T: ::serde::de::DeserializeOwned>(s: &str) -> Result<T, oak_core::OakError> {
57 use oak_core::{Builder, Lexer, Parser};
58 let mut session = oak_core::parser::session::ParseSession::<Dsv<LANG>>::default();
59 let lexer = crate::lexer::DsvLexer::<LANG>::new();
60 lexer.lex(s, &[], &mut session);
61 let parser = crate::parser::DsvParser::<LANG>::new();
62 let parse_result = parser.parse(s, &[], &mut session);
63 let _green_tree = parse_result.result?;
64
65 let builder = crate::builder::DsvBuilder::<LANG>::new();
66 let mut builder_cache = oak_core::parser::session::ParseSession::<Dsv<LANG>>::default();
67 let diagnostics = builder.build(s, &[], &mut builder_cache);
68 let ast_root = diagnostics.result?;
69
70 from_value(ast_root)
71}
72
73pub fn parse<const LANG: DsvLanguage>(dsv: &str) -> Result<crate::ast::DsvRoot<LANG>, oak_core::OakError> {
75 use oak_core::{Builder, parser::session::ParseSession, source::SourceText};
76 let builder = DsvBuilder::<LANG>::new();
77 let source = SourceText::new(dsv.to_string());
78 let mut cache = ParseSession::default();
79 let result = builder.build(&source, &[], &mut cache);
80 result.result
81}