1use crate::module::{Module, ModuleEnumWithU8};
2use crate::*;
3use serde::{Deserialize, Serialize};
5#[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 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 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
53pub 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 Ok(base_object)
77}