|
1 | 1 | require "json" |
| 2 | +require "active_model/type" |
| 3 | +require "kredis/type/json" |
| 4 | +require "kredis/type/datetime" |
2 | 5 |
|
3 | 6 | module Kredis::TypeCasting |
4 | 7 | class InvalidType < StandardError; end |
5 | 8 |
|
6 | | - VALID_TYPES = %i[ string integer decimal float boolean datetime json ] |
7 | | - |
8 | | - def type_to_string(value) |
9 | | - case value |
10 | | - when nil |
11 | | - "" |
12 | | - when Integer |
13 | | - value.to_s |
14 | | - when BigDecimal |
15 | | - value.to_d |
16 | | - when Float |
17 | | - value.to_s |
18 | | - when TrueClass, FalseClass |
19 | | - value ? "t" : "f" |
20 | | - when Time, DateTime, ActiveSupport::TimeWithZone |
21 | | - value.iso8601(9) |
22 | | - when Hash |
23 | | - JSON.dump(value) |
24 | | - else |
25 | | - value |
26 | | - end |
| 9 | + TYPES = { |
| 10 | + string: ActiveModel::Type::String.new, |
| 11 | + integer: ActiveModel::Type::Integer.new, |
| 12 | + decimal: ActiveModel::Type::Decimal.new, |
| 13 | + float: ActiveModel::Type::Float.new, |
| 14 | + boolean: ActiveModel::Type::Boolean.new, |
| 15 | + datetime: Kredis::Type::DateTime.new, |
| 16 | + json: Kredis::Type::Json.new |
| 17 | + } |
| 18 | + |
| 19 | + def type_to_string(value, type) |
| 20 | + raise InvalidType if type && !TYPES.key?(type) |
| 21 | + |
| 22 | + TYPES[type || :string].serialize(value) |
27 | 23 | end |
28 | 24 |
|
29 | 25 | def string_to_type(value, type) |
30 | | - raise InvalidType if type && !VALID_TYPES.include?(type) |
31 | | - |
32 | | - case type |
33 | | - when nil, :string then value |
34 | | - when :integer then value.to_i |
35 | | - when :decimal then value.to_d |
36 | | - when :float then value.to_f |
37 | | - when :boolean then value == "t" ? true : false |
38 | | - when :datetime then Time.iso8601(value) |
39 | | - when :json then JSON.load(value) |
40 | | - end if value.present? |
| 26 | + raise InvalidType if type && !TYPES.key?(type) |
| 27 | + |
| 28 | + TYPES[type || :string].cast(value) |
41 | 29 | end |
42 | 30 |
|
43 | | - def types_to_strings(values) |
44 | | - Array(values).flatten.map { |value| type_to_string(value) } |
| 31 | + def types_to_strings(values, type) |
| 32 | + Array(values).flatten.map { |value| type_to_string(value, type) } |
45 | 33 | end |
46 | 34 |
|
47 | 35 | def strings_to_types(values, type) |
|
0 commit comments