openjaf/cenit

View on GitHub
lib/xsd/simple_type_restriction.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Xsd
  class SimpleTypeRestriction < BasicTag
    include AttributeContainerTag

    tag 'restriction'

    attr_reader :base
    attr_reader :restrictions

    def initialize(args)
      super
      @base = args[:base]
      @restrictions = {}
      if (restrictions = args[:restrictions])
        restrictions.each { |key, value| @restrictions[key] = value }
      end
    end

    def start_element_tag(name, attributes)
      unless %w{annotation documentation}.include?(name)
        if name == 'enumeration'
          @restrictions[name] ||= []
          @restrictions[name] << attributes
        else
          @restrictions[name] = attributes
        end
      end
      nil
    end

    def to_json_schema
      json = documenting(qualify_type(base).to_json_schema)
      @restrictions.each do |key, value|
        restriction =
          case key
          when 'enumeration'
            { 'enum' => value.collect { |v| v[0][1] }.uniq }
          when 'length'
            { 'minLength' => value[0][1].to_i, 'maxLength' => value[0][1].to_i }
          when 'pattern'
            { 'pattern' => value[0][1] }
          when 'minInclusive'
            { 'minimum' => value[0][1].to_i }
          when 'maxInclusive'
            { 'maximum' => value[0][1].to_i }
          when 'minExclusive'
            { 'minimum' => value[0][1].to_i, 'exclusiveMinimum' => true }
          when 'maxExclusive'
            { 'maximum' => value[0][1].to_i, 'exclusiveMaximum' => true }
          when 'fractionDigits'
            { 'multipleOf' => 1.0/(10 ** value[0][1].to_i) }
          when 'totalDigits' #TODO Fractions digits count in total
            { 'minimum' => 10 ** (value[0][1].to_i - 1), 'maximum' => 10 ** value[0][1].to_i - 1 }
          else
            #TODO simpleType and whiteScpace restrictions
            { (key = key.gsub('xs:', '')) => value[0][1].to_i } unless value.empty?
          end
        json = json.merge(restriction) if restriction
      end
      json
    end

  end
end