dominator_css_bindgen/css/
generate_rust_binding.rs

1use 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}