Skip to content

Commit 59c2cc1

Browse files
committed
refac: Move rename from func to interface
1 parent ab0336b commit 59c2cc1

File tree

3 files changed

+71
-75
lines changed

3 files changed

+71
-75
lines changed

crates/macros/src/function.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ pub fn wrap(input: syn::Path) -> Result<TokenStream> {
2727
#[darling(default)]
2828
pub struct FnArgs {
2929
/// The name of the function.
30-
name: Option<String>,
30+
pub name: Option<String>,
3131
/// The first optional argument of the function signature.
32-
optional: Option<Ident>,
32+
pub optional: Option<Ident>,
3333
/// Default values for optional arguments.
34-
defaults: HashMap<Ident, Lit>,
34+
pub defaults: HashMap<Ident, Lit>,
3535
}
3636

3737
pub fn parser(opts: TokenStream, input: ItemFn) -> Result<TokenStream> {

crates/macros/src/helpers.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::class::{parse_attribute, ParsedAttribute};
2+
use darling::FromMeta;
23
use syn::Attribute;
34

45
pub type Docs = Vec<String>;
@@ -26,3 +27,31 @@ impl GetDocs for &[Attribute] {
2627
get_docs(self)
2728
}
2829
}
30+
31+
#[derive(Debug, Copy, Clone, FromMeta, Default)]
32+
pub enum RenameRule {
33+
/// Methods won't be renamed.
34+
#[darling(rename = "none")]
35+
None,
36+
/// Methods will be converted to camelCase.
37+
#[darling(rename = "camelCase")]
38+
#[default]
39+
Camel,
40+
/// Methods will be converted to snake_case.
41+
#[darling(rename = "snake_case")]
42+
Snake,
43+
}
44+
45+
pub trait Rename {
46+
fn renmae(self, rule: &RenameRule) -> Self;
47+
}
48+
49+
impl Rename for String {
50+
fn renmae(self, rule: &RenameRule) -> Self {
51+
match *rule {
52+
RenameRule::None => self,
53+
RenameRule::Camel => ident_case::RenameRule::CamelCase.apply_to_field(self),
54+
RenameRule::Snake => ident_case::RenameRule::SnakeCase.apply_to_field(self),
55+
}
56+
}
57+
}

crates/macros/src/impl_.rs

Lines changed: 39 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,39 @@ use std::collections::HashMap;
66
use syn::{Ident, ItemImpl, Lit};
77

88
use crate::function::{Args, CallType, Function, MethodReceiver};
9-
use crate::helpers::get_docs;
9+
use crate::helpers::{get_docs, Rename, RenameRule};
1010
use crate::prelude::*;
1111

12-
#[derive(Debug, Copy, Clone, FromMeta, Default)]
13-
pub enum RenameRule {
14-
/// Methods won't be renamed.
15-
#[darling(rename = "none")]
16-
None,
17-
/// Methods will be converted to camelCase.
18-
#[darling(rename = "camelCase")]
19-
#[default]
20-
Camel,
21-
/// Methods will be converted to snake_case.
22-
#[darling(rename = "snake_case")]
23-
Snake,
12+
const MAGIC_METHOD: [&'static str; 17] = [
13+
"__construct",
14+
"__destruct",
15+
"__call",
16+
"__call_static",
17+
"__get",
18+
"__set",
19+
"__isset",
20+
"__unset",
21+
"__sleep",
22+
"__wakeup",
23+
"__serialize",
24+
"__unserialize",
25+
"__to_string",
26+
"__invoke",
27+
"__set_state",
28+
"__clone",
29+
"__debug_info",
30+
];
31+
32+
trait RenameMethod {
33+
fn rename_method(self, rule: &RenameRule) -> String;
2434
}
2535

26-
impl RenameRule {
27-
/// Change case of an identifier.
28-
///
29-
/// Magic methods are handled specially to make sure they're always cased
30-
/// correctly.
31-
pub fn rename(&self, name: impl AsRef<str>) -> String {
32-
let name = name.as_ref();
33-
match self {
34-
RenameRule::None => name.to_string(),
35-
rule => match name {
36-
"__construct" => "__construct".to_string(),
37-
"__destruct" => "__destruct".to_string(),
38-
"__call" => "__call".to_string(),
39-
"__call_static" => "__callStatic".to_string(),
40-
"__get" => "__get".to_string(),
41-
"__set" => "__set".to_string(),
42-
"__isset" => "__isset".to_string(),
43-
"__unset" => "__unset".to_string(),
44-
"__sleep" => "__sleep".to_string(),
45-
"__wakeup" => "__wakeup".to_string(),
46-
"__serialize" => "__serialize".to_string(),
47-
"__unserialize" => "__unserialize".to_string(),
48-
"__to_string" => "__toString".to_string(),
49-
"__invoke" => "__invoke".to_string(),
50-
"__set_state" => "__set_state".to_string(),
51-
"__clone" => "__clone".to_string(),
52-
"__debug_info" => "__debugInfo".to_string(),
53-
field => match rule {
54-
Self::Camel => ident_case::RenameRule::CamelCase.apply_to_field(field),
55-
Self::Snake => ident_case::RenameRule::SnakeCase.apply_to_field(field),
56-
Self::None => unreachable!(),
57-
},
58-
},
36+
impl<T: AsRef<str>> RenameMethod for T {
37+
fn rename_method(self, rule: &RenameRule) -> String {
38+
if MAGIC_METHOD.contains(&self.as_ref()) {
39+
self.as_ref().to_string()
40+
} else {
41+
self.as_ref().to_string().renmae(rule)
5942
}
6043
}
6144
}
@@ -280,7 +263,7 @@ impl<'a> ParsedImpl<'a> {
280263
});
281264
}
282265
syn::ImplItem::Fn(method) => {
283-
let name = self.rename.rename(method.sig.ident.to_string());
266+
let name = method.sig.ident.to_string().renmae(&self.rename);
284267
let docs = get_docs(&method.attrs);
285268
let mut opts = MethodArgs::new(name);
286269
opts.parse(&mut method.attrs)?;
@@ -396,40 +379,24 @@ impl quote::ToTokens for FnBuilder {
396379

397380
#[cfg(test)]
398381
mod tests {
382+
use super::RenameMethod;
399383
use super::RenameRule;
384+
use super::MAGIC_METHOD;
400385

401386
#[test]
402387
fn test_rename_magic() {
403-
for &(magic, expected) in &[
404-
("__construct", "__construct"),
405-
("__destruct", "__destruct"),
406-
("__call", "__call"),
407-
("__call_static", "__callStatic"),
408-
("__get", "__get"),
409-
("__set", "__set"),
410-
("__isset", "__isset"),
411-
("__unset", "__unset"),
412-
("__sleep", "__sleep"),
413-
("__wakeup", "__wakeup"),
414-
("__serialize", "__serialize"),
415-
("__unserialize", "__unserialize"),
416-
("__to_string", "__toString"),
417-
("__invoke", "__invoke"),
418-
("__set_state", "__set_state"),
419-
("__clone", "__clone"),
420-
("__debug_info", "__debugInfo"),
421-
] {
422-
assert_eq!(magic, RenameRule::None.rename(magic));
423-
assert_eq!(expected, RenameRule::Camel.rename(magic));
424-
assert_eq!(expected, RenameRule::Snake.rename(magic));
388+
for magic in MAGIC_METHOD {
389+
assert_eq!(magic, magic.rename_method(&RenameRule::None));
390+
assert_eq!(magic, magic.rename_method(&RenameRule::Camel));
391+
assert_eq!(magic, magic.rename_method(&RenameRule::Snake));
425392
}
426393
}
427394

428395
#[test]
429396
fn test_rename_php_methods() {
430397
let &(original, camel, snake) = &("get_name", "getName", "get_name");
431-
assert_eq!(original, RenameRule::None.rename(original));
432-
assert_eq!(camel, RenameRule::Camel.rename(original));
433-
assert_eq!(snake, RenameRule::Snake.rename(original));
398+
assert_eq!(original, original.rename_method(&RenameRule::None));
399+
assert_eq!(camel, original.rename_method(&RenameRule::Camel));
400+
assert_eq!(snake, original.rename_method(&RenameRule::Snake));
434401
}
435402
}

0 commit comments

Comments
 (0)