class Zold::Create

Create command

Public Class Methods

new(wallets:, remotes:, log: Log::NULL) click to toggle source
# File lib/zold/commands/create.rb, line 40
def initialize(wallets:, remotes:, log: Log::NULL)
  @wallets = wallets
  @remotes = remotes
  @log = log
end

Public Instance Methods

run(args = []) click to toggle source
# File lib/zold/commands/create.rb, line 46
    def run(args = [])
      opts = Slop.parse(args, help: true, suppress_errors: true) do |o|
        o.banner = "Usage: zold create [options]
Available options:"
        o.string '--public-key',
          'The location of RSA public key (default: ~/.ssh/id_rsa.pub)',
          require: true,
          default: File.expand_path('~/.ssh/id_rsa.pub')
        o.bool '--skip-test',
          'Don\'t check whether this wallet ID is available',
          default: false
        o.string '--network',
          "The name of the network (default: #{Wallet::MAINET}",
          require: true,
          default: Wallet::MAINET
        o.bool '--help', 'Print instructions'
      end
      mine = Args.new(opts, @log).take || return
      create(mine.empty? ? create_id(opts) : Id.new(mine[0]), opts)
    end

Private Instance Methods

create(id, opts) click to toggle source
# File lib/zold/commands/create.rb, line 83
def create(id, opts)
  key = Zold::Key.new(file: opts['public-key'])
  @wallets.acq(id, exclusive: true) do |wallet|
    wallet.init(id, key, network: opts['network'])
    @log.debug("Wallet #{Rainbow(wallet).green} created at #{@wallets.path}")
  end
  @log.info(id)
  id
end
create_id(opts) click to toggle source
# File lib/zold/commands/create.rb, line 69
def create_id(opts)
  loop do
    id = Id.new
    return id if opts['skip-test']
    found = false
    @remotes.iterate(@log) do |r|
      head = r.http("/wallet/#{id}/digest").get
      found = true if head.status == 200
    end
    return id unless found
    @log.info("Wallet ID #{id} is already occupied, will try another one...")
  end
end