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