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.
35 36 37 38 39 40 41 |
# File 'lib/amount/registry.rb', line 35 def initialize @entries = {} @default_rates = {} @generated_constructors = GeneratedConstructors.new @locked = false @lock = Mutex.new end |
Instance Method Details
#activate_generated_methods! ⇒ void
This method returns an undefined value.
201 202 203 204 205 |
# File 'lib/amount/registry.rb', line 201 def activate_generated_methods! @lock.synchronize do @generated_constructors.activate(@entries) end end |
#clear! ⇒ void
This method returns an undefined value.
129 130 131 132 133 134 135 136 |
# File 'lib/amount/registry.rb', line 129 def clear! @lock.synchronize do ensure_unlocked! @generated_constructors.remove_all @entries.clear @default_rates.clear end end |
#default_rate(from, to) ⇒ BigDecimal
165 166 167 168 169 170 171 |
# File 'lib/amount/registry.rb', line 165 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
179 180 181 |
# File 'lib/amount/registry.rb', line 179 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.
186 187 188 189 190 |
# File 'lib/amount/registry.rb', line 186 def lock! @lock.synchronize do @locked = true end end |
#locked? ⇒ Boolean
196 197 198 |
# File 'lib/amount/registry.rb', line 196 def locked? @lock.synchronize { @locked } end |
#lookup(symbol) ⇒ Entry
109 110 111 112 113 114 115 |
# File 'lib/amount/registry.rb', line 109 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”)`.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/amount/registry.rb', line 67 def register(symbol, decimals:, display_symbol: symbol.to_s, display_position: :suffix, ui_decimals: decimals, display_units: nil, default_display: nil, class: nil) 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.
145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/amount/registry.rb', line 145 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]] = BigDecimal(rate.to_s) end end |
#registered?(symbol) ⇒ Boolean
99 100 101 |
# File 'lib/amount/registry.rb', line 99 def registered?(symbol) @lock.synchronize { @entries.key?(symbol.to_sym) } end |
#remove_generated_methods! ⇒ void
This method returns an undefined value.
208 209 210 211 212 |
# File 'lib/amount/registry.rb', line 208 def remove_generated_methods! @lock.synchronize do @generated_constructors.remove_all end end |
#symbols ⇒ Array<Symbol>
121 122 123 |
# File 'lib/amount/registry.rb', line 121 def symbols @lock.synchronize { @entries.keys } end |