@@ -3,56 +3,68 @@ extern crate ruru;
33extern crate inflector;
44
55// // dash: kebab-case
6- // use inflector::cases::kebabcase::to_kebab_case;
6+ use inflector:: cases:: kebabcase:: to_kebab_case;
77// // underscore: snake_case
8- // use inflector::cases::snakecase::to_snake_case;
8+ use inflector:: cases:: snakecase:: to_snake_case;
99// // camel_lower: camelCase
10- // use inflector::cases::camelcase::to_camel_case;
10+ use inflector:: cases:: camelcase:: to_camel_case;
1111// // camel: ClassCase (PascalCase)
12- // use inflector::cases::classcase::to_class_case;
13- use inflector:: Inflector ;
12+ use inflector:: cases:: classcase:: to_class_case;
1413
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 ) ;
1618
1719methods ! (
18- RString ,
20+ CaseTransform ,
1921 itself,
2022
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( ) ;
2425
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+ } ) ;
2831
29- fn toClassCase( ) -> RString {
30- RString :: new( & itself. to_string( ) . to_class_case( ) )
32+ result
3133 }
3234
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+ }
3547 }
36- ) ;
3748
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+ ) ;
4960
5061#[ no_mangle]
5162pub 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) ;
5769 } ) ;
5870}
0 commit comments