liquid_feedback_frontend
view utils/optparse.lua @ 124:f740026b1518
add initiator support in delegation
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
author | Daniel Poelzleithner <poelzi@poelzi.org> |
---|---|
date | Mon Sep 20 20:32:04 2010 +0200 (2010-09-20) |
parents | eeb167cf9dc4 |
children |
line source
1 -- Lua command line option parser.
2 -- Interface based on Pythons optparse.
3 -- http://docs.python.org/lib/module-optparse.html
4 -- (c) 2008 David Manura, Licensed under the same terms as Lua (MIT license)
5 --
6 -- To be used like this:
7 -- t={usage="<some usage message>", version="<version string>"}
8 -- op=OptionParser(t)
9 -- op=add_option{"<opt>", action=<action>, dest=<dest>, help="<help message for this option>"}
10 --
11 -- with :
12 -- <opt> the option string to be used (can be anything, if one letter opt, then should be -x val, more letters: -xy=val )
13 -- <action> one of
14 -- - store: store in options as key, val
15 -- - store_true: stores key, true
16 -- - store_false: stores key, false
17 -- <dest> is the key under which the option is saved
18 --
19 -- options,args = op.parse_args()
20 --
21 -- now options is the table of options (key, val) and args is the table with non-option arguments.
22 -- You can use op.fail(message) for failing and op.print_help() for printing the usage as you like.
24 --module('utils.optparse')
26 local function OptionParser(t)
27 local usage = t.usage
28 local version = t.version
29 local commands = t.commands
31 local o = {}
32 local option_descriptions = {}
33 local option_of = {}
35 function o.fail(s) -- extension
36 io.stderr:write(s .. '\n')
37 os.exit(1)
38 end
40 function o.add_option(optdesc)
41 option_descriptions[#option_descriptions+1] = optdesc
42 for _,v in pairs(optdesc) do
43 option_of[v] = optdesc
44 end
45 end
46 function o.parse_args()
47 -- expand options (e.g. "--input=file" -> "--input", "file")
48 local arg = {unpack(arg)}
49 for i=#arg,1,-1 do local v = arg[i]
50 local flag, val = v:match('^(%-%-%w+)=(.*)')
51 if flag then
52 arg[i] = flag
53 table.insert(arg, i+1, val)
54 end
55 end
57 local options = {}
58 for _,optdesc in ipairs(option_descriptions) do
59 options[optdesc["dest"]] = optdesc.default
60 end
61 local args = {}
62 local i = 1
63 while i <= #arg do local v = arg[i]
64 local optdesc = option_of[v]
65 if optdesc then
66 local action = optdesc.action
67 local val
68 if action == 'store' or action == nil then
69 i = i + 1
70 val = arg[i]
71 if not val then o.fail('option requires an argument ' .. v) end
72 elseif action == 'store_true' then
73 val = true
74 elseif action == 'store_false' then
75 val = false
76 end
77 options[optdesc.dest] = val
78 else
79 if v:match('^%-') then o.fail('invalid option ' .. v) end
80 args[#args+1] = v
81 end
82 i = i + 1
83 end
84 if options.help then
85 o.print_help()
86 os.exit()
87 end
88 if options.version then
89 io.stdout:write(t.version .. "\n")
90 os.exit()
91 end
92 return options, args
93 end
95 local function flags_str(optdesc)
96 local sflags = {}
97 local action = optdesc.action
98 for _,flag in ipairs(optdesc) do
99 local sflagend
100 if action == nil or action == 'store' then
101 local metavar = optdesc.metavar or optdesc.dest:upper()
102 sflagend = #flag == 2 and ' ' .. metavar
103 or '=' .. metavar
104 else
105 sflagend = ''
106 end
107 sflags[#sflags+1] = flag .. sflagend
108 end
109 return table.concat(sflags, ', ')
110 end
112 function o.print_help()
113 io.stdout:write("Usage: " .. usage:gsub('%%prog', arg[0]) .. "\n")
114 io.stdout:write("\n")
115 io.stdout:write("Options:\n")
116 for _,optdesc in ipairs(option_descriptions) do
117 io.stdout:write(" " .. flags_str(optdesc) ..
118 " " .. optdesc.help .. "\n")
119 end
120 if commands then
121 io.stdout:write("\nCommands:\n")
122 for _,command in ipairs(commands) do
123 io.stdout:write(" " .. command[1] ..
124 string.rep(" ", 30-#command[1]) ..
125 command[2] .. "\n")
126 end
127 end
129 end
130 o.add_option{"--help", action="store_true", dest="help",
131 help="show this help message and exit"}
132 if t.version then
133 o.add_option{"--version", action="store_true", dest="version",
134 help="output version info."}
135 end
136 return o
137 end
139 return OptionParser