1use crate::YamlLanguage;
2use oak_core::tree::RedNode;
3use oak_lsp::service::LanguageService;
4use oak_vfs::Vfs;
5use std::future::Future;
6
7pub struct YamlLanguageService<V: Vfs> {
9 vfs: V,
10 workspace: oak_lsp::workspace::WorkspaceManager,
11}
12
13impl<V: Vfs> YamlLanguageService<V> {
14 pub fn new(vfs: V) -> Self {
16 Self { vfs, workspace: oak_lsp::workspace::WorkspaceManager::default() }
17 }
18}
19
20impl<V: Vfs + Send + Sync + 'static + oak_vfs::WritableVfs> LanguageService for YamlLanguageService<V> {
21 type Lang = YamlLanguage;
22 type Vfs = V;
23
24 fn vfs(&self) -> &Self::Vfs {
25 &self.vfs
26 }
27
28 fn workspace(&self) -> &oak_lsp::workspace::WorkspaceManager {
29 &self.workspace
30 }
31
32 fn get_root(&self, uri: &str) -> impl Future<Output = Option<RedNode<'_, YamlLanguage>>> + Send + '_ {
33 let source = self.vfs().get_source(uri);
34 async move {
35 let source = source?;
36 let language = YamlLanguage::default();
37 let parser = crate::parser::YamlParser::new(&language);
38 let lexer = crate::lexer::YamlLexer::new(&language);
39
40 let mut cache = oak_core::parser::session::ParseSession::<YamlLanguage>::new(1024);
41 let _output = oak_core::parser::parse(&parser, &lexer, &source, &[], &mut cache);
42
43 None
44 }
45 }
46}