Class: Amount::Registry
- Inherits:
-
Object
- Object
- Amount::Registry
- Defined in:
- lib/amount/registry.rb,
lib/amount/registry/generated_constructors.rb
Overview
Defined Under Namespace
Classes: AlreadyRegistered, Entry, GeneratedConstructors, InvalidDisplayUnit, NoDefaultRate, RegistryLocked, UnknownType
Instance Method Summary collapse
- #activate_generated_methods! ⇒ void
- #clear! ⇒ void
- #default_rate(from, to) ⇒ BigDecimal
- #default_rate?(from, to) ⇒ Boolean
-
#initialize ⇒ Registry
constructor
A new instance of Registry.
- #lock! ⇒ void
- #locked? ⇒ Boolean
- #lookup(symbol) ⇒ Entry
-
#register(symbol, decimals:, display_symbol: symbol.to_s, display_position: :suffix, ui_decimals: decimals, display_units: nil, default_display: nil, class: nil) ⇒ void
Registers a new fungible type.
- #register_default_rate(from, to, rate) ⇒ void
- #registered?(symbol) ⇒ Boolean
- #remove_generated_methods! ⇒ void
- #symbols ⇒ Array<Symbol>
Constructor Details
#initialize ⇒ Registry
Returns a new instance of Registry.
41 42 43 44 45 46 47 48 |
# File 'lib/amount/registry.rb', line 41 def initialize @entries = {} @default_rates = {} @locked = false @lock = Mutex.new @generated_constructors = GeneratedConstructors.new end |
Instance Method Details
#activate_generated_methods! ⇒ void
This method returns an undefined value.
210 211 212 213 214 |
# File 'lib/amount/registry.rb', line 210 def activate_generated_methods! @lock.synchronize do @generated_constructors.activate(@entries) end end |
#clear! ⇒ void
This method returns an undefined value.
138 139 140 141 142 143 144 145 |
# File 'lib/amount/registry.rb', line 138 def clear! @lock.synchronize do ensure_unlocked! @generated_constructors.remove_all @entries.clear @default_rates.clear end end |
#default_rate(from, to) ⇒ BigDecimal
174 175 176 177 178 179 180 |
# File 'lib/amount/registry.rb', line 174 def default_rate(from, to) @lock.synchronize do @default_rates.fetch([from.to_sym, to.to_sym]) do raise NoDefaultRate, "no default rate for #{from} -> #{to}; pass rate: explicitly" end end end |
#default_rate?(from, to) ⇒ Boolean
188 189 190 |
# File 'lib/amount/registry.rb', line 188 def default_rate?(from, to) @lock.synchronize { @default_rates.key?([from.to_sym, to.to_sym]) } end |
#lock! ⇒ void
This method returns an undefined value.
195 196 197 198 199 |
# File 'lib/amount/registry.rb', line 195 def lock! @lock.synchronize do @locked = true end end |
#locked? ⇒ Boolean
205 206 207 |
# File 'lib/amount/registry.rb', line 205 def locked? @lock.synchronize { @locked } end |
#lookup(symbol) ⇒ Entry
118 119 120 121 122 123 124 |
# File 'lib/amount/registry.rb', line 118 def lookup(symbol) @lock.synchronize do @entries.fetch(symbol.to_sym) do raise UnknownType, "#{symbol} is not registered" end end end |
#register(symbol, decimals:, display_symbol: symbol.to_s, display_position: :suffix, ui_decimals: decimals, display_units: nil, default_display: nil, class: nil) ⇒ void
This method returns an undefined value.
Registers a new fungible type.
When the symbol is a valid Ruby method name after downcasing, an ergonomic constructor is also generated on ‘Amount`, such as `Amount.usdc(“1.50”)`.
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/amount/registry.rb', line 74 def register(symbol, decimals:, display_symbol: symbol.to_s, display_position: :suffix, ui_decimals: decimals, display_units: nil, default_display: nil, class: nil) raise ArgumentError, "symbol must not be blank" if symbol.nil? || symbol.to_s.empty? symbol = symbol.to_sym @lock.synchronize do ensure_unlocked! raise AlreadyRegistered, "#{symbol} already registered" if @entries.key?(symbol) validate_display_units!(display_units, default_display) if display_units entry = Entry.new( symbol:, decimals:, display_symbol:, display_position:, ui_decimals:, display_units:, default_display:, amount_class: binding.local_variable_get(:class) || Amount ) @entries[symbol] = entry @generated_constructors.define_for(entry) end end |
#register_default_rate(from, to, rate) ⇒ void
This method returns an undefined value.
154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/amount/registry.rb', line 154 def register_default_rate(from, to, rate) from = from.to_sym to = to.to_sym lookup(from) lookup(to) @lock.synchronize do ensure_unlocked! @default_rates[[from, to]] = Amount.coerce_decimal(rate) end end |
#registered?(symbol) ⇒ Boolean
108 109 110 |
# File 'lib/amount/registry.rb', line 108 def registered?(symbol) @lock.synchronize { @entries.key?(symbol.to_sym) } end |
#remove_generated_methods! ⇒ void
This method returns an undefined value.
217 218 219 220 221 |
# File 'lib/amount/registry.rb', line 217 def remove_generated_methods! @lock.synchronize do @generated_constructors.remove_all end end |
#symbols ⇒ Array<Symbol>
130 131 132 |
# File 'lib/amount/registry.rb', line 130 def symbols @lock.synchronize { @entries.keys } end |