File: OptionParser.vala

package info (click to toggle)
steadyflow 0.2.0-1.1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,384 kB
  • ctags: 57
  • sloc: perl: 1,186; xml: 46; python: 44; makefile: 5
file content (77 lines) | stat: -rw-r--r-- 2,200 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
    OptionParser.vala
    Copyright (C) 2010 Maia Kozheva <sikon@ubuntu.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

using Gee;

namespace Steadyflow.Core {

public class OptionParser : GLib.Object {
	private string[] args;
	private Set<string> commands;
	
	public OptionParser (string[] args, bool remove_arg0 = true) {
		this.args = remove_arg0 ? args[1:args.length] : args;
		this.commands = new HashSet<string> ();
	}
	
	public void register_command (string cmd, OptionCommand handler) {
		commands.add (cmd);
		command[cmd].connect((args, kwargs) => { handler(args, kwargs); });
	}
	
	public void run () {
		Gee.List<string> arglist = new ArrayList<string> ();
		Map<string, string> kwargs = new HashMap<string, string> ();
		
		if (args.length == 0) {
			command["@default"] (args, kwargs);
			return;
		}
		
		string cmd = "@default";
		string[] arguments = args;
		
		if (args[0][0] != '-') {
			cmd = arguments[0];
			arguments = arguments[1:arguments.length];
		}
		
		foreach (string arg in arguments) {
			if (arg[0] != '-') {
				arglist.add (arg);
			} else {
				string[] keyvalue = arg.split ("=", 2);
				kwargs.set (keyvalue[0], keyvalue.length > 1 ? keyvalue[1] : null);
			}
		}
		
		if (cmd == "@default" || commands.contains (cmd)) {
			command[cmd] (arglist.to_array (), kwargs);
		} else {
			unhandled_command ();
		}
	}
	
	public delegate void OptionCommand (string[] args, Map<string, string> kwargs);
	
	[Signal (detailed = true)]
	private signal void command (string[] args, Map<string, string> kwargs);
	public signal void unhandled_command ();
}

}