# frozen_string_literal: true

require_relative "./common"

module Fixtury
  module LocatorBackend
    class Memory

      include ::Fixtury::LocatorBackend::Common

      MATCHER = /^fixtury-oid-(?<process_id>[\d]+)-(?<object_id>[\d]+)$/.freeze

      def recognizable_key?(locator_value)
        locator_value.is_a?(String) && MATCHER.match?(locator_value)
      end

      def recognizable_value?(_stored_value)
        true
      end

      def load_reference(locator_value)
        match = MATCHER.match(locator_value)
        return nil unless match
        return nil unless match[:process_id].to_i == Process.pid

        ::ObjectSpace._id2ref(match[:object_id].to_i)
      rescue RangeError
        nil
      end

      def dump_value(stored_value)
        "fixtury-oid-#{Process.pid}-#{stored_value.object_id}"
      end

    end
  end
end