Skip to main content

oak_dsv/
lib.rs

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
9/// AST module.
10pub mod ast;
11/// Builder module.
12pub mod builder;
13
14/// Language configuration module.
15pub mod language;
16/// Lexer module.
17pub mod lexer;
18/// LSP module.
19#[cfg(any(feature = "lsp", feature = "oak-highlight", feature = "oak-pretty-print"))]
20pub mod lsp;
21// /// MCP module.
22// #[cfg(feature = "mcp")]
23// pub mod mcp;
24/// Parser module.
25pub 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/// Serializes the given value to a DSV string with the given configuration.
44#[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/// Deserializes a DSV string into a value of type `T` with the given configuration.
54#[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
72/// Parses a DSV string into a `DsvRoot` AST.
73pub 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}