OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.82k stars 6.58k forks source link

[BUG][Rust] Invalid Rust code generated #12464

Open frewsxcv opened 2 years ago

frewsxcv commented 2 years ago

https://api.inaturalist.org/v1/swagger.json

error[E0599]: the method `join` exists for struct `Vec<i32>`, but its trait bounds were not satisfied
    --> src/apis/identifications_api.rs:1260:105
     |
1260 |     let local_var_uri_str = format!("{}/identifications/{id}", local_var_configuration.base_path, id=id.join(",").as_ref());
     |                                                                                                         ^^^^ method cannot be called on `Vec<i32>` due to unsatisfied trait bounds
     |
     = note: the following trait bounds were not satisfied:
             `[i32]: Join<_>`

error[E0599]: the method `join` exists for struct `Vec<i32>`, but its trait bounds were not satisfied
    --> src/apis/observations_api.rs:2394:102
     |
2394 |     let local_var_uri_str = format!("{}/observations/{id}", local_var_configuration.base_path, id=id.join(",").as_ref());
     |                                                                                                      ^^^^ method cannot be called on `Vec<i32>` due to unsatisfied trait bounds
     |
     = note: the following trait bounds were not satisfied:
             `[i32]: Join<_>`

warning: variable does not need to be mutable
  --> src/apis/photos_api.rs:57:9
   |
57 |     let mut local_var_form = reqwest::multipart::Form::new();
   |         ----^^^^^^^^^^^^^^
   |         |
   |         help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default

error[E0283]: type annotations needed
   --> src/apis/places_api.rs:126:106
    |
126 |     let local_var_uri_str = format!("{}/places/{id}", local_var_configuration.base_path, id=id.join(",").as_ref());
    |                                                                                             -------------^^^^^^--
    |                                                                                             |            |
    |                                                                                             |            cannot infer type for type parameter `T` declared on the trait `AsRef`
    |                                                                                             this method call resolves to `&T`
    |
    = note: multiple `impl`s satisfying `std::string::String: AsRef<_>` found in the following crates: `alloc`, `std`:
            - impl AsRef<OsStr> for std::string::String;
            - impl AsRef<Path> for std::string::String;
            - impl AsRef<[u8]> for std::string::String;
            - impl AsRef<str> for std::string::String;

error[E0283]: type annotations needed
   --> src/apis/projects_api.rs:520:108
    |
520 |     let local_var_uri_str = format!("{}/projects/{id}", local_var_configuration.base_path, id=id.join(",").as_ref());
    |                                                                                               -------------^^^^^^--
    |                                                                                               |            |
    |                                                                                               |            cannot infer type for type parameter `T` declared on the trait `AsRef`
    |                                                                                               this method call resolves to `&T`
    |
    = note: multiple `impl`s satisfying `std::string::String: AsRef<_>` found in the following crates: `alloc`, `std`:
            - impl AsRef<OsStr> for std::string::String;
            - impl AsRef<Path> for std::string::String;
            - impl AsRef<[u8]> for std::string::String;
            - impl AsRef<str> for std::string::String;

error[E0599]: the method `join` exists for struct `Vec<i32>`, but its trait bounds were not satisfied
   --> src/apis/taxa_api.rs:274:94
    |
274 |     let local_var_uri_str = format!("{}/taxa/{id}", local_var_configuration.base_path, id=id.join(",").as_ref());
    |                                                                                              ^^^^ method cannot be called on `Vec<i32>` due to unsatisfied trait bounds
    |
    = note: the following trait bounds were not satisfied:
            `[i32]: Join<_>`

The problem seems to be this line:

https://github.com/OpenAPITools/openapi-generator/blob/21f649e0873f29571b9bb9b69c7a8e962e3954d0/modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache#L99

manzaltu commented 1 month ago

Also happens with https://api.crossref.org/swagger-docs.

Compiling crossref-api v1.0.0 (crossref-api)
error[E0283]: type annotations needed
  --> crossref-api/src/apis/journals_api.rs:90:114
   |
90 |     let local_var_uri_str = format!("{}/journals/{issn}", local_var_configuration.base_path, issn=issn.join(",").as_ref());
   |                                                                                                                  ^^^^^^
   |
   = note: multiple `impl`s satisfying `std::string::String: AsRef<_>` found in the following crates: `alloc`, `std`:
           - impl AsRef<OsStr> for std::string::String;
           - impl AsRef<Path> for std::string::String;
           - impl AsRef<[u8]> for std::string::String;
           - impl AsRef<str> for std::string::String;
help: try using a fully qualified path to specify the expected types
   |
90 |     let local_var_uri_str = format!("{}/journals/{issn}", local_var_configuration.base_path, issn=<std::string::String as AsRef<T>>::as_ref(&issn.join(",")));
   |                                                                                                   +++++++++++++++++++++++++++++++++++++++++++              ~

error[E0283]: type annotations needed
   --> crossref-api/src/apis/journals_api.rs:118:120
    |
118 |     let local_var_uri_str = format!("{}/journals/{issn}/works", local_var_configuration.base_path, issn=issn.join(",").as_ref());
    |                                                                                                                        ^^^^^^
    |
    = note: multiple `impl`s satisfying `std::string::String: AsRef<_>` found in the following crates: `alloc`, `std`:
            - impl AsRef<OsStr> for std::string::String;
            - impl AsRef<Path> for std::string::String;
            - impl AsRef<[u8]> for std::string::String;
            - impl AsRef<str> for std::string::String;
help: try using a fully qualified path to specify the expected types
    |
118 |     let local_var_uri_str = format!("{}/journals/{issn}/works", local_var_configuration.base_path, issn=<std::string::String as AsRef<T>>::as_ref(&issn.join(",")));
    |                                                                                                         +++++++++++++++++++++++++++++++++++++++++++              ~

For more information about this error, try `rustc --explain E0283`.
error: could not compile `crossref-api` (lib) due to 2 previous errors

rust-compilation exited abnormally with code 101 at Sun Sep 15 18:01:13