module Rules

  class Undefined_element < Element
    def end_element uri, localname, qname
      log :UndefinedElement
    end

    def self.element_rules *args
      []
    end

    def self.attribute_rules name
      []
    end
  end

  class Unexpected_attribute < TextElement
    def validate value
      log :UexpectedAttribute
    end
  end

  class Missing_namespace < Element
    def end_element uri, localname, qname
      log :MissingNamespace
    end

    def self.element_rules *args
      []
    end
  end

  class Unknown_namespace < Element
    def norm uri
      uri = uri.chop if [?/, ?#].include? uri[-1]
      uri.downcase
    end

    def self.element_rules *args
      []
    end

    def end_element uri, localname, qname
      uri = norm(uri)
      Xmlns.values.each do |ns|
        next unless ns
        return log(:InvalidNamespace) if norm(ns) == uri
      end

      @parent.class.instance_eval{@element}.keys.each do |element|
        return log(:InvalidNamespace) if localname == element.split(':')[-1]
      end
    end
  end

end
