diff --git a/lib/literal/rails/enum_macro.rb b/lib/literal/rails/enum_macro.rb new file mode 100644 index 00000000..c3b5edac --- /dev/null +++ b/lib/literal/rails/enum_macro.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Literal::Rails::EnumMacro + def literal_enum(attribute_name, enum, **) + attribute(attribute_name, :literal_enum, type: enum, subtype: type_for_attribute(attribute_name), **) + end +end diff --git a/lib/literal/rails/enum_type.rb b/lib/literal/rails/enum_type.rb index e3c1c1e2..0e4db904 100644 --- a/lib/literal/rails/enum_type.rb +++ b/lib/literal/rails/enum_type.rb @@ -1,8 +1,9 @@ # frozen_string_literal: true class Literal::Rails::EnumType < ActiveModel::Type::Value - def initialize(enum) + def initialize(enum, subtype) @enum = enum + @subtype = subtype || ActiveModel::Type::Value.new super() end @@ -14,8 +15,10 @@ def cast(value) case value when nil nil + when @enum + value else - @enum.coerce(value) + @enum.coerce(@subtype.cast(value)) end end @@ -24,7 +27,7 @@ def serialize(value) when nil nil else - @enum.coerce(value).value + @subtype.serialize(@enum.coerce(value).value) end end @@ -33,7 +36,7 @@ def deserialize(value) when nil nil else - @enum.coerce(value) + @enum.coerce(@subtype.deserialize(value)) end end end diff --git a/lib/literal/railtie.rb b/lib/literal/railtie.rb index 75dd3114..9bdca4de 100644 --- a/lib/literal/railtie.rb +++ b/lib/literal/railtie.rb @@ -3,13 +3,15 @@ class Literal::Railtie < Rails::Railtie initializer "literal.register_literal_enum_type" do [ActiveRecord::Type, ActiveModel::Type].each do |registry| - registry.register(:literal_enum) do |name, type:| - Literal::Rails::EnumType.new(type) + registry.register(:literal_enum) do |name, type:, subtype:| + Literal::Rails::EnumType.new(type, subtype) end registry.register(:literal_flags) do |name, type:| Literal::Rails::FlagsType.new(type) end end + + ActiveRecord::Base.extend Literal::Rails::EnumMacro end end