generate encoders for basic types

This commit is contained in:
Brian Hicks 2024-04-24 06:18:10 -05:00
parent 7bb12c8e5b
commit 5950295726
No known key found for this signature in database
GPG Key ID: C4F324B9CAAB0D50

View File

@ -214,7 +214,7 @@ impl Decl {
match case_type_opt {
Some(case_type) => out.push_str(
&case_type
.to_encoder_source(&variable_name)?
.to_encoder_source(&case_name.to_camel_case()?)?
.replace("\n", "\n "),
),
None => {
@ -599,7 +599,85 @@ impl Type {
}
fn to_encoder_source(&self, source_var: &str) -> Result<String> {
Ok(String::from("{- TODO -}"))
let mut out = String::new();
match self {
Type::Int => {
out.push_str("Encode.int ");
out.push_str(source_var);
}
Type::Float => {
out.push_str("Encode.float ");
out.push_str(source_var);
}
Type::Bool => {
out.push_str("Encode.bool ");
out.push_str(source_var);
}
Type::String => {
out.push_str("Encode.string ");
out.push_str(source_var);
}
Type::Maybe(type_) => {
out.push_str("case ");
out.push_str(&source_var);
out.push_str(" of\n Just value ->\n ");
out.push_str(&type_.to_encoder_source("value")?.replace('\n', "\n "));
out.push_str("\n\n Nothing ->\n Encode.null");
}
Type::Unit => out.push_str("Encode.null"),
Type::DictWithStringKeys(values) => {
out.push_str("Encode.dict identity (\\value -> ");
out.push_str(&values.to_encoder_source("value")?);
out.push_str(") ");
out.push_str(&source_var);
}
Type::List(values) => {
out.push_str("Encode.list (\\value -> ");
out.push_str(&values.to_encoder_source("value")?);
out.push_str(") ");
out.push_str(&source_var);
}
Type::Ref(ref_) => {
out.push_str("encode");
out.push_str(&ref_.to_pascal_case()?);
out.push(' ');
out.push_str(&source_var);
}
Type::Record(fields) => {
out.push_str("Encode.object\n");
for (i, (name, field_type)) in fields.iter().enumerate() {
if i == 0 {
out.push_str(" [ ( \"");
} else {
out.push_str(" , ( \"");
}
out.push_str(&name.orig());
out.push_str("\"");
let field_encoder = field_type.to_encoder_source(&format!(
"{}.{}",
source_var,
name.to_camel_case()?
))?;
if field_encoder.contains("\n") {
out.push_str("\n , ");
out.push_str(&field_encoder.replace('\n', "\n "));
out.push_str("\n ");
} else {
out.push_str(", ");
out.push_str(&field_encoder);
}
out.push_str(" )\n");
}
out.push_str(" ]");
}
}
Ok(out)
}
}