module Schemacop
  module V3
    def self.register(*args)
      NodeRegistry.register(*args)
    end

    # @private
    def self.sanitize_exp(exp)
      return exp if exp.is_a?(String)

      # Convert expression to a string
      exp = exp.inspect

      # If regexp has flag /x, squish it
      if exp.match(%r{/[a-wy-z]*?x[a-wy-z]*?})
        exp = exp.squish
      end

      _start_slash, caret, exp, dollar, _end_slash, flags = exp.match(%r{^(/?)(\^)?(.*?)(\$)?(/?)([ixm]*)?$}).captures

      unless flags.blank?
        exp = "(?#{flags})(#{exp})"
      end

      return "#{caret}#{exp}#{dollar}"
    end
  end
end

# Require V3 files
require 'schemacop/v3/node_registry'
require 'schemacop/v3/dsl_scope'
require 'schemacop/v3/context'
require 'schemacop/v3/global_context'
require 'schemacop/v3/result'
require 'schemacop/v3/node'
require 'schemacop/v3/combination_node'
require 'schemacop/v3/numeric_node'
require 'schemacop/v3/all_of_node'
require 'schemacop/v3/any_of_node'
require 'schemacop/v3/array_node'
require 'schemacop/v3/boolean_node'
require 'schemacop/v3/hash_node'
require 'schemacop/v3/integer_node'
require 'schemacop/v3/is_not_node'
require 'schemacop/v3/number_node'
require 'schemacop/v3/object_node'
require 'schemacop/v3/one_of_node'
require 'schemacop/v3/reference_node'
require 'schemacop/v3/string_node'
require 'schemacop/v3/symbol_node'

# Register built-in nodes
Schemacop::V3.register :all_of,    :all_of, Schemacop::V3::AllOfNode
Schemacop::V3.register :any_of,    :any_of, Schemacop::V3::AnyOfNode
Schemacop::V3.register :array,     :ary,    Schemacop::V3::ArrayNode
Schemacop::V3.register :boolean,   :boo,    Schemacop::V3::BooleanNode
Schemacop::V3.register :integer,   :int,    Schemacop::V3::IntegerNode
Schemacop::V3.register :is_not,    :is_not, Schemacop::V3::IsNotNode
Schemacop::V3.register :number,    :num,    Schemacop::V3::NumberNode
Schemacop::V3.register :hash,      :hsh,    Schemacop::V3::HashNode
Schemacop::V3.register :one_of,    :one_of, Schemacop::V3::OneOfNode
Schemacop::V3.register :reference, :ref,    Schemacop::V3::ReferenceNode
Schemacop::V3.register :object,    :obj,    Schemacop::V3::ObjectNode
Schemacop::V3.register :string,    :str,    Schemacop::V3::StringNode
Schemacop::V3.register :symbol,    :sym,    Schemacop::V3::SymbolNode