# encoding: utf-8

module Motion; module Util
  class Version
    include Comparable

    def initialize(version)
      @version = version.to_s
      unless @version =~ /^[.0-9]+$/
        raise ArgumentError, "A version may only contain periods and digits."
      end
    end

    def to_s
      @version
    end

    def segments
      @segments ||= @version.split('.').map(&:to_i)
    end

    # This is pretty much vendored straight from RubyGems, except we don't
    # care about string segments for our purposes.
    #
    # https://github.com/rubygems/rubygems/blob/81d806d818baeb5dcb6398ca631d772a003d078e/lib/rubygems/version.rb
    #
    def <=>(other)
      other = Version.new(other) if String === other
      return unless Version === other
      return 0 if @version == other.to_s

      lhsegments = segments
      rhsegments = other.segments

      lhsize = lhsegments.size
      rhsize = rhsegments.size
      limit  = (lhsize > rhsize ? lhsize : rhsize) - 1

      i = 0
      while i <= limit
        lhs, rhs = lhsegments[i] || 0, rhsegments[i] || 0
        i += 1
        next if lhs == rhs
        return lhs <=> rhs
      end

      return 0
    end
  end
end; end
