Skip to main content

nargo_parser/
registry.rs

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        // Register default template parser
35        registry.register_template_parser("nargo", std::sync::Arc::new(crate::oak_template_parser::OakVueTemplateParser));
36
37        // Register default script parser
38        registry.register_script_parser("typescript", std::sync::Arc::new(crate::oak_script_parser::OakTypeScriptParser));
39
40        // Register default style parser
41        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}