ocsf_codegen/
enums.rs

1use crate::module::{Module, ModuleEnumWithU8};
2use crate::*;
3// use codegen::{Enum, Function, Variant};
4use serde::{Deserialize, Serialize};
5// use itertools::Itertools;
6
7#[allow(dead_code)]
8#[derive(Debug)]
9pub struct EnumDef {
10    class_name: String,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct EnumData {
15    pub caption: String,
16    pub description: Option<String>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct EnumFile {
21    #[serde(alias = "enum")]
22    pub elements: HashMap<u8, EnumData>,
23}
24
25pub fn generate_enums(paths: &DirPaths, root_module: &mut Module) -> Result<(), Box<dyn Error>> {
26    // let mut output_scope = Scope::new();
27
28    // let defaults = get_enum_defaults(paths)?;
29
30    for filename in find_files(&format!("{}enums", paths.schema_path)) {
31        debug!("Enum filename: {filename}");
32
33        let enum_file = read_file_to_value(&filename)?;
34        // debug!("{parsed_file:#?}");
35        let enum_data: crate::module::ModuleEnumWithU8 = enum_from_value(
36            paths,
37            root_module,
38            enum_file,
39            collapsed_title_case(filename.split('/').last().unwrap()),
40        )?;
41
42        root_module.enums.push(enum_data);
43    }
44    Ok(())
45}
46
47impl std::fmt::Display for OcsfCodegenError {
48    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
49        write!(f, "OcsfCodegenError: {}", self.errortext)
50    }
51}
52
53/// Insert a new enum into the target module's scope
54pub fn enum_from_value(
55    paths: &DirPaths,
56    root_module: &mut Module,
57    value: Value,
58    name: String,
59) -> Result<ModuleEnumWithU8, OcsfCodegenError> {
60    if root_module.has_enum(&name) {
61        return Err(OcsfCodegenError::new(format!("Already has enum {name}!")));
62    }
63
64    let mut base_object = ModuleEnumWithU8::new(paths, name);
65
66    let parsed_file: EnumFile = serde_json::from_value(value)
67        .map_err(OcsfCodegenError::from)
68        .unwrap();
69
70    parsed_file.elements.into_iter().for_each(|(key, value)| {
71        base_object.variants.insert(key, value);
72    });
73    debug!("{base_object:#?}");
74
75    // root_module.enums.push(base_object);
76    Ok(base_object)
77}