module ThorSCMVersion
  # @author Josiah Kiehl <josiah@skirmisher.net>
  # adapted from code written by Jamie Winsor <jamie@vialstudios.com>
  class SCMVersionError < StandardError
    class << self
      # @param [Integer] code
      def status_code(code)
        define_method(:status_code) { code }
        define_singleton_method(:status_code) { code }
      end
    end

    alias_method :message, :to_s
  end

  class InternalError < SCMVersionError; status_code(99); end

  class TagFormatError < SCMVersionError
    status_code(100)
    def initialize(tag); @tag = tag; end
    def to_s; "#{@tag.inspect} is formatted incorrectly."; end
  end
  class InvalidPrereleaseFormatError < TagFormatError
    def to_s; super + " Format must be: #{Prerelease::FORMAT.inspect}."; end
  end

  class GitError < SCMVersionError; end
  class GitTagDuplicateError < GitError
    status_code(100)
    def initialize(tag)
      @tag = tag
    end

    def to_s
      msg = "Tried to tag #{@tag}, but it already exists! Either build from the latest tag at this bump level or choose a lower order bump level."
    end
  end
end