dominator_css_bindgen/css/
generate_rust_binding.rs1use crate::codegen::output_model::parsed_to_output_model;
2use crate::codegen::render_output_class::{render_output_class, render_output_style_sheets};
3use crate::codegen::render_variables::{css_ident_to_rust, render_variable_definitions};
4use crate::css::parse_css::{take_next_block, ParsedCssFile};
5use crate::DCssResult;
6use cssparser::{Parser, ParserInput};
7use std::path::Path;
8
9pub fn generate_rust_bindings_from_file(css_file_path: impl AsRef<Path>) -> DCssResult<String> {
10 let css_path = css_file_path.as_ref();
11 let css_module_name = css_ident_to_rust(css_path.file_stem().unwrap().to_str().unwrap());
12 let css_file_content = std::fs::read_to_string(css_path)?;
13
14 let mut input = ParserInput::new(css_file_content.as_str());
15 let mut parser = Parser::new(&mut input);
16
17 let parsed = parse_css_file(&mut parser).unwrap();
18 let referenced_variables = parsed.referenced_variable_names();
19
20 let (output, output_style_sheets) = parsed_to_output_model(vec![parsed]);
21
22 let mut out_items =
23 vec![render_output_style_sheets(output_style_sheets, &css_module_name).to_string()];
24
25 out_items.extend(
26 output
27 .into_iter()
28 .map(|v| render_output_class(v).to_string())
29 .collect::<Vec<_>>(),
30 );
31
32 out_items.push(render_variable_definitions(
33 &css_module_name,
34 referenced_variables,
35 ));
36
37 Ok(out_items.join("\n"))
38}
39
40pub fn parse_css_file<'a, 'aa>(parser: &mut Parser<'a, 'aa>) -> DCssResult<ParsedCssFile<'a>> {
41 let mut out = ParsedCssFile::default();
42
43 while let Some(block) = take_next_block(parser)? {
44 out.blocks.push(block);
45 }
46
47 Ok(out)
48}