]> git.llucax.com Git - software/pymin.git/blob - dispatcher.py
78ae2460d4c7b1c6e2074a26e3148ba7d864f864
[software/pymin.git] / dispatcher.py
1 # vim: set et sts=4 sw=4 encoding=utf-8 :
2
3 class BadRouteError(Exception):
4
5         def __init__(self,cmd):
6                 self.cmd = cmd
7
8         def __str__(self):
9                 return repr(cmd)
10
11 class CommandNotFoundError(Exception):
12
13         def __init__(self,cmd):
14                 self.cmd = cmd
15
16         def __str__(self):
17                 return repr(cmd)
18
19 class Dispatcher:
20
21         def __init__(self, routes=dict()):
22                 self.routes = routes
23
24         def dispatch(self, route):
25                 route = route.split() # TODO considerar comillas
26                 try:
27                         handler = self.routes[route[0]]
28                         route = route[1:]
29                         while not callable(handler):
30                                 handler = getattr(handler, route[0])
31                                 route = route[1:]
32                         handler(*route)
33
34                 except KeyError:
35                         raise CommandNotFoundError(route[0])
36                 except AttributeError:
37                         raise BadRouteError(route[0])
38                 except IndexError:
39                         pass
40
41
42 def test_func(*args):
43         print 'func:', args
44
45
46 class TestClassSubHandler:
47
48         def subcmd(self, *args):
49                 print 'class.subclass.subcmd:', args
50
51
52 class TestClass:
53
54         def cmd1(self, *args):
55                 print 'class.cmd1:', args
56
57         def cmd2(self, *args):
58                 print 'class.cmd2:', args
59
60         subclass = TestClassSubHandler()
61
62
63 if __name__ == '__main__':
64
65     d = Dispatcher(dict(
66             func=test_func,
67             inst=TestClass(),
68     ))
69
70     d.dispatch('func arg1 arg2 arg3')
71     d.dispatch('inst cmd1 arg1 arg2 arg3 arg4')
72     d.dispatch('inst subclass subcmd arg1 arg2 arg3 arg4 arg5')
73
74 # Ideas / TODO:
75 #
76 # * Soportar comillas para argumentos con espacios y otros caracteres, onda:
77 #   'misc set motd "Hola!\nEste es el servidor de garombia"'
78 #
79 # * Soportar keyword arguments, onda que:
80 #   'dns set pepe=10.10.10.1 juan=10.10.10.2'
81 #   se mapee a algo como: dns.set(pepe='10.10.10.1', juan='10.10.10.2')
82 #
83 # Estas cosas quedan sujetas a necesitada y a definición del protocolo.
84 # Para mí lo ideal es que el protocolo de red sea igual que la consola del
85 # usuario, porque después de todo no va a ser más que eso, mandar comanditos.
86 #
87 # Por otro lado, el cliente de consola, por que no es el cliente web pero
88 # accedido via ssh usando un navegador de texto como w3m???
89