lib/ohm/validations.rb in ohm-0.0.5 vs lib/ohm/validations.rb in ohm-0.0.6
- old
+ new
@@ -1,17 +1,74 @@
module Ohm
module Validations
+ class Presenter
+ class UnhandledErrors < StandardError
+ attr :errors
+
+ def initialize(errors)
+ @errors = errors
+ end
+
+ def message
+ "Unhandled errors: #{errors.inspect}"
+ end
+ end
+
+ def initialize(errors)
+ @errors = errors
+ @unhandled = errors.dup
+ @output = []
+ end
+
+ def on(error, message = (block_given? ? yield : raise(ArgumentError)))
+ handle(error) do
+ @output << message
+ end
+ end
+
+ def ignore(error)
+ handle(error)
+ end
+
+ def present
+ yield(self)
+ raise UnhandledErrors.new(@unhandled) unless @unhandled.empty?
+ @output
+ end
+
+ protected
+
+ def handle(error)
+ if (errors = @errors.select {|e| error === e }).any?
+ @unhandled -= errors
+ yield(errors) if block_given?
+ end
+ end
+ end
+
+ class Errors < Array
+ attr_accessor :model
+
+ def initialize(model)
+ @model = model
+ end
+
+ def present(presenter = Presenter, &block)
+ presenter.new(model.errors).present(&block)
+ end
+ end
+
def valid?
errors.clear
validate
errors.empty?
end
def validate
end
def errors
- @errors ||= []
+ @errors ||= Errors.new(self)
end
protected
def assert_format(att, format)