diff --git a/Cargo.lock b/Cargo.lock index ab205eb..dffc482 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,8 @@ dependencies = [ name = "amqp_codegen" version = "0.1.0" dependencies = [ + "anyhow", + "heck", "strong-xml", ] @@ -77,6 +79,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "heck" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" + [[package]] name = "hermit-abi" version = "0.1.19" diff --git a/amqp_codegen/Cargo.toml b/amqp_codegen/Cargo.toml index 55a4bf4..6c0d404 100644 --- a/amqp_codegen/Cargo.toml +++ b/amqp_codegen/Cargo.toml @@ -6,4 +6,6 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +anyhow = "1.0.53" +heck = "0.4.0" strong-xml = "0.6.3" diff --git a/amqp_codegen/src/main.rs b/amqp_codegen/src/main.rs index 8da8e83..92c4288 100644 --- a/amqp_codegen/src/main.rs +++ b/amqp_codegen/src/main.rs @@ -1,3 +1,5 @@ +use anyhow::Result; +use heck::{ToSnakeCase, ToUpperCamelCase}; use std::fs; use strong_xml::{XmlError, XmlRead}; @@ -63,18 +65,34 @@ struct Field { asserts: Vec, } -fn main() { +fn main() -> Result<()> { let content = fs::read_to_string("./amqp-0-9-1.xml").unwrap(); - let amqp: Result = Amqp::from_str(&content); - - match amqp { - Ok(amqp) => { - println!("{amqp:#?}"); - } - Err(err) => { - eprintln!("{err}"); - return; - } - } + let amqp = Amqp::from_str(&content)?; + codegen(&amqp) +} + +fn codegen(amqp: &Amqp) -> Result<()> { + for class in &amqp.classes { + let enum_name = class.name.to_upper_camel_case(); + println!("///////// ---- Class {enum_name}"); + println!("enum {enum_name} {{"); + for method in &class.methods { + let method_name = method.name.to_upper_camel_case(); + print!(" {method_name}"); + if method.fields.len() > 0 { + println!(" {{"); + for field in &method.fields { + let field_name = field.name.to_snake_case(); + println!(" {field_name}: (),"); + } + println!(" }}"); + } else { + println!(","); + } + } + println!("}}"); + } + + Ok(()) }