Class: Trevl::Validator

Inherits:
Object
  • Object
show all
Defined in:
lib/trevl/validator.rb

Defined Under Namespace

Classes: Result

Constant Summary collapse

SCHEMA_DIR =
File.expand_path("schema", __dir__)
COMPONENT_SCHEMA_PATH =
File.join(SCHEMA_DIR, "component.json")
DOCUMENT_SCHEMA_PATH =
File.join(SCHEMA_DIR, "document.json")

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.validate(yaml_string) ⇒ Object



18
19
20
# File 'lib/trevl/validator.rb', line 18

def self.validate(yaml_string)
  new.validate(yaml_string)
end

.validate_component(component_hash) ⇒ Object



22
23
24
# File 'lib/trevl/validator.rb', line 22

def self.validate_component(component_hash)
  new.validate_component(component_hash)
end

Instance Method Details

#validate(yaml_string) ⇒ Object



26
27
28
29
30
31
# File 'lib/trevl/validator.rb', line 26

def validate(yaml_string)
  parsed = YAML.safe_load(yaml_string, permitted_classes: [Hash, Symbol], aliases: true)
  validate_document(parsed)
rescue Psych::SyntaxError => e
  Result.new(valid?: false, errors: ["YAML syntax error: #{e.message}"])
end

#validate_component(component_hash) ⇒ Object



33
34
35
36
# File 'lib/trevl/validator.rb', line 33

def validate_component(component_hash)
  schema_errors = component_schemer.validate(component_hash).map { |e| format_error(e) }
  Result.new(valid?: schema_errors.empty?, errors: schema_errors)
end

#validate_document(parsed) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/trevl/validator.rb', line 38

def validate_document(parsed)
  if parsed.is_a?(Array)
    validate_component_array(parsed)
  elsif parsed.is_a?(Hash) && parsed["components"].is_a?(Array)
    validate_component_array(parsed["components"])
  elsif parsed.is_a?(Hash)
    Result.new(valid?: false, errors: ["Document must have a 'components' array"])
  else
    Result.new(valid?: false, errors: ["Document must be a Hash or Array, got #{parsed.class}"])
  end
end