Module: RSMP::SXL::Registry

Defined in:
lib/rsmp/sxl/registry.rb

Overview

Registry of SXL interface classes keyed by SXL name and connection side.

Class Method Summary collapse

Class Method Details

.build(proxy, sxl, side) ⇒ Object



19
20
21
22
# File 'lib/rsmp/sxl/registry.rb', line 19

def self.build(proxy, sxl, side)
  klass = fetch(sxl['name'], side) || default_class(side)
  klass.new(proxy: proxy, name: sxl['name'], version: sxl['version'])
end

.build_for(proxy, sxl) ⇒ Object



24
25
26
27
28
29
30
31
32
33
# File 'lib/rsmp/sxl/registry.rb', line 24

def self.build_for(proxy, sxl)
  case proxy
  when RSMP::SiteProxy
    build(proxy, sxl, :supervisor)
  when RSMP::SupervisorProxy
    build(proxy, sxl, :site)
  else
    raise ArgumentError, "Unknown proxy class #{proxy.class}"
  end
end

.default_class(side) ⇒ Object



35
36
37
# File 'lib/rsmp/sxl/registry.rb', line 35

def self.default_class(side)
  side.to_sym == :site ? SiteInterface : SupervisorInterface
end

.fetch(name, side) ⇒ Object



15
16
17
# File 'lib/rsmp/sxl/registry.rb', line 15

def self.fetch(name, side)
  @interfaces[[name.to_s, side.to_sym]]
end

.register(name, side, klass) ⇒ Object



7
8
9
# File 'lib/rsmp/sxl/registry.rb', line 7

def self.register(name, side, klass)
  @interfaces[[name.to_s, side.to_sym]] = klass
end

.register_interface(klass) ⇒ Object



11
12
13
# File 'lib/rsmp/sxl/registry.rb', line 11

def self.register_interface(klass)
  register sxl_name_for(klass), side_for(klass), klass
end

.side_for(klass) ⇒ Object

Raises:

  • (ArgumentError)


39
40
41
42
43
44
# File 'lib/rsmp/sxl/registry.rb', line 39

def self.side_for(klass)
  return :site if klass < SiteInterface
  return :supervisor if klass < SupervisorInterface

  raise ArgumentError, "Cannot infer SXL interface side for #{klass}"
end

.sxl_name_for(klass) ⇒ Object

Raises:

  • (ArgumentError)


46
47
48
49
50
51
52
# File 'lib/rsmp/sxl/registry.rb', line 46

def self.sxl_name_for(klass)
  namespace = klass.name.split('::')[0...-1].join('::')
  owner = Object.const_get(namespace)
  return owner.sxl_name if owner.respond_to?(:sxl_name)

  raise ArgumentError, "Cannot infer SXL name for #{klass}"
end