class Eco::API::UseCases

Public Class Methods

new() click to toggle source
# File lib/eco/api/usecases.rb, line 29
def initialize()
  @usecases      = {}
  @cache_init    = false
  @cases_by_name = {}
  init_caches
end

Public Instance Methods

add(usecase) click to toggle source

Adds `usecase` to the Collection. Before it tries to auto-load pending classes of `auto_loaded_class`. @param usecase [Eco::API::UseCases::UseCase] the usecase to be added.

# File lib/eco/api/usecases.rb, line 71
def add(usecase)
  raise "Expected Eco::API::UseCases::UseCase object. Given: #{usecase}" if !usecase || !usecase.is_a?(Eco::API::UseCases::UseCase)
  name = usecase.name
  type = usecase.type
  puts "Warning: overriding '#{type.to_s}' case #{name}" if self.defined?(name, type: type)
  to_h[key(name, type)] = usecase
  @cache_init = false
  usecase
end
case(name, type: nil) click to toggle source
# File lib/eco/api/usecases.rb, line 111
def case(name, type: nil)
  if type && target_case = to_h[key(name, type)]
    return target_case
  elsif type
    raise UseCases::UnkownCase.new(case_name: name, type: type)
  end
  raise UseCases::UnkownCase.new(case_name: name, type: type) unless cases = by_name[name]
  raise UseCases::AmbiguousCaseReference.new(case_name: name) if cases.length > 1
  cases.first
end
define(name, type:, &block) click to toggle source

@return [Eco::API::UseCases::UseCase] the `name` usecase of type `type` with the defined `block`.

# File lib/eco/api/usecases.rb, line 63
def define(name, type:, &block)
  Eco::API::UseCases::UseCase.new(name, type: type, root: self, &block).tap do |usecase|
    add(usecase)
  end
end
defined?(name, type: nil) click to toggle source
# File lib/eco/api/usecases.rb, line 53
def defined?(name, type: nil)
  return to_h.key?(key(name, type)) if type
  name?(name)
end
dup() click to toggle source

@return [Eco::API::UseCases] a copy of instance object of `self`.

# File lib/eco/api/usecases.rb, line 82
def dup
  init_caches
  self.class.new.merge(self)
end
each(&block) click to toggle source
# File lib/eco/api/usecases.rb, line 44
def each(&block)
  return to_enum(:each) unless block
  items.each(&block)
end
empty?() click to toggle source
# File lib/eco/api/usecases.rb, line 40
def empty?
  count == 0
end
items() click to toggle source
# File lib/eco/api/usecases.rb, line 49
def items
  to_h.values
end
length() click to toggle source
# File lib/eco/api/usecases.rb, line 36
def length
  count
end
merge(cases) click to toggle source

Merges cases overriding self for exisint parsers @param cases [Eco::API::UseCases] the source set of cases to be merged. @return [Eco::API::UseCases] `self`.

# File lib/eco/api/usecases.rb, line 90
def merge(cases)
  return self if !cases
  raise "Expected a Eco::API::UseCases object. Given #{cases.class}" if !cases.is_a?(Eco::API::UseCases)

  to_h.merge!(cases.to_h).transform_values do |usecase|
    usecase.root = self
  end

  @cache_init = false
  self
end
name?(name) click to toggle source
# File lib/eco/api/usecases.rb, line 58
def name?(name)
  !!by_name[name]
end
names() click to toggle source
# File lib/eco/api/usecases.rb, line 102
def names
  by_name.keys
end
types(name) click to toggle source
# File lib/eco/api/usecases.rb, line 106
def types(name)
  return nil if !name?(name)
  by_name[name].map { |usecase| usecase.type }
end

Protected Instance Methods

to_h() click to toggle source
# File lib/eco/api/usecases.rb, line 124
def to_h
  init_caches
  @usecases
end

Private Instance Methods

by_name() click to toggle source
# File lib/eco/api/usecases.rb, line 131
def by_name
  init_caches
  @by_name
end
init_caches() click to toggle source
# File lib/eco/api/usecases.rb, line 136
def init_caches
  # first, make sure it loads pending `:custom_children` children to be loaded
  re_init = self.class.autoload_children(self)
  return true if @cache_init && !re_init
  @by_name = @usecases.values.group_by { |usecase| usecase.name }
  @cache_init = true
end
key(name, type) click to toggle source
# File lib/eco/api/usecases.rb, line 144
def key(name, type)
  name.to_s + type.to_s
end
name(key) click to toggle source
# File lib/eco/api/usecases.rb, line 148
def name(key)
  key.to_s.split(":").first
end
type() click to toggle source
# File lib/eco/api/usecases.rb, line 152
def type
  key.to_s.split(":").last&.to_sym
end