Skip to content

Commit e8f0242

Browse files
authored
Merge pull request #22 from golemcloud/escaping-type-params
Escaping names with type parameters
2 parents c195cda + 08bea85 commit e8f0242

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

src/rust/lib_gen.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use crate::printer::*;
1616
use crate::rust::printer::*;
1717
use crate::rust::types::{escape_keywords, RustPrinter};
18+
use convert_case::{Case, Casing};
1819
use itertools::Itertools;
1920

2021
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
@@ -39,27 +40,38 @@ pub struct ModuleName {
3940
}
4041

4142
impl ModuleName {
43+
pub fn name(&self) -> String {
44+
self.name.clone()
45+
}
46+
4247
fn code(&self) -> RustPrinter {
4348
line(unit() + self.verbosity.render() + "mod " + escape_keywords(&self.name) + ";")
4449
}
4550

46-
pub fn new<S: Into<String>>(s: S) -> ModuleName {
51+
pub fn new(s: impl AsRef<str>) -> ModuleName {
4752
ModuleName {
48-
name: s.into(),
53+
name: Self::escape_type_params(s.as_ref()).to_case(Case::Snake),
4954
verbosity: Verbosity::Default,
5055
}
5156
}
5257

53-
pub fn new_pub<S: Into<String>>(s: S) -> ModuleName {
58+
pub fn new_pub(s: impl AsRef<str>) -> ModuleName {
5459
ModuleName {
55-
name: s.into(),
60+
name: Self::escape_type_params(s.as_ref()).to_case(Case::Snake),
5661
verbosity: Verbosity::Pub,
5762
}
5863
}
5964

6065
pub fn file_name(&self) -> String {
6166
format!("{}.rs", &self.name)
6267
}
68+
69+
fn escape_type_params(s: &str) -> String {
70+
s.replace("<", "_")
71+
.replace(",", "_")
72+
.replace(">", "_")
73+
.replace(" ", "")
74+
}
6375
}
6476

6577
#[derive(Debug, Clone)]

src/rust/model_gen.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,8 @@ pub fn model_gen(
385385
"Unexpected reference format: {reference}."
386386
)))?;
387387

388-
let name = original_name.to_case(Case::UpperCamel);
388+
let mod_name = ModuleName::new(original_name);
389+
let name = mod_name.name().to_case(Case::UpperCamel);
389390

390391
let schema = schemas.get(original_name).ok_or(Error::unexpected(format!(
391392
"Can't find schema by reference {original_name}"
@@ -584,10 +585,11 @@ pub fn model_gen(
584585
}
585586
};
586587

588+
let name = ModuleName::new(name);
587589
Ok(Module {
588590
def: ModuleDef {
589-
name: ModuleName::new(name.to_case(Case::Snake)),
590-
exports: vec![name],
591+
name: name.clone(),
592+
exports: vec![name.name().to_case(Case::Pascal)],
591593
},
592594
code: RustContext::new().print_to_string(code?),
593595
})

src/rust/types.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
use crate::printer::TreePrinter;
16+
use crate::rust::lib_gen::ModuleName;
1617
use crate::rust::model_gen::RefCache;
1718
use crate::rust::printer::{rust_name, unit, RustContext};
1819
use crate::{Error, Result};
@@ -120,7 +121,8 @@ impl DataType {
120121
}
121122
}
122123
DataType::Model(ModelType { name }) => {
123-
let model_type = rust_name("crate::model", name);
124+
let name = ModuleName::new(name);
125+
let model_type = rust_name("crate::model", &name.name().to_case(Case::Pascal));
124126
to_ref(model_type, top_param)
125127
}
126128
DataType::Array(item) => {

0 commit comments

Comments
 (0)