mirror of
https://github.com/Noratrieb/haesli.git
synced 2026-01-14 19:55:03 +01:00
write completed (hopoefully)
This commit is contained in:
parent
427cfadc11
commit
2aeb588ab3
5 changed files with 117 additions and 113 deletions
|
|
@ -5,6 +5,7 @@ use crate::parser::codegen_parser;
|
|||
use crate::write::codegen_write;
|
||||
use heck::ToUpperCamelCase;
|
||||
use std::fs;
|
||||
use std::iter::Peekable;
|
||||
use strong_xml::XmlRead;
|
||||
|
||||
#[derive(Debug, XmlRead)]
|
||||
|
|
@ -191,6 +192,27 @@ fn snake_case(ident: &str) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
fn subsequent_bit_fields<'a>(
|
||||
amqp: &Amqp,
|
||||
bit_field: &'a Field,
|
||||
iter: &mut Peekable<impl Iterator<Item = &'a Field>>,
|
||||
) -> Vec<&'a Field> {
|
||||
let mut fields_with_bit = vec![bit_field];
|
||||
|
||||
loop {
|
||||
if iter
|
||||
.peek()
|
||||
.map(|f| resolve_type_from_domain(amqp, field_type(f)) == "bit")
|
||||
.unwrap_or(false)
|
||||
{
|
||||
fields_with_bit.push(iter.next().unwrap());
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
fields_with_bit
|
||||
}
|
||||
|
||||
fn invariants<'a>(asserts: impl Iterator<Item = &'a Assert>) -> String {
|
||||
asserts
|
||||
.map(|assert| match &*assert.check {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
use crate::{
|
||||
field_type, resolve_type_from_domain, snake_case, Amqp, Assert, Class, Domain, Method,
|
||||
field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp, Assert, Class,
|
||||
Domain, Method,
|
||||
};
|
||||
use heck::{ToSnakeCase, ToUpperCamelCase};
|
||||
use itertools::Itertools;
|
||||
|
|
@ -99,19 +100,7 @@ fn method_parser(amqp: &Amqp, class: &Class, method: &Method) {
|
|||
let type_name = resolve_type_from_domain(amqp, field_type(field));
|
||||
|
||||
if type_name == "bit" {
|
||||
let mut fields_with_bit = vec![field];
|
||||
|
||||
loop {
|
||||
if iter
|
||||
.peek()
|
||||
.map(|f| resolve_type_from_domain(amqp, field_type(f)) == "bit")
|
||||
.unwrap_or(false)
|
||||
{
|
||||
fields_with_bit.push(iter.next().unwrap());
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
let fields_with_bit = subsequent_bit_fields(amqp, field, &mut iter);
|
||||
|
||||
let amount = fields_with_bit.len();
|
||||
println!(" let (input, bits) = bit(input, {amount})?;");
|
||||
|
|
@ -132,7 +121,7 @@ fn method_parser(amqp: &Amqp, class: &Class, method: &Method) {
|
|||
}
|
||||
let class_name = class_name.to_upper_camel_case();
|
||||
let method_name = method.name.to_upper_camel_case();
|
||||
println!(" Ok((input, Class::{class_name}({class_name}::{method_name} {{");
|
||||
println!(" Ok((input, Class::{class_name}({class_name}::{method_name} {{");
|
||||
for field in &method.fields {
|
||||
let field_name = snake_case(&field.name);
|
||||
println!(" {field_name},");
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use crate::{field_type, resolve_type_from_domain, snake_case, Amqp};
|
||||
use crate::{field_type, resolve_type_from_domain, snake_case, subsequent_bit_fields, Amqp};
|
||||
use heck::ToUpperCamelCase;
|
||||
|
||||
pub(crate) fn codegen_write(amqp: &Amqp) {
|
||||
|
|
@ -26,13 +26,21 @@ pub fn write_method<W: Write>(class: Class, mut writer: W) -> Result<(), TransEr
|
|||
}
|
||||
println!(" }}) => {{");
|
||||
println!(" writer.write_all(&[{class_index}, {method_index}])?;");
|
||||
for field in &method.fields {
|
||||
let mut iter = method.fields.iter().peekable();
|
||||
|
||||
while let Some(field) = iter.next() {
|
||||
let field_name = snake_case(&field.name);
|
||||
let field_type = resolve_type_from_domain(amqp, field_type(field));
|
||||
if field_type == "bit" {
|
||||
println!(" todo!();");
|
||||
let type_name = resolve_type_from_domain(amqp, field_type(field));
|
||||
if type_name == "bit" {
|
||||
let fields_with_bit = subsequent_bit_fields(amqp, field, &mut iter);
|
||||
print!(" bit(&[");
|
||||
for field in fields_with_bit {
|
||||
let field_name = snake_case(&field.name);
|
||||
print!("{field_name}, ");
|
||||
}
|
||||
println!("], &mut writer)?;");
|
||||
} else {
|
||||
println!(" {field_type}({field_name}, &mut writer)?;");
|
||||
println!(" {type_name}({field_name}, &mut writer)?;");
|
||||
}
|
||||
}
|
||||
println!(" }}");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue