mirror of
https://github.com/Noratrieb/haesli.git
synced 2026-01-16 20:55:03 +01:00
start with write
This commit is contained in:
parent
83778ac2c9
commit
cb3710cd3f
6 changed files with 1337 additions and 699 deletions
|
|
@ -1,9 +1,11 @@
|
||||||
mod parser;
|
mod parser;
|
||||||
|
mod write;
|
||||||
|
|
||||||
use crate::parser::codegen_parser;
|
use crate::parser::codegen_parser;
|
||||||
use heck::ToUpperCamelCase;
|
use heck::ToUpperCamelCase;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use strong_xml::XmlRead;
|
use strong_xml::XmlRead;
|
||||||
|
use crate::write::codegen_write;
|
||||||
|
|
||||||
#[derive(Debug, XmlRead)]
|
#[derive(Debug, XmlRead)]
|
||||||
#[xml(tag = "amqp")]
|
#[xml(tag = "amqp")]
|
||||||
|
|
@ -87,6 +89,7 @@ fn codegen(amqp: &Amqp) {
|
||||||
codegen_domain_defs(amqp);
|
codegen_domain_defs(amqp);
|
||||||
codegen_class_defs(amqp);
|
codegen_class_defs(amqp);
|
||||||
codegen_parser(amqp);
|
codegen_parser(amqp);
|
||||||
|
codegen_write(amqp);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_domain_defs(amqp: &Amqp) {
|
fn codegen_domain_defs(amqp: &Amqp) {
|
||||||
|
|
|
||||||
48
amqp_codegen/src/write.rs
Normal file
48
amqp_codegen/src/write.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
use crate::{field_type, resolve_type_from_domain, snake_case, Amqp};
|
||||||
|
use heck::ToUpperCamelCase;
|
||||||
|
|
||||||
|
pub(crate) fn codegen_write(amqp: &Amqp) {
|
||||||
|
println!(
|
||||||
|
"mod write {{
|
||||||
|
use super::*;
|
||||||
|
use crate::classes::write_helper::*;
|
||||||
|
use crate::error::TransError;
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
pub fn write_method<W: Write>(class: Class, mut writer: W) -> Result<(), TransError> {{
|
||||||
|
match class {{"
|
||||||
|
);
|
||||||
|
|
||||||
|
for class in &amqp.classes {
|
||||||
|
let class_name = class.name.to_upper_camel_case();
|
||||||
|
let class_index = class.index;
|
||||||
|
for method in &class.methods {
|
||||||
|
let method_name = method.name.to_upper_camel_case();
|
||||||
|
let method_index = method.index;
|
||||||
|
println!(" Class::{class_name}({class_name}::{method_name} {{");
|
||||||
|
for field in &method.fields {
|
||||||
|
let field_name = snake_case(&field.name);
|
||||||
|
println!(" {field_name},");
|
||||||
|
}
|
||||||
|
println!(" }}) => {{");
|
||||||
|
println!(" writer.write_all(&[{class_index}, {method_index}])?;");
|
||||||
|
for field in &method.fields {
|
||||||
|
let field_name = snake_case(&field.name);
|
||||||
|
let field_type = resolve_type_from_domain(amqp, field_type(field));
|
||||||
|
if field_type == "bit" {
|
||||||
|
println!(" todo!();");
|
||||||
|
} else {
|
||||||
|
println!(" {field_type}({field_name}, &mut writer)?;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!(" }}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
" }}
|
||||||
|
Ok(())
|
||||||
|
}}
|
||||||
|
}}"
|
||||||
|
);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -4,6 +4,7 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
mod generated;
|
mod generated;
|
||||||
mod parse_helper;
|
mod parse_helper;
|
||||||
|
mod write_helper;
|
||||||
|
|
||||||
pub type Table = HashMap<String, FieldValue>;
|
pub type Table = HashMap<String, FieldValue>;
|
||||||
|
|
||||||
|
|
|
||||||
47
amqp_transport/src/classes/write_helper.rs
Normal file
47
amqp_transport/src/classes/write_helper.rs
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
use crate::classes::generated::{
|
||||||
|
Bit, Long, Longlong, Longstr, Octet, Short, Shortstr, Table, Timestamp,
|
||||||
|
};
|
||||||
|
use crate::error::TransError;
|
||||||
|
use std::io;
|
||||||
|
use std::io::Write;
|
||||||
|
|
||||||
|
fn error(e: io::Error) -> TransError {
|
||||||
|
TransError::Other(e.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn octet<W: Write>(value: Octet, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
writer.write_all(&[value])?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn short<W: Write>(value: Short, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn long<W: Write>(value: Long, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn longlong<W: Write>(value: Longlong, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn bit<W: Write>(value: Vec<Bit>, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shortstr<W: Write>(value: Shortstr, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn longstr<W: Write>(value: Longstr, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn timestamp<W: Write>(value: Timestamp, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn table<W: Write>(value: Table, writer: &mut W) -> Result<(), TransError> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::io::Error;
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum TransError {
|
pub enum TransError {
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
|
|
@ -6,6 +8,12 @@ pub enum TransError {
|
||||||
Other(#[from] anyhow::Error),
|
Other(#[from] anyhow::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<std::io::Error> for TransError {
|
||||||
|
fn from(err: Error) -> Self {
|
||||||
|
Self::Other(err.into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum ProtocolError {
|
pub enum ProtocolError {
|
||||||
#[error("fatal error")]
|
#[error("fatal error")]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue