Sha256: 7c46a61de6b83dd23e66319262a862e197446bc71c67d8e653f772811da771a0

Contents?: true

Size: 1.26 KB

Versions: 1

Compression:

Stored size: 1.26 KB

Contents

# frozen_string_literal: true

require_relative 'entry'
require_relative 'key'
require_relative 'stores/memory'

module Teton
  # The main interface for any store backend.
  class Db
    DEFAULT_SEPARATOR = '/'

    attr_reader :separator, :store

    def initialize(separator: DEFAULT_SEPARATOR, store: Stores::Memory.new)
      raise ArgumentError, 'separator is required' if separator.to_s.empty?

      @separator = separator.to_s
      @store     = store

      freeze
    end

    def set(key, data)
      key = key(key)

      raise ArgumentError, "key: #{key} does not point to an entry" unless key.entry?

      store.set(key, string_keys_and_values(data))

      self
    end

    def get(key, limit: nil, skip: nil)
      store.get(
        key(key),
        limit: zero_floor_or_nil(limit),
        skip: zero_floor_or_nil(skip)
      )
    end

    def del(key)
      tap { store.del(key(key)) }
    end

    def count(key)
      store.count(key(key))
    end

    private

    def zero_floor_or_nil(value)
      return unless value

      value ? [value, 0].max : nil
    end

    def key(key)
      key.is_a?(Key) ? key : Key.new(key, separator: separator)
    end

    def string_keys_and_values(hash)
      (hash || {}).to_h { |k, v| [k.to_s, v.to_s] }
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
teton-0.0.3 lib/teton/db.rb