Skip to content

Commit 03effd7

Browse files
authored
Replace periods with underscores in Rust model names (#21480)
Fix issue where period-delimited model names (e.g. microsoft.graph.fido2AuthenticationMethod) were being converted to unwieldy names with "Period" substitutions. Now periods are replaced with underscores like hyphens, resulting in cleaner and more idiomatic Rust identifiers. Fixes #15254
1 parent d11d008 commit 03effd7

File tree

6 files changed

+56
-42
lines changed

6 files changed

+56
-42
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractRustCodegen.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ public String sanitizeIdentifier(String name, CasingType casingType, String esca
183183
throw new IllegalArgumentException("Unknown CasingType");
184184
}
185185

186-
// Replace hyphens with underscores
187-
name = name.replaceAll("-", "_");
186+
// Replace hyphens and periods with underscores
187+
name = name.replaceAll("[\\.\\-]", "_");
188188

189189
// Apply special character escapes, e.g. "@type" => "At_type"
190190
// Remove the trailing underscore if necessary

modules/openapi-generator/src/test/java/org/openapitools/codegen/rust/AbstractRustCodegenTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public void testSanitizeIdentifier() {
3636
// Hyphens should be replaced (https://github.com/OpenAPITools/openapi-generator/commit/4cb7f1d6135aa3a42ff38cf89771105c40e7e5a9)
3737
Assert.assertEquals(sanitizeSnakeCase.apply("pet-name"), "pet_name");
3838

39+
// Periods should be replaced with underscores (https://github.com/OpenAPITools/openapi-generator/issues/15254)
40+
Assert.assertEquals(sanitizeSnakeCase.apply("microsoft.graph.fido2AuthenticationMethod"), "microsoft_graph_fido2_authentication_method");
41+
Assert.assertEquals(sanitizeCamelCase.apply("microsoft.graph.user"), "MicrosoftGraphUser");
42+
3943
// Special character mappings are applied
4044
Assert.assertEquals(sanitizeSnakeCase.apply("@type"), "at_type");
4145
Assert.assertEquals(sanitizeCamelCase.apply("@type"), "AtType");

samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/.openapi-generator/FILES

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ docs/Category.md
1717
docs/ClassModel.md
1818
docs/Client.md
1919
docs/Dog.md
20-
docs/DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket.md
20+
docs/DollarSpecialLeftSquareBracketModelNameRightSquareBracket.md
2121
docs/EnumArrays.md
2222
docs/EnumArraysArrayArrayEnumInnerInner.md
2323
docs/EnumArraysArrayEnumInner.md

samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ Method | HTTP request | Description
198198
- [ClassModel](docs/ClassModel.md)
199199
- [Client](docs/Client.md)
200200
- [Dog](docs/Dog.md)
201-
- [DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket](docs/DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket.md)
201+
- [DollarSpecialLeftSquareBracketModelNameRightSquareBracket](docs/DollarSpecialLeftSquareBracketModelNameRightSquareBracket.md)
202202
- [EnumArrays](docs/EnumArrays.md)
203203
- [EnumArraysArrayArrayEnumInnerInner](docs/EnumArraysArrayArrayEnumInnerInner.md)
204204
- [EnumArraysArrayEnumInner](docs/EnumArraysArrayEnumInner.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# DollarSpecialLeftSquareBracketModelNameRightSquareBracket
2+
3+
## Properties
4+
Name | Type | Description | Notes
5+
------------ | ------------- | ------------- | -------------
6+
**dollar_special_left_square_bracket_property_name_right_square_bracket** | **i64** | | [optional] [default to None]
7+
8+
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)
9+
10+

samples/server/petstore/rust-server/output/petstore-with-fake-endpoints-models-for-testing/src/models.rs

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2509,33 +2509,33 @@ impl Dog {
25092509
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, validator::Validate)]
25102510
#[cfg_attr(feature = "conversion", derive(frunk::LabelledGeneric))]
25112511
#[serde(rename = "$special[model.name]")]
2512-
pub struct DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2512+
pub struct DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
25132513
#[serde(rename = "$special[property.name]")]
25142514
#[serde(skip_serializing_if="Option::is_none")]
2515-
pub dollar_special_left_square_bracket_property_period_name_right_square_bracket: Option<i64>,
2515+
pub dollar_special_left_square_bracket_property_name_right_square_bracket: Option<i64>,
25162516

25172517
}
25182518

