Sha256: e80a7389a4a8291d3032b9eca2e535af5df073c5a0b63f761786c70af52ce5ff

Contents?: true

Size: 1.04 KB

Versions: 1

Compression:

Stored size: 1.04 KB

Contents

# frozen_string_literal: true

module BSON::ObjectId::UUIDConvertable
  UUID_PREFIX = '0bdaea'
  UUID_REGEX = /\A0bdaea[0-9a-f]{2}-[0-9a-f]{4}-4[0-9a-f]{3}-[ab][0-9a-f]{3}-[0-9a-f]{12}\z/i
  UUID_VERSION = '4'
  UUID_VARIANT = 'a'

  def to_uuid
    [
      UUID_PREFIX + to_s[0..1],   # 6 digit prefix + first 2 oid digits
      to_s[2..5],                 # next 4 oid digits
      UUID_VERSION + to_s[6..8],  # 1 digit version(0x4) + next 3 oid digits
      UUID_VARIANT + to_s[9..11], # 1 digit variant(0b101) + 1 zero bit + next 3 oid digits
      to_s[12..23]                # last 12 oid digits
    ].join('-')
  end

  module ClassMethods
    def legal?(string)
      UUID_REGEX.match?(string.to_s) ? true : super
    end

    def from_string(string)
      UUID_REGEX.match?(string.to_s) ? from_uuid(string) : super
    end

    def from_uuid(string)
      from_string(string[6..7] + string[9..12] + string[15..17] + string[20..22] + string[24..35])
    end
  end

  def self.prepended(base)
    class << base
      prepend ClassMethods
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bson-objectid-to-uuid-0.1.3 lib/bson/object_id/uuid_convertable.rb