MCPcopy Create free account
hub / github.com/csskit/csskit / generate_spec_module

Function generate_spec_module

crates/csskit_spec_generator/src/codegen.rs:54–139  ·  view source on GitHub ↗

Generate Rust code for a CSS spec module

(
	spec_name: &str,
	version: usize,
	properties: &[PropertyDefinition],
	spec_url: Option<&str>,
	doc_label: Option<&str>,
	property_descriptions: &HashMap<String, String>,
	csswg_sha: Option<&str>,

Source from the content-addressed store, hash-verified

52
53/// Generate Rust code for a CSS spec module
54pub fn generate_spec_module(
55 spec_name: &str,
56 version: usize,
57 properties: &[PropertyDefinition],
58 spec_url: Option<&str>,
59 doc_label: Option<&str>,
60 property_descriptions: &HashMap<String, String>,
61 csswg_sha: Option<&str>,
62) -> String {
63 let base_url =
64 spec_url.map(str::to_string).unwrap_or_else(|| format!("https://drafts.csswg.org/{}-{}/", spec_name, version));
65 let label = doc_label.map(str::to_string).unwrap_or_else(|| format!("{}-{}", spec_name, version));
66 let lookup_name = strip_css_prefix(spec_name);
67
68 let module_doc = format!("//! {}\n", base_url);
69
70 let autogen_notice = if let Some(sha) = csswg_sha {
71 format!(
72 "// AUTO-GENERATED from w3c/csswg-drafts\n// Commit: https://github.com/w3c/csswg-drafts/commit/{}\n// Do not edit this file directly.\n",
73 sha
74 )
75 } else {
76 "// AUTO-GENERATED - Do not edit this file directly.\n".to_string()
77 };
78
79 let ignore_properties = get_ignore_properties();
80 let should_ignore: HashSet<String> = ignore_properties.get(lookup_name).cloned().unwrap_or_default();
81
82 let mut filtered_properties: Vec<_> =
83 properties.iter().filter(|prop| !should_ignore.contains(&prop.name)).collect();
84 filtered_properties.sort_by_key(|prop| &prop.name);
85
86 let todo_properties = get_todo_properties();
87 let should_comment_out: HashSet<String> = todo_properties.get(lookup_name).cloned().unwrap_or_default();
88
89 let value_extensions = get_value_extensions();
90 let spec_extensions = value_extensions.get(lookup_name);
91
92 let value_replacements = get_value_replacements();
93 let spec_replacement = value_replacements.get(lookup_name);
94
95 let manual_parse_properties = get_manual_parse_properties();
96 let should_skip_parse: HashSet<String> = manual_parse_properties.get(lookup_name).cloned().unwrap_or_default();
97
98 let shorthands = get_shorthand_properties();
99 let expanded_longhands_map = compute_all_expanded_longhands(&shorthands);
100
101 let property_types = filtered_properties.iter().map(|prop| {
102 let description = property_descriptions.get(&prop.name);
103 let extension = spec_extensions.and_then(|ext| ext.get(&prop.name).map(|s| s.as_str()));
104 let replacement = spec_replacement.and_then(|ext| ext.get(&prop.name).map(|s| s.as_str()));
105 let skip_parse = should_skip_parse.contains(&prop.name);
106 let expanded_longhands = expanded_longhands_map.get(&prop.name);
107 generate_property_type(
108 &base_url,
109 &label,
110 spec_name,
111 prop,

Callers 2

generate_single_specFunction · 0.85
mainFunction · 0.85

Calls 15

get_ignore_propertiesFunction · 0.85
get_todo_propertiesFunction · 0.85
get_value_extensionsFunction · 0.85
get_value_replacementsFunction · 0.85
get_shorthand_propertiesFunction · 0.85
generate_property_typeFunction · 0.85
fix_formattingFunction · 0.85
comment_out_propertiesFunction · 0.85
collectMethod · 0.80

Tested by

no test coverage detected