mirror of
https://github.com/BrianHicks/elm-duet.git
synced 2024-09-19 09:28:05 +03:00
generate encoders for basic types
This commit is contained in:
parent
7bb12c8e5b
commit
5950295726
82
src/elm.rs
82
src/elm.rs
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user