Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 23 additions & 14 deletions crates/fmp-py-gen/src/bin/gen_go/models.rs
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ fn render_required_switch(model: &ModelPlan, out: &mut String) {
/// The per-member decode a raw shadow value needs after the presence check.
fn render_codec_block(model: &str, field: &GoField, local: &str, out: &mut String) {
if field.raw_key {
render_raw_member(field, local, out);
render_raw_member(model, field, local, out);
return;
}
match field.codec {
Expand All @@ -352,10 +352,13 @@ fn render_codec_block(model: &str, field: &GoField, local: &str, out: &mut Strin
let inner = field.public_ty.trim_start_matches('*');
let _ = writeln!(
out,
"\tvar {local} {}\n\tif shadow.{}.Kind() != 'n' {{\n\t\tvar value {inner}\n\
\t\tif err := json.Unmarshal(shadow.{}, &value); err != nil {{\n\
\t\t\treturn err\n\t\t}}\n\t\t{local} = &value\n\t}}",
field.public_ty, field.name, field.name
"\tvar {local} {ty}\n\tif shadow.{name}.Kind() != 'n' {{\n\t\tvar value {inner}\n\
\t\tif err := json.Unmarshal(shadow.{name}, &value); err != nil {{\n\
\t\t\treturn memberDecodeError({model:?}, {wire:?}, shadow.{name}, err)\n\
\t\t}}\n\t\t{local} = &value\n\t}}",
ty = field.public_ty,
name = field.name,
wire = field.wire
);
}
Codec::EmptyOrNullString | Codec::NullTextString => {
Expand All @@ -367,10 +370,13 @@ fn render_codec_block(model: &str, field: &GoField, local: &str, out: &mut Strin
};
let _ = writeln!(
out,
"\tvar {local} {}\n\tif shadow.{}.Kind() != 'n' {{\n\t\tvar value {inner}\n\
\t\tif err := json.Unmarshal(shadow.{}, &value); err != nil {{\n\
\t\t\treturn err\n\t\t}}\n\t\tif value != {sentinel:?} {{\n\t\t\t{local} = &value\n\t\t}}\n\t}}",
field.public_ty, field.name, field.name
"\tvar {local} {ty}\n\tif shadow.{name}.Kind() != 'n' {{\n\t\tvar value {inner}\n\
\t\tif err := json.Unmarshal(shadow.{name}, &value); err != nil {{\n\
\t\t\treturn memberDecodeError({model:?}, {wire:?}, shadow.{name}, err)\n\t\t}}\n\
\t\tif value != {sentinel:?} {{\n\t\t\t{local} = &value\n\t\t}}\n\t}}",
ty = field.public_ty,
name = field.name,
wire = field.wire
);
}
Codec::EmptyDate | Codec::EmptyOrNullDate => {
Expand Down Expand Up @@ -436,23 +442,26 @@ fn member_tag(field: &GoField, options: &str) -> String {
/// The decode of a raw-keyed plain member from the value `rawMember` found:
/// missing and null were already reported for a required member and mean nil
/// for an optional one.
fn render_raw_member(field: &GoField, local: &str, out: &mut String) {
fn render_raw_member(model: &str, field: &GoField, local: &str, out: &mut String) {
let wire = format!("{local}Wire");
if field.optional {
let inner = field.public_ty.trim_start_matches('*');
let _ = writeln!(
out,
"\tvar {local} {}\n\tif {wire} != nil {{\n\t\tvar value {inner}\n\
\t\tif err := json.Unmarshal({wire}, &value); err != nil {{\n\
\t\t\treturn err\n\t\t}}\n\t\t{local} = &value\n\t}}",
field.public_ty
\t\t\treturn memberDecodeError({model:?}, {member:?}, {wire}, err)\n\
\t\t}}\n\t\t{local} = &value\n\t}}",
field.public_ty,
member = field.wire
);
} else {
let _ = writeln!(
out,
"\tvar {local} {}\n\tif err := json.Unmarshal({wire}, &{local}); err != nil {{\n\
\t\treturn err\n\t}}",
field.public_ty
\t\treturn memberDecodeError({model:?}, {member:?}, {wire}, err)\n\t}}",
field.public_ty,
member = field.wire
);
}
}
Expand Down
42 changes: 42 additions & 0 deletions crates/fmp-py-gen/src/bin/gen_go/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -745,6 +745,48 @@ fn null_text_codec_decodes_the_null_text_and_null_to_nil_through_the_raw_shadow(
}
}

#[test]
fn shadow_decoded_members_report_their_failures_against_the_member() {
let aliases = BTreeMap::new();
let structs = Vec::new();
let table = TypeTable::new(&structs, &aliases);
let def = row(vec![
field("beta", "Option<f64>", deserialize_with("required_option")),
field(
"cusip",
"Option<Ticker>",
deserialize_with("crate::codecs::empty_or_null::deserialize"),
),
field("last_updated_raw", "String", rename("lastUpdated\"")),
field(
"note",
"Option<String>",
FieldAttrs {
rename: Some("a,b".to_string()),
..skip_serializing_if("Option::is_none")
},
),
]);
let models = plan_models("test", &[&def], &table).expect("plans");
let rendered = render_models("test", &models);
for expected in [
"return memberDecodeError(\"Row\", \"beta\", shadow.Beta, err)",
"return memberDecodeError(\"Row\", \"cusip\", shadow.CUSIP, err)",
"return memberDecodeError(\"Row\", \"lastUpdated\\\"\", lastUpdatedRawWire, err)",
"return memberDecodeError(\"Row\", \"a,b\", noteWire, err)",
] {
assert!(
rendered.contains(expected),
"missing {expected:?} in\n{rendered}"
);
}
assert!(
!rendered.contains("&value); err != nil {\n\t\t\treturn err\n")
&& !rendered.contains("&lastUpdatedRaw); err != nil {\n\t\treturn err\n"),
"a member unmarshal returns its error without the member in\n{rendered}"
);
}

#[test]
fn skip_serializing_if_none_marks_only_the_public_tag_omitzero() {
let aliases = BTreeMap::new();
Expand Down
12 changes: 6 additions & 6 deletions sdk/go/analyst_models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion sdk/go/bulk_models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 11 additions & 11 deletions sdk/go/calendar_models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion sdk/go/commodities_models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading