Skip to content

Commit b26180b

Browse files
mitrandir77facebook-github-bot
authored andcommitted
add context to parsing errors in rust codegen
Summary: Seeing thrift deserialization errors like this one is no fun: ``` deserializing `string` from Thrift binary protocol got invalid utf-8, you need to use `binary` instead: invalid utf-8 sequence of 1 bytes from index 137 ``` For structures with many nested fields localizing the one field that's non-utf8 is tedious. This diff changes this error to something like: ``` Error while deserialising error field of ErrorLogEntry Caused by: deserializing `string` from Thrift binary protocol got invalid utf-8, you need to use `binary` instead: invalid utf-8 sequence of 1 bytes from index 165 ``` Which helps localize error a bit more. Reviewed By: dtolnay Differential Revision: D72914828 fbshipit-source-id: a2bc2087c1f167163c30fa2e346b6976c2aebbf1
1 parent 3f224cd commit b26180b

File tree

51 files changed

+590
-571
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+590
-571
lines changed

Diff for: third-party/thrift/src/thrift/compiler/generate/templates/rust/lib/server_arg.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl<P: ::fbthrift::ProtocolReader> ::fbthrift::Deserialize<P> for self::Args_{{
4444
({{#field:type}}{{> lib/ttype}}{{/field:type}}, {{field:key}}) => {{!
4545
}}field_{{field:name}} = ::std::option::Option::Some({{!
4646
}}{{#field:has_adapter?}}{{> lib/adapter/qualified}}::from_thrift_field::<fbthrift::metadata::NoThriftAnnotations>({{/field:has_adapter?}}{{!
47-
}}{{#field:type}}{{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p)?{{!
47+
}}{{#field:type}}::anyhow::Context::context({{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p), ::fbthrift::errors::DeserializingArgError { arg: "{{field:name}}", function: "{{function:name}}"})?{{!
4848
}}{{#field:has_adapter?}}, {{field:key}})?{{/field:has_adapter?}}{{!
4949
}}),{{!
5050
}}{{/function:args}}

Diff for: third-party/thrift/src/thrift/compiler/generate/templates/rust/lib/structimpl.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ where
176176
}}{{^struct:all_optional?}}field_{{field:name}}{{/struct:all_optional?}}{{!
177177
}} = ::std::option::Option::Some({{!
178178
}}{{#field:has_adapter?}}{{> lib/adapter/qualified}}::from_thrift_field::<{{struct:rust_name}}>({{/field:has_adapter?}}{{!
179-
}}{{#field:type}}{{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p)?{{!
179+
}}{{#field:type}}::anyhow::Context::context({{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p), ::fbthrift::errors::DeserializingFieldError { field: "{{field:name}}", strct: "{{struct:name}}"})?{{!
180180
}}{{#field:has_adapter?}}, {{field:key}})?{{/field:has_adapter?}}{{!
181181
}}),{{!
182182
}}{{/struct:fields}}

Diff for: third-party/thrift/src/thrift/compiler/generate/templates/rust/lib/unionimpl.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ where
9494
once = true;
9595
alt = ::std::option::Option::Some(Self::{{field:rust_name}}({{!
9696
}}{{#field:has_adapter?}}{{> lib/adapter/qualified}}::from_thrift_field::<{{struct:rust_name}}>({{/field:has_adapter?}}{{!
97-
}}{{#field:type}}{{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p)?{{!
97+
}}{{#field:type}}::anyhow::Context::context({{#field:type_annotation?}}{{> lib/annfieldread}}{{/field:type_annotation?}}{{^field:type_annotation?}}{{> lib/read}}{{/field:type_annotation?}}{{/field:type}}(p), ::fbthrift::errors::DeserializingFieldError { field: "{{field:name}}", strct: "{{struct:name}}"})?{{!
9898
}}{{#field:has_adapter?}}, {{field:key}})?{{/field:has_adapter?}}{{!
9999
}}));
100100
}{{!

Diff for: third-party/thrift/src/thrift/compiler/test/fixture_utils.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,9 @@ def get_all_fixture_names(fixtures_root_dir_path: Path) -> list[str]:
309309
```
310310
"""
311311

312-
assert fixtures_root_dir_path.is_dir()
312+
assert (
313+
fixtures_root_dir_path.is_dir()
314+
), f"{fixtures_root_dir_path} is not a directory"
313315

314316
fixture_dirs = (
315317
fixture_dir

Diff for: third-party/thrift/src/thrift/compiler/test/fixtures/adapter/out/rust/gen-rust/server.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ impl<P: ::fbthrift::ProtocolReader> ::fbthrift::Deserialize<P> for self::Args_Se
115115
let (_, fty, fid) = p.read_field_begin(|_| (), ARGS)?;
116116
match (fty, fid as ::std::primitive::i32) {
117117
(::fbthrift::TType::Stop, _) => break,
118-
(::fbthrift::TType::String, 1) => field_arg1 = ::std::option::Option::Some(<crate::types::adapters::StringWithAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_field::<fbthrift::metadata::NoThriftAnnotations>(::fbthrift::Deserialize::read(p)?, 1)?),
119-
(::fbthrift::TType::String, 2) => field_arg2 = ::std::option::Option::Some(::fbthrift::Deserialize::read(p)?),
120-
(::fbthrift::TType::Struct, 3) => field_arg3 = ::std::option::Option::Some(::fbthrift::Deserialize::read(p)?),
118+
(::fbthrift::TType::String, 1) => field_arg1 = ::std::option::Option::Some(<crate::types::adapters::StringWithAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_field::<fbthrift::metadata::NoThriftAnnotations>(::anyhow::Context::context(::fbthrift::Deserialize::read(p), ::fbthrift::errors::DeserializingArgError { arg: "arg1", function: "func"})?, 1)?),
119+
(::fbthrift::TType::String, 2) => field_arg2 = ::std::option::Option::Some(::anyhow::Context::context(::fbthrift::Deserialize::read(p), ::fbthrift::errors::DeserializingArgError { arg: "arg2", function: "func"})?),
120+
(::fbthrift::TType::Struct, 3) => field_arg3 = ::std::option::Option::Some(::anyhow::Context::context(::fbthrift::Deserialize::read(p), ::fbthrift::errors::DeserializingArgError { arg: "arg3", function: "func"})?),
121121
(fty, _) => p.skip(fty)?,
122122
}
123123
p.read_field_end()?;
@@ -528,7 +528,7 @@ impl<P: ::fbthrift::ProtocolReader> ::fbthrift::Deserialize<P> for self::Args_Ad
528528
let (_, fty, fid) = p.read_field_begin(|_| (), ARGS)?;
529529
match (fty, fid as ::std::primitive::i32) {
530530
(::fbthrift::TType::Stop, _) => break,
531-
(::fbthrift::TType::Struct, 1) => field_arg = ::std::option::Option::Some(::fbthrift::Deserialize::read(p)?),
531+
(::fbthrift::TType::Struct, 1) => field_arg = ::std::option::Option::Some(::anyhow::Context::context(::fbthrift::Deserialize::read(p), ::fbthrift::errors::DeserializingArgError { arg: "arg", function: "adaptedTypes"})?),
532532
(fty, _) => p.skip(fty)?,
533533
}
534534
p.read_field_end()?;

0 commit comments

Comments
 (0)