move codegen to xtask

This commit is contained in:
nora 2022-02-19 20:07:17 +01:00
parent c5d83fe776
commit 077b6fd633
12 changed files with 1456 additions and 1727 deletions

2
.cargo/config.toml Normal file
View file

@ -0,0 +1,2 @@
[alias]
xtask = "run --package xtask --"

18
Cargo.lock generated
View file

@ -37,15 +37,6 @@ dependencies = [
"tracing-subscriber", "tracing-subscriber",
] ]
[[package]]
name = "amqp_codegen"
version = "0.1.0"
dependencies = [
"heck",
"itertools",
"strong-xml",
]
[[package]] [[package]]
name = "amqp_transport" name = "amqp_transport"
version = "0.1.0" version = "0.1.0"
@ -672,3 +663,12 @@ name = "xmlparser"
version = "0.13.3" version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"
[[package]]
name = "xtask"
version = "0.1.0"
dependencies = [
"heck",
"itertools",
"strong-xml",
]

View file

@ -1,5 +1,5 @@
[workspace] [workspace]
members = ["./amqp_transport", "./amqp_codegen"] members = [".", "./amqp_transport", "xtask"]
[package] [package]
name = "amqp" name = "amqp"

View file

@ -1,3 +0,0 @@
codegen for method serialization/deserialization
run using `cargo r > ../amqp_transport/src/classes/generated.rs`

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
[package] [package]
name = "amqp_codegen" name = "xtask"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
@ -8,6 +8,4 @@ edition = "2021"
[dependencies] [dependencies]
heck = "0.4.0" heck = "0.4.0"
itertools = "0.10.3" itertools = "0.10.3"
strong-xml = "0.6.3" strong-xml = "0.6.3"
[features]

View file

@ -2,13 +2,15 @@ mod parser;
mod random; mod random;
mod write; mod write;
use crate::parser::codegen_parser;
use crate::random::codegen_random;
use crate::write::codegen_write;
use heck::ToUpperCamelCase; use heck::ToUpperCamelCase;
use parser::codegen_parser;
use random::codegen_random;
use std::fs; use std::fs;
use std::iter::Peekable; use std::iter::Peekable;
use std::path::PathBuf;
use std::str::FromStr;
use strong_xml::XmlRead; use strong_xml::XmlRead;
use write::codegen_write;
#[derive(Debug, XmlRead)] #[derive(Debug, XmlRead)]
#[xml(tag = "amqp")] #[xml(tag = "amqp")]
@ -97,8 +99,15 @@ struct Doc {
kind: Option<String>, kind: Option<String>,
} }
fn main() { pub fn main() {
let content = fs::read_to_string("./amqp0-9-1.xml").unwrap(); let this_file = PathBuf::from_str(file!()).unwrap();
let expected_location = this_file
.parent()
.unwrap()
.parent()
.unwrap()
.join("amqp0-9-1.xml");
let content = fs::read_to_string(expected_location).unwrap();
let amqp = match Amqp::from_str(&content) { let amqp = match Amqp::from_str(&content) {
Ok(amqp) => amqp, Ok(amqp) => amqp,

View file

@ -1,4 +1,4 @@
use crate::{ use super::{
field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp, Assert, Class, field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp, Assert, Class,
Domain, Method, Domain, Method,
}; };
@ -17,7 +17,7 @@ fn domain_function_name(domain_name: &str) -> String {
format!("domain_{domain_name}") format!("domain_{domain_name}")
} }
pub(crate) fn codegen_parser(amqp: &Amqp) { pub(super) fn codegen_parser(amqp: &Amqp) {
println!( println!(
"pub mod parse {{ "pub mod parse {{
use super::*; use super::*;

View file

@ -1,7 +1,7 @@
use crate::{snake_case, Amqp}; use super::{snake_case, Amqp};
use heck::ToUpperCamelCase; use heck::ToUpperCamelCase;
pub(crate) fn codegen_random(amqp: &Amqp) { pub(super) fn codegen_random(amqp: &Amqp) {
println!( println!(
"#[cfg(test)] "#[cfg(test)]
mod random {{ mod random {{

View file

@ -1,7 +1,7 @@
use crate::{field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp}; use super::{field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp};
use heck::ToUpperCamelCase; use heck::ToUpperCamelCase;
pub(crate) fn codegen_write(amqp: &Amqp) { pub(super) fn codegen_write(amqp: &Amqp) {
println!( println!(
"pub mod write {{ "pub mod write {{
use super::*; use super::*;

22
xtask/src/main.rs Normal file
View file

@ -0,0 +1,22 @@
mod codegen;
fn main() {
let command = std::env::args().nth(1).unwrap_or_else(|| {
eprintln!("No task provided");
help();
std::process::exit(1);
});
match command.as_str() {
"generate" | "gen" => codegen::main(),
_ => eprintln!("Unknown command {command}."),
}
}
fn help() {
println!(
"Available tasks:
generate - Generate amqp method code in `amqp_transport/src/classes/generated.rs.
Dumps code to stdout and should be redirected manually."
);
}