1use crate::ParseState;
2use nargo_ir::{JsProgram, TemplateNodeIR};
3use nargo_types::{NargoValue, Result};
4use std::{collections::HashMap, sync::Arc};
5
6pub trait TemplateParser: Send + Sync {
7 fn parse(&self, state: &mut ParseState, lang: &str) -> Result<Vec<TemplateNodeIR>>;
8}
9
10pub trait ScriptParser: Send + Sync {
11 fn parse(&self, state: &mut ParseState, lang: &str) -> Result<JsProgram>;
12}
13
14pub trait StyleParser: Send + Sync {
15 fn parse(&self, state: &mut ParseState, lang: &str) -> Result<(String, nargo_ir::Trivia)>;
16}
17
18pub trait MetadataParser: Send + Sync {
19 fn parse(&self, state: &mut ParseState, lang: &str) -> Result<(NargoValue, nargo_ir::Trivia)>;
20}
21
22#[derive(Default)]
23pub struct ParserRegistry {
24 template_parsers: HashMap<String, Arc<dyn TemplateParser>>,
25 script_parsers: HashMap<String, Arc<dyn ScriptParser>>,
26 style_parsers: HashMap<String, Arc<dyn StyleParser>>,
27 metadata_parsers: HashMap<String, Arc<dyn MetadataParser>>,
28}
29
30impl ParserRegistry {
31 pub fn new() -> Self {
32 let mut registry = Self::default();
33
34 registry.register_template_parser("nargo", std::sync::Arc::new(crate::oak_template_parser::OakVueTemplateParser));
36
37 registry.register_script_parser("typescript", std::sync::Arc::new(crate::oak_script_parser::OakTypeScriptParser));
39
40 registry.register_style_parser("css", std::sync::Arc::new(crate::oak_style_parser::OakCssParser));
42
43 registry
44 }
45
46 pub fn register_template_parser(&mut self, lang: &str, parser: Arc<dyn TemplateParser>) {
47 self.template_parsers.insert(lang.to_string(), parser);
48 }
49
50 pub fn register_script_parser(&mut self, lang: &str, parser: Arc<dyn ScriptParser>) {
51 self.script_parsers.insert(lang.to_string(), parser);
52 }
53
54 pub fn register_style_parser(&mut self, lang: &str, parser: Arc<dyn StyleParser>) {
55 self.style_parsers.insert(lang.to_string(), parser);
56 }
57
58 pub fn register_metadata_parser(&mut self, lang: &str, parser: Arc<dyn MetadataParser>) {
59 self.metadata_parsers.insert(lang.to_string(), parser);
60 }
61
62 pub fn get_template_parser(&self, lang: &str) -> Option<Arc<dyn TemplateParser>> {
63 self.template_parsers.get(lang).cloned()
64 }
65
66 pub fn get_script_parser(&self, lang: &str) -> Option<Arc<dyn ScriptParser>> {
67 self.script_parsers.get(lang).cloned()
68 }
69
70 pub fn get_style_parser(&self, lang: &str) -> Option<Arc<dyn StyleParser>> {
71 self.style_parsers.get(lang).cloned()
72 }
73
74 pub fn get_metadata_parser(&self, lang: &str) -> Option<Arc<dyn MetadataParser>> {
75 self.metadata_parsers.get(lang).cloned()
76 }
77}