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>,
| 52 | |
| 53 | /// Generate Rust code for a CSS spec module |
| 54 | pub 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, |
no test coverage detected