module Rollio

Constants

VERSION

Public Class Methods

load(document = nil, context = self, &block) click to toggle source

@api private @example document = [{

key: '1-a',
roll: '2d6',
entries: [
  { range: [2,3,4,5,6], roll_on: '1-b', with: '1d3', times: 2},
  { range: [7], result: 'Yolo' },
  { range: [8,9,10,11,12], inner_table: {
      roll: '1d4',
      entries: [
        { range: [1,2,3], result: 'Yes' },
        { range: [4], result: 'No' }
      ]
    }
  }
},{
  key: '1-b',
  roll: '1d6',
  entries: [
    { range: [1,2,3,4,5,6], result: 'sub-table' }
  ]
}

] registry = Rollio::Registry.load(document)

@example

registry = Rollio::Registry.load do
  table('1') do
    roll('1d5')
    entry(1, 'Yes!')
    entry(2..5, 'No!')
  end
end

@return [Rollio::Registry, roll_on] @todo Add document schema and validation

# File lib/rollio.rb, line 43
def self.load(document = nil, context = self, &block)
  if document
    Registry.new do |registry|
      document.each do |data|
        context.load_a_table(registry: registry, data: data, context: context)
      end
    end
  else
    Registry.new(&block)
  end
end
load_a_table(registry: , data:, context: self, key: nil) click to toggle source

@api private @todo Does the guts of this logic make sense here?

# File lib/rollio.rb, line 57
def self.load_a_table(registry: , data:, context: self, key: nil)
  key ||= data.fetch(:key)
  label = data.fetch(:label, key)
  table = registry.table(key, label: label)
  table.roll(data.fetch(:roll))
  data.fetch(:entries).each do |table_entry|
    range = table_entry.fetch(:range)
    if table_entry.key?(:roll_on)
      table.entry(range, **table_entry)
    elsif table_entry.key?(:result)
      table.entry(range, table_entry.fetch(:result))
    elsif table_entry.key?(:inner_table)
      inner_table = table_entry.fetch(:inner_table)
      entry = table.entry(range, inner_table: true)
      context.load_a_table(registry: registry, data: inner_table, context: context, key: entry.key)
    end
  end
end