swagger-api / swagger-codegen

swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition.
http://swagger.io
Apache License 2.0
16.9k stars 6.03k forks source link

[RUST] Generated code does not compile #7964

Open matthiasbeyer opened 6 years ago

matthiasbeyer commented 6 years ago
Description

I generated rust code from the docker API specification, but the resulting code does not compile.

The code, including the API spec downloaded from the docker website, is here: https://github.com/matthiasbeyer/shiplift-swagger

Swagger-codegen version

2.3.1

Swagger declaration file content or url

https://github.com/matthiasbeyer/shiplift-swagger/blob/master/docker-swagger.yaml

Command line used for generation

In the repository:

swagger-codegen generate -i ./docker-swagger.yaml -l rust -o ./
Steps to reproduce

(All given above)

Related issues/PRs

None (as far as I can see).

nstott commented 6 years ago

I'm experiencing the same


   Compiling error-chain v0.11.0
   Compiling clap v2.31.2
   Compiling swagger_client v0.0.1 (file:///Users/nick/hackery/rust/wg-api-server)
error: unnecessary parentheses around function argument
   --> src/server.rs:106:63
    |
106 |                             let mut response = Response::with((status::Status::from_u16(200)));
    |                                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses
    |
    = note: `-D unused-parens` implied by `-D warnings`

error: unnecessary parentheses around function argument
   --> src/server.rs:158:63
    |
158 |                             let mut response = Response::with((status::Status::from_u16(201)));
    |                                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove these parentheses

error: aborting due to 2 previous errors

error: Could not compile `swagger_client`.
warning: build failed, waiting for other jobs to finish...
error: build failed```
nstott commented 6 years ago

@matthiasbeyer try compiling with something like RUSTFLAGS="-A unused-parens" cargo build this worked for me to build rust-server (not client)

matthiasbeyer commented 6 years ago

@nstott This does not help, because:

error: expected identifier, found `,`
  --> src/apis/service_api.rs:44:46
   |
44 |     fn service_create(&self, body: ::models::, x_registry_auth: &str) -> Box<Future<Item = ::models::ServiceCreateResponse, Error = Error>> {
   |                                              ^ expected identifier

error: expected identifier, found `,`
   --> src/apis/service_api.rs:199:56
    |
199 |     fn service_update(&self, id: &str, body: ::models::, version: i32, registry_auth_from: &str, rollback: &str, x_registry_auth: &str) -> Box<Future<Item = ::models::ServiceUpdateResponse, Error = Error>> {
    |                                                        ^ expected identifier

(only some errors are pasted here, there are tons (28 in fact) more!)

nstott commented 6 years ago

boo.. different error, try using -l rust-server instead of -l rust, there are two different rust implementations

sharksforarms commented 6 years ago

Tried the following:

java -jar swagger-codegen-cli.jar generate -i ./docker-swagger.yaml -l rust-server -o ./output
[main] INFO io.swagger.parser.Swagger20Parser - reading from ./docker-swagger.yaml
[main] WARN io.swagger.util.PropertyDeserializer - no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}, MULTIPLE_OF=null}
[main] WARN io.swagger.util.PropertyDeserializer - no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}, MULTIPLE_OF=null}
[main] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint16' is not recognized and will be ignored.
[main] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint16' is not recognized and will be ignored.
[main] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint8' is not recognized and will be ignored.
[main] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint8' is not recognized and will be ignored.
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/api/swagger.yaml
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/Cargo.toml
[main] INFO io.swagger.codegen.DefaultGenerator - writing file /home/sharks/source/shiplift-swagger/./output/.cargo/config
[main] INFO io.swagger.codegen.DefaultGenerator - writing file /home/sharks/source/shiplift-swagger/./output/.gitignore
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/src/lib.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/src/models.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/src/server.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/src/client.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/src/mimetypes.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/server.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/client.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/server_lib/mod.rs
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/server_lib/server.rs
[main] INFO io.swagger.codegen.DefaultGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/ca.pem
[main] INFO io.swagger.codegen.DefaultGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/server-chain.pem
[main] INFO io.swagger.codegen.DefaultGenerator - writing file /home/sharks/source/shiplift-swagger/./output/examples/server-key.pem
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/README.md
[main] INFO io.swagger.codegen.AbstractGenerator - writing file /home/sharks/source/shiplift-swagger/./output/.swagger-codegen/VERSION
cd output && cargo build
error: expected type, found `,`
    --> src/lib.rs:1189:38
     |
1189 |     fn container_create(&self, body: , name: Option<String>, context: &Context) -> Box<Future<Item=ContainerCreateResponse, Error=ApiError> + Send>;
     |                                      ^

error: expected type, found `,`
    --> src/lib.rs:1240:52
     |
1240 |     fn container_update(&self, id: String, update: , context: &Context) -> Box<Future<Item=ContainerUpdateResponse, Error=ApiError> + Send>;
     |                                                    ^

error: expected type, found `,`
    --> src/lib.rs:1393:36
     |
1393 |     fn service_create(&self, body: , x_registry_auth: Option<String>, context: &Context) -> Box<Future<Item=ServiceCreateResponse, Error=ApiError> + Send>;
     |                                    ^

....

and more
nstott commented 6 years ago

might be worth pasting your swagger.yaml,

fwiw, I've been using the rust-server without any issues, but with an embarrassingly small set of api endpoints. It looks like there's something happening in your yaml that the swagger plugin isn't guarding against

sharksforarms commented 6 years ago

Here's what I'm using: https://github.com/moby/moby/blob/master/api/swagger.yaml

bjgill commented 6 years ago

Sorry - late to notice this.

Thanks for the diags. It looks like the problem is that rust-server doesn't handle allOf correctly.

sharksforarms commented 6 years ago

@bjgill I tried it with the pre-release too,

java -jar swagger-codegen-cli-3.0.0-rc0.jar generate -i ./docker-swagger.yaml -l rust-server -o ./output
[Thread-1] WARN io.swagger.util.PropertyDeserializer - no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}, MULTIPLE_OF=null}
[Thread-1] WARN io.swagger.util.PropertyDeserializer - no property from null, null, {ENUM=null, TITLE=null, DESCRIPTION=null, DEFAULT=null, PATTERN=null, DESCRIMINATOR=null, MIN_ITEMS=null, MAX_ITEMS=null, MIN_PROPERTIES=null, MAX_PROPERTIES=null, MIN_LENGTH=null, MAX_LENGTH=null, MINIMUM=null, MAXIMUM=null, EXCLUSIVE_MINIMUM=null, EXCLUSIVE_MAXIMUM=null, UNIQUE_ITEMS=null, EXAMPLE=null, TYPE=null, FORMAT=null, READ_ONLY=null, VENDOR_EXTENSIONS={}, MULTIPLE_OF=null}
[Thread-1] INFO io.swagger.codegen.ignore.CodegenIgnoreProcessor - No .swagger-codegen-ignore file found.
[Thread-1] WARN io.swagger.codegen.utils.URLPathUtil - Not valid URL: /v1.37
java.net.MalformedURLException: no protocol: /v1.37
    at java.net.URL.<init>(URL.java:593)
    at java.net.URL.<init>(URL.java:490)
    at java.net.URL.<init>(URL.java:439)
    at io.swagger.codegen.utils.URLPathUtil.getServerURL(URLPathUtil.java:30)
    at io.swagger.codegen.DefaultGenerator.configureGeneratorProperties(DefaultGenerator.java:209)
    at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:716)
    at io.swagger.codegen.cmd.Generate.run(Generate.java:312)
    at java.lang.Thread.run(Thread.java:748)
[Thread-1] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint16' is not recognized and will be ignored.
[Thread-1] WARN io.swagger.codegen.languages.RustServerCodegen - The integer format 'uint16' is not recognized and will be ignored.
[Thread-1] WARN io.swagger.codegen.utils.URLPathUtil - Not valid URL: /v1.37
java.net.MalformedURLException: no protocol: /v1.37
    at java.net.URL.<init>(URL.java:593)
    at java.net.URL.<init>(URL.java:490)
    at java.net.URL.<init>(URL.java:439)
    at io.swagger.codegen.utils.URLPathUtil.getServerURL(URLPathUtil.java:30)
    at io.swagger.codegen.DefaultGenerator.buildSupportFileBundle(DefaultGenerator.java:669)
    at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:728)
    at io.swagger.codegen.cmd.Generate.run(Generate.java:312)
    at java.lang.Thread.run(Thread.java:748)
[Thread-1] WARN io.swagger.codegen.utils.URLPathUtil - Not valid URL: /v1.37
java.net.MalformedURLException: no protocol: /v1.37
    at java.net.URL.<init>(URL.java:593)
    at java.net.URL.<init>(URL.java:490)
    at java.net.URL.<init>(URL.java:439)
    at io.swagger.codegen.utils.URLPathUtil.getServerURL(URLPathUtil.java:30)
    at io.swagger.codegen.utils.URLPathUtil.getScheme(URLPathUtil.java:39)
    at io.swagger.codegen.DefaultGenerator.buildSupportFileBundle(DefaultGenerator.java:678)
    at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:728)
    at io.swagger.codegen.cmd.Generate.run(Generate.java:312)
    at java.lang.Thread.run(Thread.java:748)
Exception in thread "Thread-1" java.lang.RuntimeException: Could not generate supporting file 'SupportingFile:
    templateFile: swagger.mustache
    folder: api
    destinationFilename: swagger.yaml
'
    at io.swagger.codegen.DefaultGenerator.generateSupportingFiles(DefaultGenerator.java:609)
    at io.swagger.codegen.DefaultGenerator.generate(DefaultGenerator.java:729)
    at io.swagger.codegen.cmd.Generate.run(Generate.java:312)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.FileNotFoundException: /rust-server/swagger.mustache
    at com.github.jknack.handlebars.io.URLTemplateLoader.sourceAt(URLTemplateLoader.java:70)
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:357)
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:343)
    at io.swagger.codegen.DefaultGenerator.getHandlebars(DefaultGenerator.java:1013)
    at io.swagger.codegen.DefaultGenerator.generateSupportingFiles(DefaultGenerator.java:577)
    ... 3 more
bjgill commented 6 years ago

Yes - unfortunately, neither rust nor rust-server work in 3.0.0.