mirror of
https://github.com/cubixle/radius-rs.git
synced 2026-04-30 06:48:40 +01:00
Respect the pre-defined attribute type on each value
This commit is contained in:
+60
-25
@@ -131,31 +131,36 @@ fn main() {
|
||||
.collect();
|
||||
dict_file_paths.sort();
|
||||
|
||||
let mut rfc_names: Vec<String> = Vec::new();
|
||||
let mut attribute_name_to_rfc_name: HashMap<String, String> = HashMap::new();
|
||||
|
||||
for dict_file_path in dict_file_paths {
|
||||
let (radius_attributes, radius_attribute_to_values_map) =
|
||||
parse_dict_file(dict_file_path).unwrap();
|
||||
|
||||
let rfc_name = dict_file_path.extension().unwrap().to_str().unwrap();
|
||||
|
||||
for attr in &radius_attributes {
|
||||
attribute_name_to_rfc_name.insert(attr.name.clone(), rfc_name.to_owned());
|
||||
}
|
||||
|
||||
let value_defined_attributes_set = radius_attribute_to_values_map
|
||||
.keys()
|
||||
.collect::<HashSet<&String>>();
|
||||
|
||||
let rfc_name = dict_file_path.extension().unwrap().to_str().unwrap();
|
||||
let mut w = BufWriter::new(File::create(out_dir.join(format!("{}.rs", rfc_name))).unwrap());
|
||||
|
||||
generate_header(&mut w);
|
||||
generate_header(&mut w, &rfc_names);
|
||||
generate_attributes_code(&mut w, &radius_attributes, &value_defined_attributes_set);
|
||||
generate_values_code(&mut w, &radius_attribute_to_values_map);
|
||||
generate_values_code(
|
||||
&mut w,
|
||||
&radius_attribute_to_values_map,
|
||||
&attribute_name_to_rfc_name,
|
||||
);
|
||||
|
||||
for attr in &radius_attributes {
|
||||
attribute_name_to_rfc_name.insert(attr.name.clone(), rfc_name.to_owned());
|
||||
}
|
||||
rfc_names.push(rfc_name.to_owned());
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_header(w: &mut BufWriter<File>) {
|
||||
fn generate_header(w: &mut BufWriter<File>, rfc_names: &[String]) {
|
||||
let code = b"// Code generated by machine generator; DO NOT EDIT.
|
||||
|
||||
use std::net::{Ipv4Addr, Ipv6Addr};
|
||||
@@ -169,41 +174,71 @@ use crate::tag::Tag;
|
||||
";
|
||||
|
||||
w.write_all(code).unwrap();
|
||||
|
||||
for rfc_name in rfc_names {
|
||||
w.write_all(format!("use crate::{};\n", rfc_name).as_bytes())
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_values_code(
|
||||
w: &mut BufWriter<File>,
|
||||
attr_to_values_map: &BTreeMap<String, Vec<RadiusValue>>,
|
||||
attr_name_to_rfc_name: &HashMap<String, String>,
|
||||
) {
|
||||
for (attr, values) in attr_to_values_map {
|
||||
generate_values_for_attribute_code(w, attr, values);
|
||||
generate_values_for_attribute_code(w, attr, values, attr_name_to_rfc_name.get(attr));
|
||||
}
|
||||
}
|
||||
|
||||
fn generate_values_for_attribute_code(w: &mut BufWriter<File>, attr: &str, values: &[RadiusValue]) {
|
||||
fn generate_values_for_attribute_code(
|
||||
w: &mut BufWriter<File>,
|
||||
attr: &str,
|
||||
values: &[RadiusValue],
|
||||
maybe_rfc_name: Option<&String>,
|
||||
) {
|
||||
let type_name = attr.to_pascal_case();
|
||||
w.write_all(
|
||||
format!(
|
||||
"\npub type {type_name} = {radius_value_type};\n",
|
||||
type_name = type_name,
|
||||
radius_value_type = RADIUS_VALUE_TYPE
|
||||
)
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap();
|
||||
for v in values {
|
||||
|
||||
if maybe_rfc_name.is_none() {
|
||||
w.write_all(
|
||||
format!(
|
||||
"pub const {type_name_prefix}_{value_name}: {type_name} = {value};\n",
|
||||
type_name_prefix = type_name.to_screaming_snake_case(),
|
||||
value_name = v.name.to_screaming_snake_case(),
|
||||
"\npub type {type_name} = {radius_value_type};\n",
|
||||
type_name = type_name,
|
||||
value = v.value,
|
||||
radius_value_type = RADIUS_VALUE_TYPE
|
||||
)
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
for v in values {
|
||||
if let Some(rfc_name) = maybe_rfc_name {
|
||||
w.write_all(
|
||||
format!(
|
||||
"pub const {type_name_prefix}_{value_name}: {rfc_name}::{type_name} = {value};\n",
|
||||
type_name_prefix = type_name.to_screaming_snake_case(),
|
||||
value_name = v.name.to_screaming_snake_case(),
|
||||
rfc_name = rfc_name,
|
||||
type_name = type_name,
|
||||
value = v.value,
|
||||
)
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap()
|
||||
} else {
|
||||
w.write_all(
|
||||
format!(
|
||||
"pub const {type_name_prefix}_{value_name}: {type_name} = {value};\n",
|
||||
type_name_prefix = type_name.to_screaming_snake_case(),
|
||||
value_name = v.name.to_screaming_snake_case(),
|
||||
type_name = type_name,
|
||||
value = v.value,
|
||||
)
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
w.write_all(b"\n").unwrap();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user