25192519

2520-
impl DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2520+
impl DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
25212521
#[allow(clippy::new_without_default)]
2522-
pub fn new() -> DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2523-
DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2524-
dollar_special_left_square_bracket_property_period_name_right_square_bracket: None,
2522+
pub fn new() -> DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
2523+
DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
2524+
dollar_special_left_square_bracket_property_name_right_square_bracket: None,
25252525
}
25262526
}
25272527
}
25282528

2529-
/// Converts the DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket value to the Query Parameters representation (style=form, explode=false)
2529+
/// Converts the DollarSpecialLeftSquareBracketModelNameRightSquareBracket value to the Query Parameters representation (style=form, explode=false)
25302530
/// specified in https://swagger.io/docs/specification/serialization/
25312531
/// Should be implemented in a serde serializer
2532-
impl std::string::ToString for DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2532+
impl std::string::ToString for DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
25332533
fn to_string(&self) -> String {
25342534
let params: Vec<Option<String>> = vec![
2535-
self.dollar_special_left_square_bracket_property_period_name_right_square_bracket.as_ref().map(|dollar_special_left_square_bracket_property_period_name_right_square_bracket| {
2535+
self.dollar_special_left_square_bracket_property_name_right_square_bracket.as_ref().map(|dollar_special_left_square_bracket_property_name_right_square_bracket| {
25362536
[
25372537
"$special[property.name]".to_string(),
2538-
dollar_special_left_square_bracket_property_period_name_right_square_bracket.to_string(),
2538+
dollar_special_left_square_bracket_property_name_right_square_bracket.to_string(),
25392539
].join(",")
25402540
}),
25412541
];
@@ -2544,18 +2544,18 @@ impl std::string::ToString for DollarSpecialLeftSquareBracketModelPeriodNameRigh
25442544
}
25452545
}
25462546

2547-
/// Converts Query Parameters representation (style=form, explode=false) to a DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket value
2547+
/// Converts Query Parameters representation (style=form, explode=false) to a DollarSpecialLeftSquareBracketModelNameRightSquareBracket value
25482548
/// as specified in https://swagger.io/docs/specification/serialization/
25492549
/// Should be implemented in a serde deserializer
2550-
impl std::str::FromStr for DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2550+
impl std::str::FromStr for DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
25512551
type Err = String;
25522552

25532553
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
25542554
/// An intermediate representation of the struct to use for parsing.
25552555
#[derive(Default)]
25562556
#[allow(dead_code)]
25572557
struct IntermediateRep {
2558-
pub dollar_special_left_square_bracket_property_period_name_right_square_bracket: Vec<i64>,
2558+
pub dollar_special_left_square_bracket_property_name_right_square_bracket: Vec<i64>,
25592559
}
25602560

25612561
let mut intermediate_rep = IntermediateRep::default();
@@ -2567,15 +2567,15 @@ impl std::str::FromStr for DollarSpecialLeftSquareBracketModelPeriodNameRightSqu
25672567
while key_result.is_some() {
25682568
let val = match string_iter.next() {
25692569
Some(x) => x,
2570-
None => return std::result::Result::Err("Missing value while parsing DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket".to_string())
2570+
None => return std::result::Result::Err("Missing value while parsing DollarSpecialLeftSquareBracketModelNameRightSquareBracket".to_string())
25712571
};
25722572

25732573
if let Some(key) = key_result {
25742574
#[allow(clippy::match_single_binding)]
25752575
match key {
25762576
#[allow(clippy::redundant_clone)]
2577-
"$special[property.name]" => intermediate_rep.dollar_special_left_square_bracket_property_period_name_right_square_bracket.push(<i64 as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?),
2578-
_ => return std::result::Result::Err("Unexpected key while parsing DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket".to_string())
2577+
"$special[property.name]" => intermediate_rep.dollar_special_left_square_bracket_property_name_right_square_bracket.push(<i64 as std::str::FromStr>::from_str(val).map_err(|x| x.to_string())?),
2578+
_ => return std::result::Result::Err("Unexpected key while parsing DollarSpecialLeftSquareBracketModelNameRightSquareBracket".to_string())
25792579
}
25802580
}
25812581

@@ -2584,40 +2584,40 @@ impl std::str::FromStr for DollarSpecialLeftSquareBracketModelPeriodNameRightSqu
25842584
}
25852585

25862586
// Use the intermediate representation to return the struct
2587-
std::result::Result::Ok(DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2588-
dollar_special_left_square_bracket_property_period_name_right_square_bracket: intermediate_rep.dollar_special_left_square_bracket_property_period_name_right_square_bracket.into_iter().next(),
2587+
std::result::Result::Ok(DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
2588+
dollar_special_left_square_bracket_property_name_right_square_bracket: intermediate_rep.dollar_special_left_square_bracket_property_name_right_square_bracket.into_iter().next(),
25892589
})
25902590
}
25912591
}
25922592

