Class: Hecks::Router

Inherits:
Object
  • Object
show all
Defined in:
lib/hecks/router.rb,
lib/hecks/router/namespace_installer.rb

Overview

The public, project-wide dispatch door. It owns address resolution only; each discovered Bluebook keeps its own runtime and persistence bindings.

Defined Under Namespace

Classes: AmbiguousShortRoute, NamespaceInstaller, NotBooted, UnknownAddress, WrongVerbKind

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(register) ⇒ Router

Returns a new instance of Router.



29
30
31
# File 'lib/hecks/router.rb', line 29

def initialize(register)
  @register = register
end

Instance Attribute Details

#registerObject (readonly)

Returns the value of attribute register.



10
11
12
# File 'lib/hecks/router.rb', line 10

def register
  @register
end

Class Method Details

.boot(root) ⇒ Object

Install one project router for ordinary application calls. The explicit Router.load API remains useful for tests and embedded hosts.



16
17
18
19
20
# File 'lib/hecks/router.rb', line 16

def self.boot(root)
  router = load(root)
  router.install_namespace!
  @default = router
end

.defaultObject



22
23
24
# File 'lib/hecks/router.rb', line 22

def self.default
  @default || raise(NotBooted, "no project router is booted — call Hecks::Router.boot(root) first")
end

.dispatch(address, **args) ⇒ Object



26
# File 'lib/hecks/router.rb', line 26

def self.dispatch(address, **args) = default.dispatch(address, **args)

.load(root) ⇒ Object



12
# File 'lib/hecks/router.rb', line 12

def self.load(root) = new(Bluebook::ProjectLoader.load(root))

.query(address, **args) ⇒ Object



27
# File 'lib/hecks/router.rb', line 27

def self.query(address, **args)    = default.query(address, **args)

Instance Method Details

#availableObject



33
# File 'lib/hecks/router.rb', line 33

def available = register.entries.values

#dispatch(address, **args) ⇒ Object

Raises:



46
47
48
49
50
51
# File 'lib/hecks/router.rb', line 46

def dispatch(address, **args)
  entry = resolve(address)
  raise WrongVerbKind, "#{address.inspect} names a query; use #query" unless entry.command?

  entry.dispatcher.dispatch(local_verb(entry), **args)
end

#install_namespace!Object



35
# File 'lib/hecks/router.rb', line 35

def install_namespace! = NamespaceInstaller.new(self).install!

#query(address, **args) ⇒ Object

Raises:



53
54
55
56
57
58
# File 'lib/hecks/router.rb', line 53

def query(address, **args)
  entry = resolve(address)
  raise WrongVerbKind, "#{address.inspect} names a command; use #dispatch" unless entry.query?

  entry.dispatcher.query(local_verb(entry), **args)
end

#resolve(address) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/hecks/router.rb', line 37

def resolve(address)
  fqn = Fqn.parse(address)
  raise UnknownAddress, "router addresses require a realm: #{address.inspect}" unless fqn.realm

  register.fetch(fqn.to_s)
rescue KeyError
  raise UnknownAddress, "no Bluebook route for #{address.inspect}"
end