nargo_parser/
oak_style_parser.rs1use crate::{ParseState, StyleParser};
2use nargo_ir::Trivia;
3use nargo_types::Result;
4use oak_core::{parser::ParseSession, tree::RedTree, Parser, SourceText};
5use oak_css::{CssLanguage, CssParser};
6
7pub struct OakCssParser;
9
10impl StyleParser for OakCssParser {
11 fn parse(&self, state: &mut ParseState, _lang: &str) -> Result<(String, Trivia)> {
12 let source = SourceText::new(state.cursor.source.to_string());
13 let language = CssLanguage::default();
14 let parser = CssParser::new(&language);
15 let mut session = ParseSession::default();
16 let parse_output = parser.parse(&source, &[], &mut session);
17
18 let green_node = parse_output.result.map_err(|e| nargo_types::Error::parse_error(format!("CSS parsing error: {:?}", e), nargo_types::Span::default()))?;
20 let red_tree = RedTree::new(green_node);
21
22 let (code, trivia) = self.convert_to_ir(&red_tree, &source);
24 Ok((code, trivia))
25 }
26}
27
28impl OakCssParser {
29 fn convert_to_ir(&self, tree: &RedTree<'_, CssLanguage>, source: &SourceText) -> (String, Trivia) {
31 let code = if let RedTree::Node(node) = tree { node.text(source).to_string() } else { "".to_string() };
34 (code, Trivia::default())
35 }
36}