Sha256: 7964d45a11007b00bbed2cea13962704742a75e5fcd7a3baa5278786b21821ed

Contents?: true

Size: 1.88 KB

Versions: 7

Compression:

Stored size: 1.88 KB

Contents

# typed: false

module Mangadex
  module Internal
    module Definitions
      class Base
        attr_reader :key, :accepts, :converts, :errors

        def initialize(value, key:, accepts:, required: false, converts: nil)
          @value = value
          @key = key
          @accepts = accepts
          @required = required
          @converts = converts
          @errors = Array.new
        end

        def validate
          validate_required
          return if !@required && empty?

          validate_accepts

          nil
        end

        def validate!
          validate

          raise_if_any_errors!
        end

        def valid?
          validate!
          true
        rescue ArgumentError
          false
        end

        def error_message
          return unless errors.any?

          compile_error_message
        end

        def empty?
          converted_value.respond_to?(:empty?) ? converted_value.empty? : converted_value.to_s.strip.empty?
        end

        def value
          converted_value
        end

        protected

        def validate_required
          return unless @required

          add_error("Missing :#{key}") if empty?
          false
        end

        def validate_accepts
          raise NotImplementedError
        end

        def converted_value
          @converted_value ||= if converts.is_a?(Proc)
            converts.call(@value)
          elsif converts.is_a?(String) || converts.is_a?(Symbol)
            @value.send(converts)
          else
            @value
          end
        end

        def add_error(message)
          @errors << message
          @errors.uniq!
        end

        def compile_error_message
          errors.join(', ')
        end

        private

        def raise_if_any_errors!
          raise ArgumentError, "Validation error: #{compile_error_message}" if errors.any?
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
mangadex-5.10.0 lib/mangadex/internal/definitions/base.rb
mangadex-5.9.0 lib/mangadex/internal/definitions/base.rb
mangadex-5.8.0 lib/mangadex/internal/definitions/base.rb
mangadex-5.7.5.3 lib/mangadex/internal/definitions/base.rb
mangadex-5.7.5.2 lib/mangadex/internal/definitions/base.rb
mangadex-5.7.5.1 lib/mangadex/internal/definitions/base.rb
mangadex-5.7.5 lib/mangadex/internal/definitions/base.rb