Module: Coradoc::Reference::Address::Scheme

Defined in:
lib/coradoc/reference/address.rb

Overview

Registry of scheme modules. Each module provides:

scheme_name      -> Symbol
matches?(raw)    -> Boolean
parse(raw)       -> Address
serialize(addr)  -> String

register always forces builtin registration first, so an external scheme registered before first use is never clobbered by the lazy builtin pass. The catch-all anchor scheme is always tried LAST on match, so external schemes are never shadowed by it no matter when they register.

Class Method Summary collapse

Class Method Details

.ensure_builtins_registered!Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/coradoc/reference/address.rb', line 128

def ensure_builtins_registered!
  MUTEX.synchronize do
    return if @builtins_registered

    @registering_builtins = true
    begin
      BUILTIN_SCHEME_ORDER.each do |name|
        const_name = name.to_s.split('_').map(&:capitalize).join
        register(Address.const_get(const_name))
      end
      @builtins_registered = true
    ensure
      @registering_builtins = false
    end
  end
end

.for(name) ⇒ Object



118
119
120
# File 'lib/coradoc/reference/address.rb', line 118

def for(name)
  @registered.find { |m| m.scheme_name == name.to_sym }
end

.match(raw) ⇒ Object



122
123
124
125
126
# File 'lib/coradoc/reference/address.rb', line 122

def match(raw)
  catch_all, specific =
    @registered.partition { |m| m.scheme_name == CATCH_ALL_SCHEME }
  (specific + catch_all).find { |m| m.matches?(raw) }
end

.namesObject



114
115
116
# File 'lib/coradoc/reference/address.rb', line 114

def names
  @registered.map(&:scheme_name)
end

.register(mod) ⇒ Object



108
109
110
111
112
# File 'lib/coradoc/reference/address.rb', line 108

def register(mod)
  ensure_builtins_registered! unless @registering_builtins
  @registered.delete_if { |m| m.scheme_name == mod.scheme_name }
  @registered << mod
end

.reset!Object



145
146
147
148
# File 'lib/coradoc/reference/address.rb', line 145

def reset!
  @registered.clear
  @builtins_registered = false
end