@@ -3,56 +3,68 @@ extern crate ruru;
3
3
extern crate inflector;
4
4
5
5
// // dash: kebab-case
6
- // use inflector::cases::kebabcase::to_kebab_case;
6
+ use inflector:: cases:: kebabcase:: to_kebab_case;
7
7
// // underscore: snake_case
8
- // use inflector::cases::snakecase::to_snake_case;
8
+ use inflector:: cases:: snakecase:: to_snake_case;
9
9
// // camel_lower: camelCase
10
- // use inflector::cases::camelcase::to_camel_case;
10
+ use inflector:: cases:: camelcase:: to_camel_case;
11
11
// // camel: ClassCase (PascalCase)
12
- // use inflector::cases::classcase::to_class_case;
13
- use inflector:: Inflector ;
12
+ use inflector:: cases:: classcase:: to_class_case;
14
13
15
- use ruru:: { Class , Object , RString , Hash } ;
14
+ use ruru:: { Class , Object , RString , Hash , Array , Symbol , AnyObject , VM } ;
15
+ use ruru:: types:: ValueType ;
16
+
17
+ class ! ( CaseTransform ) ;
16
18
17
19
methods ! (
18
- RString ,
20
+ CaseTransform ,
19
21
itself,
20
22
21
- fn toSnakeCase( ) -> RString {
22
- RString :: new( & itself. to_string( ) . to_snake_case( ) )
23
- }
23
+ fn deepTransformKeys( hash: Hash , block: & Fn ( String ) -> String ) -> Hash {
24
+ let result = Hash :: new( ) ;
24
25
25
- fn toCamelCase( ) -> RString {
26
- RString :: new( & itself. to_string( ) . to_camel_case( ) )
27
- }
26
+ hash. unwrap( ) . each( |key, value| {
27
+ let newValue = if value. ty( ) == ValueType :: Hash { deepTransformKeys( value, block) . to_any_object( ) } else { value } ;
28
+ let newKey = RString :: new( block( key. unwrap( ) . to_string( ) ) ) ;
29
+ result. store( newKey, newValue) ;
30
+ } ) ;
28
31
29
- fn toClassCase( ) -> RString {
30
- RString :: new( & itself. to_string( ) . to_class_case( ) )
32
+ result
31
33
}
32
34
33
- fn toKebabCase( ) -> RString {
34
- RString :: new( & itself. to_string( ) . to_kebab_case( ) )
35
+ fn transform(
36
+ value: AnyObject ,
37
+ objectTransform: & Fn ( AnyObject ) -> AnyObject ,
38
+ keyTransform: & Fn ( String ) -> String
39
+ ) -> AnyObject {
40
+ match value. unwrap( ) . ty( ) {
41
+ ValueType :: Array => value. map( |item| objectTransform( item) ) . to_any_object( ) ,
42
+ ValueType :: Hash => deepTransformKeys( value, & |key| objectTransform( key) ) . to_any_object( ) ,
43
+ ValueType :: Symbol => Symbol :: new( objectTransform( value. to_string) ) . to_any_object( ) ,
44
+ ValueType :: RString => keyTransform( value) . to_any_object( ) ,
45
+ ValueType :: Object => value
46
+ }
35
47
}
36
- ) ;
37
48
38
- // methods! (
39
- // Hash,
40
- // itself,
41
- //
42
- // fn deepTransformKeys() -> Hash {
43
- // let result = Hash::new()
44
- // itself.each(|key, value| {
45
- // result.store(key, value)
46
- // });
47
- // }
48
- // );
49
+ fn toPascalCase ( key : String ) -> String { to_class_case ( to_snake_case ( key . unwrap ( ) ) ) }
50
+ fn toCamelCase ( key : String ) -> String { to_camel_case ( to_snake_case ( key . unwrap ( ) ) ) }
51
+ fn toDashedCase ( key : String ) -> String { to_kebab_case ( to_snake_case ( key . unwrap ( ) ) ) }
52
+ fn toKebabCase ( key : String ) -> String { to_kebab_case ( to_snake_case ( key . unwrap ( ) ) ) }
53
+
54
+ fn camel ( value : AnyObject ) -> AnyObject { transform ( value . unwrap ( ) . to_any_object ( ) , & camel , & toPascalCase ) }
55
+ fn camelLower ( value : AnyObject ) -> AnyObject { transform ( value . unwrap ( ) . to_any_object ( ) , & camelLower , & toCamelCase ) }
56
+ fn dash ( value : AnyObject ) -> AnyObject { transform ( value . unwrap ( ) . to_any_object ( ) , & dash , & toDashedCase ) }
57
+ fn underscore ( value : AnyObject ) -> AnyObject { transform ( value . unwrap ( ) , & underscore , & toKebabCase ) }
58
+ fn unaltered ( value : AnyObject ) -> AnyObject { value . unwrap ( ) . to_any_object ( ) }
59
+ ) ;
49
60
50
61
#[ no_mangle]
51
62
pub extern fn initialize_case_transform ( ) {
52
- Class :: from_existing ( "String" ) . define ( |itself| {
53
- itself. def ( "to_snake_case" , toSnakeCase) ;
54
- itself. def ( "to_camel_case" , toCamelCase) ;
55
- itself. def ( "to_class_case" , toClassCase) ;
56
- itself. def ( "to_kebab_case" , toKebabCase) ;
63
+ Class :: new ( "CaseTransform" , None ) . define ( |itself| {
64
+ itself. def_self ( "camel" , camel) ;
65
+ itself. def_self ( "camel_lower" , camelLower) ;
66
+ itself. def_self ( "dash" , dash) ;
67
+ itself. def_self ( "underscore" , underscore) ;
68
+ itself. def_self ( "unaltered" , unaltered) ;
57
69
} ) ;
58
70
}
0 commit comments