diff --git a/lib/docurest/field.rb b/lib/docurest/field.rb new file mode 100644 index 0000000..e4ccad4 --- /dev/null +++ b/lib/docurest/field.rb @@ -0,0 +1,40 @@ +require "docurest/field/base" +require "docurest/field/boolean" +require "docurest/field/date_time" +require "docurest/field/integer" +require "docurest/field/float" + +module Docurest + module Field + CONVERSION = { + boolean: Docurest::Field::Boolean, + integer: Docurest::Field::Integer, + float: Docurest::Field::Float, + date_time: Docurest::Field::DateTime, + } + + def field(name, docusign_name = nil, type = nil) + attr_accessor name + if docusign_name + alias_method docusign_name, name + define_method("#{docusign_name}=") do |value| + value = if type.is_a?(Proc) + type.call value + elsif CONVERSION.key?(type) + CONVERSION[type].new(value).convert + else + value + end + send("#{name}=", value) + end + end + end + + def association(klass, &block) + define_method(klass) do + instance_variable_get(:"@#{klass}") || + instance_variable_set(:"@#{klass}", persisted? ? instance_eval(&block) : []) + end + end + end +end diff --git a/lib/docurest/field/base.rb b/lib/docurest/field/base.rb new file mode 100644 index 0000000..fedebbf --- /dev/null +++ b/lib/docurest/field/base.rb @@ -0,0 +1,6 @@ +module Docurest + module Field + class Base < Struct.new(:value) + end + end +end diff --git a/lib/docurest/field/boolean.rb b/lib/docurest/field/boolean.rb new file mode 100644 index 0000000..93d37c0 --- /dev/null +++ b/lib/docurest/field/boolean.rb @@ -0,0 +1,9 @@ +module Docurest + module Field + class Boolean < Docurest::Field::Base + def convert + value == "true" ? true : false + end + end + end +end diff --git a/lib/docurest/field/date_time.rb b/lib/docurest/field/date_time.rb new file mode 100644 index 0000000..693483e --- /dev/null +++ b/lib/docurest/field/date_time.rb @@ -0,0 +1,9 @@ +module Docurest + module Field + class DateTime < Docurest::Field::Base + def convert + ::DateTime.parse(value) + end + end + end +end diff --git a/lib/docurest/field/float.rb b/lib/docurest/field/float.rb new file mode 100644 index 0000000..805f4a1 --- /dev/null +++ b/lib/docurest/field/float.rb @@ -0,0 +1,9 @@ +module Docurest + module Field + class Float < Docurest::Field::Base + def convert + value.to_f + end + end + end +end diff --git a/lib/docurest/field/integer.rb b/lib/docurest/field/integer.rb new file mode 100644 index 0000000..1e797c4 --- /dev/null +++ b/lib/docurest/field/integer.rb @@ -0,0 +1,9 @@ +module Docurest + module Field + class Integer < Docurest::Field::Base + def convert + value.to_i + end + end + end +end