2593-
// Methods for converting between header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket> and hyper::header::HeaderValue
2593+
// Methods for converting between header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelNameRightSquareBracket> and hyper::header::HeaderValue
25942594

25952595
#[cfg(any(feature = "client", feature = "server"))]
2596-
impl std::convert::TryFrom<header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket>> for hyper::header::HeaderValue {
2596+
impl std::convert::TryFrom<header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelNameRightSquareBracket>> for hyper::header::HeaderValue {
25972597
type Error = String;
25982598

2599-
fn try_from(hdr_value: header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket>) -> std::result::Result<Self, Self::Error> {
2599+
fn try_from(hdr_value: header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelNameRightSquareBracket>) -> std::result::Result<Self, Self::Error> {
26002600
let hdr_value = hdr_value.to_string();
26012601
match hyper::header::HeaderValue::from_str(&hdr_value) {
26022602
std::result::Result::Ok(value) => std::result::Result::Ok(value),
26032603
std::result::Result::Err(e) => std::result::Result::Err(
2604-
format!("Invalid header value for DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket - value: {} is invalid {}",
2604+
format!("Invalid header value for DollarSpecialLeftSquareBracketModelNameRightSquareBracket - value: {} is invalid {}",
26052605
hdr_value, e))
26062606
}
26072607
}
26082608
}
26092609

26102610
#[cfg(any(feature = "client", feature = "server"))]
2611-
impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket> {
2611+
impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderValue<DollarSpecialLeftSquareBracketModelNameRightSquareBracket> {
26122612
type Error = String;
26132613

26142614
fn try_from(hdr_value: hyper::header::HeaderValue) -> std::result::Result<Self, Self::Error> {
26152615
match hdr_value.to_str() {
26162616
std::result::Result::Ok(value) => {
2617-
match <DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket as std::str::FromStr>::from_str(value) {
2617+
match <DollarSpecialLeftSquareBracketModelNameRightSquareBracket as std::str::FromStr>::from_str(value) {
26182618
std::result::Result::Ok(value) => std::result::Result::Ok(header::IntoHeaderValue(value)),
26192619
std::result::Result::Err(err) => std::result::Result::Err(
2620-
format!("Unable to convert header value '{}' into DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket - {}",
2620+
format!("Unable to convert header value '{}' into DollarSpecialLeftSquareBracketModelNameRightSquareBracket - {}",
26212621
value, err))
26222622
}
26232623
},
@@ -2629,10 +2629,10 @@ impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderVal
26292629
}
26302630

26312631
#[cfg(feature = "server")]
2632-
impl std::convert::TryFrom<header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket>>> for hyper::header::HeaderValue {
2632+
impl std::convert::TryFrom<header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelNameRightSquareBracket>>> for hyper::header::HeaderValue {
26332633
type Error = String;
26342634

2635-
fn try_from(hdr_values: header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket>>) -> std::result::Result<Self, Self::Error> {
2635+
fn try_from(hdr_values: header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelNameRightSquareBracket>>) -> std::result::Result<Self, Self::Error> {
26362636
let hdr_values : Vec<String> = hdr_values.0.into_iter().map(|hdr_value| {
26372637
hdr_value.to_string()
26382638
}).collect();
@@ -2646,21 +2646,21 @@ impl std::convert::TryFrom<header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBr
26462646
}
26472647

26482648
#[cfg(feature = "server")]
2649-
impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket>> {
2649+
impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderValue<Vec<DollarSpecialLeftSquareBracketModelNameRightSquareBracket>> {
26502650
type Error = String;
26512651

26522652
fn try_from(hdr_values: hyper::header::HeaderValue) -> std::result::Result<Self, Self::Error> {
26532653
match hdr_values.to_str() {
26542654
std::result::Result::Ok(hdr_values) => {
2655-
let hdr_values : std::vec::Vec<DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket> = hdr_values
2655+
let hdr_values : std::vec::Vec<DollarSpecialLeftSquareBracketModelNameRightSquareBracket> = hdr_values
26562656
.split(',')
26572657
.filter_map(|hdr_value| match hdr_value.trim() {
26582658
"" => std::option::Option::None,
26592659
hdr_value => std::option::Option::Some({
2660-
match <DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket as std::str::FromStr>::from_str(hdr_value) {
2660+
match <DollarSpecialLeftSquareBracketModelNameRightSquareBracket as std::str::FromStr>::from_str(hdr_value) {
26612661
std::result::Result::Ok(value) => std::result::Result::Ok(value),
26622662
std::result::Result::Err(err) => std::result::Result::Err(
2663-
format!("Unable to convert header value '{}' into DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket - {}",
2663+
format!("Unable to convert header value '{}' into DollarSpecialLeftSquareBracketModelNameRightSquareBracket - {}",
26642664
hdr_value, err))
26652665
}
26662666
})
@@ -2674,7 +2674,7 @@ impl std::convert::TryFrom<hyper::header::HeaderValue> for header::IntoHeaderVal
26742674
}
26752675
}
26762676

2677-
impl DollarSpecialLeftSquareBracketModelPeriodNameRightSquareBracket {
2677+
impl DollarSpecialLeftSquareBracketModelNameRightSquareBracket {
26782678
/// Helper function to allow us to convert this model to an XML string.
26792679
/// Will panic if serialisation fails.
26802680
#[allow(dead_code)]
@@ -8445,16 +8445,16 @@ impl TestEnumParametersEnumHeaderStringParameter {
84458445
#[cfg_attr(feature = "conversion", derive(frunk_enum_derive::LabelledGenericEnum))]
84468446
pub enum TestEnumParametersEnumQueryDoubleParameter {
84478447
#[serde(rename = "1.1")]
8448-
Variant1Period1,
8448+
Variant11,
84498449
#[serde(rename = "-1.2")]
8450-
Variant1Period2,
8450+
Variant12,
84518451
}
84528452

84538453
impl std::fmt::Display for TestEnumParametersEnumQueryDoubleParameter {
84548454
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84558455
match *self {
8456-
TestEnumParametersEnumQueryDoubleParameter::Variant1Period1 => write!(f, "1.1"),
8457-
TestEnumParametersEnumQueryDoubleParameter::Variant1Period2 => write!(f, "-1.2"),
8456+
TestEnumParametersEnumQueryDoubleParameter::Variant11 => write!(f, "1.1"),
8457+
TestEnumParametersEnumQueryDoubleParameter::Variant12 => write!(f, "-1.2"),
84588458
}
84598459
}
84608460
}
@@ -8464,8 +8464,8 @@ impl std::str::FromStr for TestEnumParametersEnumQueryDoubleParameter {
84648464

84658465
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
84668466
match s {
8467-
"1.1" => std::result::Result::Ok(TestEnumParametersEnumQueryDoubleParameter::Variant1Period1),
8468-
"-1.2" => std::result::Result::Ok(TestEnumParametersEnumQueryDoubleParameter::Variant1Period2),
8467+
"1.1" => std::result::Result::Ok(TestEnumParametersEnumQueryDoubleParameter::Variant11),
8468+
"-1.2" => std::result::Result::Ok(TestEnumParametersEnumQueryDoubleParameter::Variant12),
84698469
_ => std::result::Result::Err(format!("Value not valid: {}", s)),
84708470
}
84718471
}

0 commit comments

Comments
 (0)