Skip to content

Commit 9a673ea

Browse files
bertkdownsyjh0502
andauthored
Rust: Support Integer enums using Serde_repr (#19199)
* rust: support repr(int) enum * Regen APIS * remove the extra lines * merge most recent commits from master * update tests to ensure that enum compiles correctly * drop changes to kotlin files --------- Co-authored-by: Jihyun Yu <[email protected]>
1 parent 8950892 commit 9a673ea

File tree

81 files changed

+519
-0
lines changed

Some content is hidden

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

81 files changed

+519
-0
lines changed

modules/openapi-generator/src/main/resources/rust/Cargo.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ serde = { version = "^1.0", features = ["derive"] }
3737
serde_with = { version = "^3.8", default-features = false, features = ["base64", "std", "macros"] }
3838
{{/serdeWith}}
3939
serde_json = "^1.0"
40+
serde_repr = "^0.1"
4041
url = "^2.5"
4142
uuid = { version = "^1.8", features = ["serde", "v4"] }
4243
{{#hyper}}

modules/openapi-generator/src/main/resources/rust/lib.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(unused_imports)]
22
#![allow(clippy::too_many_arguments)]
33

4+
extern crate serde_repr;
45
extern crate serde;
56
extern crate serde_json;
67
extern crate url;

modules/openapi-generator/src/main/resources/rust/model.mustache

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,43 @@ use serde::{Deserialize, Serialize};
66
{{^isEnum}}{{#vendorExtensions.x-rust-has-byte-array}}
77
use serde_with::serde_as;
88
{{/vendorExtensions.x-rust-has-byte-array}}{{/isEnum}}
9+
{{#isEnum}}
10+
{{#isInteger}}
11+
use serde_repr::{Serialize_repr,Deserialize_repr};
12+
{{/isInteger}}
13+
{{/isEnum}}
914
{{#description}}
1015
/// {{{classname}}} : {{{description}}}
1116
{{/description}}
17+
{{!-- for repr(int) enum schemas --}}
18+
{{#isEnum}}
19+
{{#isInteger}}
20+
/// {{{description}}}
21+
#[repr(i64)]
22+
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize_repr, Deserialize_repr)]
23+
pub enum {{{classname}}} {
24+
{{#allowableValues}}
25+
{{#enumVars}}
26+
{{{name}}} = {{{value}}},
27+
{{/enumVars}}{{/allowableValues}}
28+
}
29+
30+
impl ToString for {{{classname}}} {
31+
fn to_string(&self) -> String {
32+
match self {
33+
{{#allowableValues}}
34+
{{#enumVars}}
35+
Self::{{{name}}} => String::from("{{{value}}}"),
36+
{{/enumVars}}
37+
{{/allowableValues}}
38+
}
39+
}
40+
}
41+
{{/isInteger}}
42+
{{/isEnum}}
1243
{{!-- for enum schemas --}}
1344
{{#isEnum}}
45+
{{^isInteger}}
1446
/// {{{description}}}
1547
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
1648
pub enum {{{classname}}} {
@@ -33,6 +65,7 @@ impl std::fmt::Display for {{{classname}}} {
3365
}
3466
}
3567

68+
{{/isInteger}}
3669
impl Default for {{{classname}}} {
3770
fn default() -> {{{classname}}} {
3871
{{#allowableValues}}

modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,14 @@ components:
959959
nullable: true
960960
just_string:
961961
type: string
962+
NumericEnumTesting:
963+
description: testing that numeric enums are converted correctly
964+
enum:
965+
- 0
966+
- 1
967+
- 2
968+
- 3
969+
type: integer
962970
ref:
963971
description: using reserved word as model name
964972
type: object

samples/client/others/rust/hyper/api-with-ref-param/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edition = "2021"
1010
[dependencies]
1111
serde = { version = "^1.0", features = ["derive"] }
1212
serde_json = "^1.0"
13+
serde_repr = "^0.1"
1314
url = "^2.5"
1415
uuid = { version = "^1.8", features = ["serde", "v4"] }
1516
hyper = { version = "^1.3.1", features = ["full"] }

samples/client/others/rust/hyper/api-with-ref-param/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(unused_imports)]
22
#![allow(clippy::too_many_arguments)]
33

4+
extern crate serde_repr;
45
extern crate serde;
56
extern crate serde_json;
67
extern crate url;

samples/client/others/rust/hyper/composed-oneof/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edition = "2021"
1010
[dependencies]
1111
serde = { version = "^1.0", features = ["derive"] }
1212
serde_json = "^1.0"
13+
serde_repr = "^0.1"
1314
url = "^2.5"
1415
uuid = { version = "^1.8", features = ["serde", "v4"] }
1516
hyper = { version = "^1.3.1", features = ["full"] }

samples/client/others/rust/hyper/composed-oneof/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(unused_imports)]
22
#![allow(clippy::too_many_arguments)]
33

4+
extern crate serde_repr;
45
extern crate serde;
56
extern crate serde_json;
67
extern crate url;

samples/client/others/rust/hyper/emptyObject/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edition = "2021"
1010
[dependencies]
1111
serde = { version = "^1.0", features = ["derive"] }
1212
serde_json = "^1.0"
13+
serde_repr = "^0.1"
1314
url = "^2.5"
1415
uuid = { version = "^1.8", features = ["serde", "v4"] }
1516
hyper = { version = "^1.3.1", features = ["full"] }

samples/client/others/rust/hyper/emptyObject/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![allow(unused_imports)]
22
#![allow(clippy::too_many_arguments)]
33

4+
extern crate serde_repr;
45
extern crate serde;
56
extern crate serde_json;
67
extern crate url;

0 commit comments

Comments
 (0)