Skip to content

Commit 45e053b

Browse files
committed
try to convert to pure rust -- all the errors
1 parent 77b154c commit 45e053b

File tree

3 files changed

+46
-101
lines changed

3 files changed

+46
-101
lines changed

ext/case_transform/src/lib.rs

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,68 @@ extern crate ruru;
33
extern 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

1719
methods! (
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]
5162
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);
5769
});
5870
}

lib/case_transform.rb

Lines changed: 0 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -14,70 +14,3 @@
1414
[], Fiddle::TYPE_VOIDP
1515
)
1616
func.call
17-
18-
module CaseTransform
19-
module_function
20-
21-
def deep_transform_keys(hash, &block)
22-
result = {}
23-
hash.each do |key, value|
24-
result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
25-
end
26-
result
27-
end
28-
29-
def transform(value, via)
30-
case value
31-
when Array then value.map { |item| send(via, item) }
32-
when Hash then deep_transform_keys(value) { |key| send(via, key) }
33-
when Symbol then send(via, value.to_s).to_sym
34-
when String then yield(value)
35-
else value
36-
end
37-
end
38-
39-
# Transforms values to UpperCamelCase or PascalCase.
40-
#
41-
# @example:
42-
# "some_key" => "SomeKey",
43-
def camel(value)
44-
transform(value, :camel) do |v|
45-
v.to_snake_case.to_class_case
46-
end
47-
end
48-
49-
# Transforms values to camelCase.
50-
#
51-
# @example:
52-
# "some_key" => "someKey",
53-
def camel_lower(value)
54-
transform(value, :camel_lower) do |v|
55-
v.to_snake_case.to_camel_case
56-
end
57-
end
58-
59-
# Transforms values to dashed-case.
60-
# This is the default case for the JsonApi adapter.
61-
#
62-
# @example:
63-
# "some_key" => "some-key",
64-
def dash(value)
65-
transform(value, :dash) do |v|
66-
v.to_snake_case.to_kebab_case
67-
end
68-
end
69-
70-
# Transforms values to underscore_case.
71-
# This is the default case for deserialization in the JsonApi adapter.
72-
#
73-
# @example:
74-
# "some-key" => "some_key",
75-
def underscore(value)
76-
transform(value, :underscore, &:to_snake_case)
77-
end
78-
79-
# Returns the value unaltered
80-
def unaltered(value)
81-
value
82-
end
83-
end

lib/libcase_transform.so

3.7 MB
Binary file not shown.

0 commit comments

Comments
 (0)