use crate::{ParseState, StyleParser};
use nargo_ir::Trivia;
use nargo_types::Result;
use oak_core::{parser::ParseSession, tree::RedTree, Parser, SourceText};
use oak_css::{CssLanguage, CssParser};
pub struct OakCssParser;
impl StyleParser for OakCssParser {
fn parse(&self, state: &mut ParseState, _lang: &str) -> Result<(String, Trivia)> {
let source = SourceText::new(state.cursor.source.to_string());
let language = CssLanguage::default();
let parser = CssParser::new(&language);
let mut session = ParseSession::default();
let parse_output = parser.parse(&source, &[], &mut session);
let green_node = parse_output.result.map_err(|e| nargo_types::Error::parse_error(format!("CSS parsing error: {:?}", e), nargo_types::Span::default()))?;
let red_tree = RedTree::new(green_node);
let (code, trivia) = self.convert_to_ir(&red_tree, &source);
Ok((code, trivia))
}
}
impl OakCssParser {
fn convert_to_ir(&self, tree: &RedTree<'_, CssLanguage>, source: &SourceText) -> (String, Trivia) {
let code = if let RedTree::Node(node) = tree { node.text(source).to_string() } else { "".to_string() };
(code, Trivia::default())
}
}