Module: EasyCreds::VaultPicker

Defined in:
lib/easy_creds/vault_picker.rb

Constant Summary collapse

CREATE_SENTINEL =
:'__create_new__'
DEFAULT_NEW_NAME =
'easy_creds'

Class Method Summary collapse

Class Method Details

.create_vault(prompt) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/easy_creds/vault_picker.rb', line 39

def self.create_vault(prompt)
  name = prompt.ask('New vault name:', default: DEFAULT_NEW_NAME) do |q|
    q.validate(/\S+/, 'Vault name cannot be blank.')
  end
  return nil unless name

  name = name.strip
  output = `op vault create #{Shellwords.escape(name)} 2>&1`
  if $CHILD_STATUS.success?
    Theme.success("Created vault '#{name}'")
    name
  else
    Theme.failure("Could not create vault: #{output.strip}")
    nil
  end
end

.fetch_vaultsObject



30
31
32
33
34
35
36
37
# File 'lib/easy_creds/vault_picker.rb', line 30

def self.fetch_vaults
  raw = `op vault list --format=json 2>/dev/null`
  return [] unless $CHILD_STATUS.success?

  JSON.parse(raw).map { |v| v['name'] }
rescue JSON::ParserError
  []
end

.pick(prompt) ⇒ Object

Shows existing 1Password vaults + a “create new” option. Returns the chosen vault name (string), or nil if the user aborts.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/easy_creds/vault_picker.rb', line 10

def self.pick(prompt)
  vaults = fetch_vaults

  choices = vaults.map { |v| { name: "  #{v}", value: v } }

  if choices.any?
    choices << { name: Theme.pastel.dim('  ─────────────────────────────────'), value: nil, disabled: '' }
  end

  choices << { name: "  #{Theme.pastel.bold('✚ create new vault…')}", value: CREATE_SENTINEL }

  selection = prompt.select('Select default vault:', choices, cycle: true, filter: false,
                            per_page: [choices.size, 20].min)

  return nil if selection.nil?
  return selection unless selection == CREATE_SENTINEL

  create_vault(prompt)
end