Class: Envo::CmdSet

Inherits:
Object
  • Object
show all
Defined in:
lib/envo/cmd_set.rb

Constant Summary collapse

Name =
'set'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, value) ⇒ CmdSet

Returns a new instance of CmdSet.



50
51
52
53
# File 'lib/envo/cmd_set.rb', line 50

def initialize(name, value)
  @name = name
  @value = value
end

Instance Attribute Details

#nameObject

Returns the value of attribute name.



55
56
57
# File 'lib/envo/cmd_set.rb', line 55

def name
  @name
end

#valueObject

Returns the value of attribute value.



55
56
57
# File 'lib/envo/cmd_set.rb', line 55

def value
  @value
end

Class Method Details

.parse_cli(args) ⇒ Object



19
20
21
22
# File 'lib/envo/cmd_set.rb', line 19

def self.parse_cli(args)
  opts = CliParser.filter_opts(args)
  parse_tokens(args, opts)
end

.parse_script(args) ⇒ Object



46
47
48
# File 'lib/envo/cmd_set.rb', line 46

def self.parse_script(args)
  puts "#{Name} parse_script"
end

.parse_tokens(args, opts) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/envo/cmd_set.rb', line 24

def self.parse_tokens(args, opts)
  # find first instance of equals
  i = args.find_index { |arg| arg =~ /=/ }
  raise Envo::Error.new "set: missing '='. Use 'set <name> = <val>'" if !i

  elem = args[i]
  eq_i = elem.index('=')

  first = elem[0...eq_i]
  second = elem[eq_i+1..]
  split = [first, '=', second].select { |s| !s.empty? }

  args[i..i] = split

  i = args.index('=')
  raise Envo::Error.new "set: bad name '#{args[0...i].join(' ')}'. Use 'set <name> = <val>'" if i != 1

  return ParsedCmd.new(CmdUnset.new([args[0]]), opts) if args.size == 2

  ParsedCmd.new(CmdSet.new(args[0], args[2..]), opts)
end

.register_cli_parser(parser) ⇒ Object



11
12
13
# File 'lib/envo/cmd_set.rb', line 11

def self.register_cli_parser(parser)
  parser.add_cmd(Name, ->(cmd, args) { parse_cli(args) })
end

.register_help(help) ⇒ Object



4
5
6
7
8
9
# File 'lib/envo/cmd_set.rb', line 4

def self.register_help(help)
  help.add_cmd "set <name>=<val>", <<~EOF
    set a value to an environment variable
    'set name=' unsets the value
  EOF
end

.register_script_parser(parser) ⇒ Object



15
16
17
# File 'lib/envo/cmd_set.rb', line 15

def self.register_script_parser(parser)
  parser.add_cmd(Name, ->(cmd, tokens, opts) { parse_tokens(tokens, opts) })
end

Instance Method Details

#execute(ctx) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/envo/cmd_set.rb', line 57

def execute(ctx)
  ename = ctx.expand_name(@name)
  new_val = ctx.expand_value(@value)

  old_val = ctx.smart_get(ename)

  ok = old_val.type == new_val.type
  ok ||= old_val.accept_assign?(new_val)
  ok ||= ctx.ask("Assign #{new_val.type} to #{old_val.type}?")
  raise Envo::Error.new "set: assignment of #{new_val.type} to #{old_val.type}" if !ok

  idesc = new_val.invalid_description
  ok = !idesc
  ok ||= ctx.ask("Assign #{idesc} to #{ename}?")
  raise Envo::Error.new "set: assignment of #{idesc} to #{ename}" if !ok

  ctx.smart_set(ename, new_val)
end