1#![doc = include_str!("readme.md")]
2#![feature(new_range_api)]
3#![warn(missing_docs)]
4
5pub mod ast;
7pub mod builder;
9pub mod language;
11pub mod lexer;
13pub mod parser;
15
16#[cfg(feature = "lsp")]
18pub mod lsp;
19
20pub use crate::{
21 ast::{TsvField, TsvRecord, TsvRoot},
22 builder::TsvBuilder,
23 language::{TSV_LANG, TsvLanguage},
24 lexer::TsvLexer,
25 parser::TsvParser,
26};
27
28pub type TsvRootNode = crate::ast::TsvRoot;
30
31#[cfg(feature = "serde")]
33pub fn to_string<T: ::serde::Serialize>(value: &T) -> Result<String, oak_core::OakError> {
35 oak_dsv::to_string_with_config::<TSV_LANG, T>(value)
36}
37
38#[cfg(feature = "serde")]
40pub fn from_str<T: ::serde::de::DeserializeOwned>(s: &str) -> Result<T, oak_core::OakError> {
42 oak_dsv::from_str_with_config::<TSV_LANG, T>(s)
43}
44
45pub fn language() -> oak_dsv::DsvLanguage {
47 TSV_LANG
48}
49
50pub fn parse(tsv: &str) -> Result<crate::ast::TsvRoot, oak_core::OakError> {
52 use oak_core::{Builder, parser::session::ParseSession, source::SourceText};
53 let builder = TsvBuilder::new();
54 let source = SourceText::new(tsv.to_string());
55 let mut cache = ParseSession::default();
56 let result = builder.build(&source, &[], &mut cache);
57 result.result
58}
59
60#[cfg(feature = "lsp")]
62pub use crate::lsp::TsvLanguageService;