1#![doc = include_str!("readme.md")]
2#![feature(new_range_api)]
3#![warn(missing_docs)]
4#![doc(html_logo_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
5#![doc(html_favicon_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
6
7pub mod ast;
9pub mod builder;
11
12pub mod language;
14pub mod lexer;
16#[cfg(feature = "lsp")]
18pub mod lsp;
19#[cfg(feature = "mcp")]
21pub mod mcp;
22
23pub mod parser;
25
26pub use crate::{
27 ast::RbqRoot,
28 builder::RbqBuilder,
29 language::RbqLanguage,
30 lexer::{RbqLexer, token_type::RbqTokenType},
31 parser::{RbqParser, element_type::RbqElementType},
32};
33
34pub type RbqSyntaxKind = RbqTokenType;
36
37#[cfg(feature = "oak-highlight")]
39pub use crate::lsp::highlighter::RbqHighlighter;
40
41#[cfg(feature = "lsp")]
43pub use crate::lsp::formatter::RbqFormatter;
44
45#[cfg(feature = "lsp")]
47pub use crate::lsp::RbqLanguageService;
48
49#[cfg(feature = "mcp")]
51pub use crate::mcp::serve_rbq_mcp;
52
53pub fn parse(input: &str) -> Result<RbqRoot, oak_core::OakError> {
55 use oak_core::{ParseSession, Parser, tree::RedTree};
56
57 let language = RbqLanguage::new();
59
60 let parser = RbqParser::new(&language);
62
63 let mut session = ParseSession::new(16);
65
66 let output = parser.parse(input, &[], &mut session);
68
69 if let Err(err) = output.result {
71 return Err(err);
72 }
73
74 let tree = output.result.unwrap();
76
77 let red_tree = RedTree::new(&tree);
79
80 let red_node = match red_tree.as_node() {
82 Some(node) => node,
83 None => return Err(oak_core::OakError::custom_error("Root node not found")),
84 };
85
86 let ast = RbqRoot::lower(red_node, input);
88
89 Ok(ast)
90}