Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(generator/rust): prefer gaxi over gclient #1546

Merged
merged 2 commits into from
Mar 19, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .sidekick.toml
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@ disabled-rustdoc-warnings = "redundant_explicit_links,broken_intra_doc_links"
# These are used by crates with services.
'package:async-trait' = 'used-if=services,package=async-trait,version=0.1'
'package:gax' = 'used-if=services,package=google-cloud-gax,path=src/gax,feature=unstable-sdk-client,version=0.21'
'package:gclient' = 'used-if=services,package=google-cloud-http-client,path=src/http-client,version=0.1'
'package:gaxi' = 'used-if=services,package=google-cloud-http-client,path=src/http-client,version=0.1'
'package:lazy_static' = 'used-if=services,package=lazy_static,version=1'
'package:reqwest' = 'used-if=services,package=reqwest,version=0.12,feature=json'
'package:serde_json' = 'used-if=services,package=serde_json,version=1'
8 changes: 4 additions & 4 deletions generator/internal/rust/annotate_test.go
Original file line number Diff line number Diff line change
@@ -242,7 +242,7 @@ func TestOneOfAnnotations(t *testing.T) {
},
FieldType: "std::collections::HashMap<i32,i32>",
PrimitiveFieldType: "std::collections::HashMap<i32,i32>",
AddQueryParameter: `let builder = req.get_oneof_field_map().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gclient::query_parameter::QueryParameter; p.add(builder, "oneofFieldMap") });`,
AddQueryParameter: `let builder = req.get_oneof_field_map().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gaxi::query_parameter::QueryParameter; p.add(builder, "oneofFieldMap") });`,
KeyType: "i32",
ValueType: "i32",
IsBoxed: true,
@@ -661,7 +661,7 @@ func TestFieldAnnotations(t *testing.T) {
},
FieldType: "std::collections::HashMap<i32,i64>",
PrimitiveFieldType: "std::collections::HashMap<i32,i64>",
AddQueryParameter: `let builder = { use gclient::query_parameter::QueryParameter; serde_json::to_value(&req.map_field).map_err(Error::serde)?.add(builder, "mapField") };`,
AddQueryParameter: `let builder = { use gaxi::query_parameter::QueryParameter; serde_json::to_value(&req.map_field).map_err(Error::serde)?.add(builder, "mapField") };`,
KeyType: "i32",
ValueType: "i64",
ToProto: "cnv",
@@ -682,7 +682,7 @@ func TestFieldAnnotations(t *testing.T) {
},
FieldType: "std::option::Option<std::boxed::Box<crate::model::TestMessage>>",
PrimitiveFieldType: "crate::model::TestMessage",
AddQueryParameter: `let builder = req.boxed_field.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gclient::query_parameter::QueryParameter; v.add(builder, "boxedField") });`,
AddQueryParameter: `let builder = req.boxed_field.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gaxi::query_parameter::QueryParameter; v.add(builder, "boxedField") });`,
IsBoxed: true,
ToProto: "cnv",
}
@@ -871,7 +871,7 @@ func TestEnumFieldAnnotations(t *testing.T) {
},
FieldType: "std::collections::HashMap<std::string::String,crate::model::TestEnum>",
PrimitiveFieldType: "std::collections::HashMap<std::string::String,crate::model::TestEnum>",
AddQueryParameter: `let builder = { use gclient::query_parameter::QueryParameter; serde_json::to_value(&req.map_field).map_err(Error::serde)?.add(builder, "mapField") };`,
AddQueryParameter: `let builder = { use gaxi::query_parameter::QueryParameter; serde_json::to_value(&req.map_field).map_err(Error::serde)?.add(builder, "mapField") };`,
KeyType: "std::string::String",
ValueType: "crate::model::TestEnum",
ToProto: "cnv",
8 changes: 4 additions & 4 deletions generator/internal/rust/codec.go
Original file line number Diff line number Diff line change
@@ -631,9 +631,9 @@ func addQueryParameter(f *api.Field) string {
// few requests use nested objects as query parameters. Furthermore,
// the conversion is skipped if the object field is `None`.`
if f.Optional || f.Repeated {
return fmt.Sprintf(`let builder = req.%s.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gclient::query_parameter::QueryParameter; v.add(builder, "%s") });`, fieldName, f.JSONName)
return fmt.Sprintf(`let builder = req.%s.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gaxi::query_parameter::QueryParameter; v.add(builder, "%s") });`, fieldName, f.JSONName)
}
return fmt.Sprintf(`let builder = { use gclient::query_parameter::QueryParameter; serde_json::to_value(&req.%s).map_err(Error::serde)?.add(builder, "%s") };`, fieldName, f.JSONName)
return fmt.Sprintf(`let builder = { use gaxi::query_parameter::QueryParameter; serde_json::to_value(&req.%s).map_err(Error::serde)?.add(builder, "%s") };`, fieldName, f.JSONName)
default:
if f.Optional || f.Repeated {
return fmt.Sprintf(`let builder = req.%s.iter().fold(builder, |builder, p| builder.query(&[("%s", p)]));`, fieldName, f.JSONName)
@@ -653,7 +653,7 @@ func addQueryParameterOneOf(f *api.Field) string {
// query. The conversion to `serde_json::Value` is expensive, but very
// few requests use nested objects as query parameters. Furthermore,
// the conversion is skipped if the object field is `None`.`
return fmt.Sprintf(`let builder = req.get_%s().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gclient::query_parameter::QueryParameter; p.add(builder, "%s") });`, fieldName, f.JSONName)
return fmt.Sprintf(`let builder = req.get_%s().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gaxi::query_parameter::QueryParameter; p.add(builder, "%s") });`, fieldName, f.JSONName)
default:
return fmt.Sprintf(`let builder = req.get_%s().iter().fold(builder, |builder, p| builder.query(&[("%s", p)]));`, fieldName, f.JSONName)
}
@@ -755,7 +755,7 @@ func httpPathFmt(m *api.PathInfo) string {

func derefFieldExpr(name string, optional bool, nextMessage *api.Message) (string, *api.Message) {
const (
optionalFmt = `.%s.as_ref().ok_or_else(|| gclient::path_parameter::missing("%s"))?`
optionalFmt = `.%s.as_ref().ok_or_else(|| gaxi::path_parameter::missing("%s"))?`
)
if optional {
return fmt.Sprintf(optionalFmt, name, name), nextMessage
28 changes: 14 additions & 14 deletions generator/internal/rust/codec_test.go
Original file line number Diff line number Diff line change
@@ -1172,15 +1172,15 @@ func TestAsQueryParameter(t *testing.T) {
field *api.Field
want string
}{
{optionsField, `let builder = req.options_field.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gclient::query_parameter::QueryParameter; v.add(builder, "optionsField") });`},
{optionsField, `let builder = req.options_field.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gaxi::query_parameter::QueryParameter; v.add(builder, "optionsField") });`},
{requiredField, `let builder = builder.query(&[("requiredField", &req.required_field)]);`},
{optionalField, `let builder = req.optional_field.iter().fold(builder, |builder, p| builder.query(&[("optionalField", p)]));`},
{repeatedField, `let builder = req.repeated_field.iter().fold(builder, |builder, p| builder.query(&[("repeatedField", p)]));`},
{requiredEnumField, `let builder = builder.query(&[("requiredEnumField", &req.required_enum_field.value())]);`},
{optionalEnumField, `let builder = req.optional_enum_field.iter().fold(builder, |builder, p| builder.query(&[("optionalEnumField", p.value())]));`},
{repeatedEnumField, `let builder = req.repeated_enum_field.iter().fold(builder, |builder, p| builder.query(&[("repeatedEnumField", p.value())]));`},
{requiredFieldMaskField, `let builder = { use gclient::query_parameter::QueryParameter; serde_json::to_value(&req.required_field_mask).map_err(Error::serde)?.add(builder, "requiredFieldMask") };`},
{optionalFieldMaskField, `let builder = req.optional_field_mask.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gclient::query_parameter::QueryParameter; v.add(builder, "optionalFieldMask") });`},
{requiredFieldMaskField, `let builder = { use gaxi::query_parameter::QueryParameter; serde_json::to_value(&req.required_field_mask).map_err(Error::serde)?.add(builder, "requiredFieldMask") };`},
{optionalFieldMaskField, `let builder = req.optional_field_mask.as_ref().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, v| { use gaxi::query_parameter::QueryParameter; v.add(builder, "optionalFieldMask") });`},
} {
got := addQueryParameter(test.field)
if test.want != got {
@@ -1273,13 +1273,13 @@ func TestOneOfAsQueryParameter(t *testing.T) {
field *api.Field
want string
}{
{optionsField, `let builder = req.get_options_field().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gclient::query_parameter::QueryParameter; p.add(builder, "optionsField") });`},
{optionsField, `let builder = req.get_options_field().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gaxi::query_parameter::QueryParameter; p.add(builder, "optionsField") });`},
{typeField, `let builder = req.get_type().iter().fold(builder, |builder, p| builder.query(&[("type", p)]));`},
{singularField, `let builder = req.get_singular_field().iter().fold(builder, |builder, p| builder.query(&[("singularField", p)]));`},
{repeatedField, `let builder = req.get_repeated_field().iter().fold(builder, |builder, p| builder.query(&[("repeatedField", p)]));`},
{singularEnumField, `let builder = req.get_singular_enum_field().iter().fold(builder, |builder, p| builder.query(&[("singularEnumField", p.value())]));`},
{repeatedEnumField, `let builder = req.get_repeated_enum_field().iter().fold(builder, |builder, p| builder.query(&[("repeatedEnumField", p.value())]));`},
{singularFieldMaskField, `let builder = req.get_singular_field_mask().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gclient::query_parameter::QueryParameter; p.add(builder, "singularFieldMask") });`},
{singularFieldMaskField, `let builder = req.get_singular_field_mask().map(|p| serde_json::to_value(p).map_err(Error::serde) ).transpose()?.into_iter().fold(builder, |builder, p| { use gaxi::query_parameter::QueryParameter; p.add(builder, "singularFieldMask") });`},
} {
got := addQueryParameter(test.field)
if test.want != got {
@@ -2124,7 +2124,7 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "b",
Accessor: `.b.as_ref().ok_or_else(|| gclient::path_parameter::missing("b"))?`,
Accessor: `.b.as_ref().ok_or_else(|| gaxi::path_parameter::missing("b"))?`,
},
},
&api.PathInfo{
@@ -2147,7 +2147,7 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "d",
Accessor: `.d.as_ref().ok_or_else(|| gclient::path_parameter::missing("d"))?.value()`,
Accessor: `.d.as_ref().ok_or_else(|| gaxi::path_parameter::missing("d"))?.value()`,
},
},
&api.PathInfo{
@@ -2161,7 +2161,7 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "e.a",
Accessor: `.e.as_ref().ok_or_else(|| gclient::path_parameter::missing("e"))?.a`,
Accessor: `.e.as_ref().ok_or_else(|| gaxi::path_parameter::missing("e"))?.a`,
},
},
&api.PathInfo{
@@ -2175,8 +2175,8 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "e.b",
Accessor: `.e.as_ref().ok_or_else(|| gclient::path_parameter::missing("e"))?` +
`.b.as_ref().ok_or_else(|| gclient::path_parameter::missing("b"))?`,
Accessor: `.e.as_ref().ok_or_else(|| gaxi::path_parameter::missing("e"))?` +
`.b.as_ref().ok_or_else(|| gaxi::path_parameter::missing("b"))?`,
},
},
&api.PathInfo{
@@ -2190,7 +2190,7 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "e.c",
Accessor: `.e.as_ref().ok_or_else(|| gclient::path_parameter::missing("e"))?` +
Accessor: `.e.as_ref().ok_or_else(|| gaxi::path_parameter::missing("e"))?` +
`.c.value()`,
},
},
@@ -2205,8 +2205,8 @@ func TestPathArgs(t *testing.T) {
[]pathArg{
{
Name: "e.d",
Accessor: `.e.as_ref().ok_or_else(|| gclient::path_parameter::missing("e"))?` +
`.d.as_ref().ok_or_else(|| gclient::path_parameter::missing("d"))?` +
Accessor: `.e.as_ref().ok_or_else(|| gaxi::path_parameter::missing("e"))?` +
`.d.as_ref().ok_or_else(|| gaxi::path_parameter::missing("d"))?` +
`.value()`,
},
},
@@ -2225,7 +2225,7 @@ func TestPathArgs(t *testing.T) {
},
{
Name: "b",
Accessor: `.b.as_ref().ok_or_else(|| gclient::path_parameter::missing("b"))?`,
Accessor: `.b.as_ref().ok_or_else(|| gaxi::path_parameter::missing("b"))?`,
},
},
&api.PathInfo{
Original file line number Diff line number Diff line change
@@ -26,10 +26,10 @@ use gax::error::Error;

{{/Codec.HasServices}}
{{#Codec.Services}}
/// Implements [{{Codec.Name}}](super::stubs::{{Codec.Name}}) using a [gclient::ReqwestClient].
/// Implements [{{Codec.Name}}](super::stubs::{{Codec.Name}}) using a [gaxi::ReqwestClient].
#[derive(Clone)]
pub struct {{Codec.Name}} {
inner: gclient::ReqwestClient,
inner: gaxi::ReqwestClient,
}

impl std::fmt::Debug for {{Codec.Name}} {
@@ -41,8 +41,8 @@ impl std::fmt::Debug for {{Codec.Name}} {
}

impl {{Codec.Name}} {
pub async fn new(config: gclient::ClientConfig) -> Result<Self> {
let inner = gclient::ReqwestClient::new(config, crate::DEFAULT_HOST).await?;
pub async fn new(config: gaxi::ClientConfig) -> Result<Self> {
let inner = gaxi::ReqwestClient::new(config, crate::DEFAULT_HOST).await?;
Ok(Self { inner })
}
}
@@ -81,7 +81,7 @@ impl super::stubs::{{Codec.Name}} for {{Codec.Name}} {
self.inner.execute(
builder,
{{#PathInfo.Codec.HasBody}}Some(req{{Codec.BodyAccessor}}){{/PathInfo.Codec.HasBody}}
{{^PathInfo.Codec.HasBody}}None::<gclient::NoBody>{{/PathInfo.Codec.HasBody}},
{{^PathInfo.Codec.HasBody}}None::<gaxi::NoBody>{{/PathInfo.Codec.HasBody}},
options,
).await
}
Loading