class Tardef::Validator::Extensions

Public Instance Methods

validate(obj) click to toggle source
# File lib/tardef/validator/extensions.rb, line 3
def validate(obj)
  errors = []
  extension_list = {}
  obj.imports.each { |e| extension_list[e["name"]] = e }
  obj = obj.to_hash
  
  if obj["extensions"] and not obj["extensions"].empty?
    obj["root"] = {"extensions" => obj["extensions"]}
  end
  
  keys = ["tasks", "lists", "tags", "root"]
  keys.each do |type|
    next unless obj[type]
    obj[type].each do |entry|
      next unless entry["extensions"]
      entry["extensions"].each do |extension|
        # Check that the extension is defined
        unless extension_list.keys.include?(extension["name"])
          errors << "Extension #{extension["name"]} is not defined"
          next
        end
        # Check that the extension is in the right place
        unless extension_list[extension["name"]]["target"] == type.chop
          errors << "Extension #{extension["name"]} is not allowed as #{type} extension"
          next
        end
        # Check for valid syntax
        validator = Syntax.new(extension_list[extension["name"]]["schema"])
        errors += validator.validate(extension["data"])
      end
    end
  end
  
  errors
end