1 module("luci.lpk.core", package.seeall)
4 Task = luci.util.class()
6 function Task.__init__(self, machine, register, start)
9 -- The queue that has to be processed
12 -- The queue that has to be processed in case of rollback
16 self.register = register
19 function Task.rollback(self)
20 if #self.done < 1 then
24 local state = table.remove(self.done)
25 local ret, err = pcall(state.rollback, state, self.register)
34 function Task.step(self)
35 local state = table.remove(self.work)
36 local ret, next = pcall(state.process, state, self.register)
40 local nstate = self.machine:state(next)
42 table.insert(self.work, state)
43 table.insert(self.work, nstate)
45 self.register.error = "Unknown state: " .. next
49 table.insert(self.done, state)
54 self.register.error = next
59 function Task.perform(self)
63 if not self.register.error then
68 stat, err = self:rollback()
71 assert(not err, "Machine broken!")
73 return false, self.register.error
78 Machine = luci.util.class()
80 function Machine.__init__(self, namespace)
81 self.namespace = namespace or _NAME
84 function Machine.state(self, name)
85 local ret, state = pcall(require, self.namespace .. "." .. name)
89 function Machine.task(self, name, ...)
90 local start = self:state(name)
92 if not start or not start.entry then
93 error("No such command: " .. name)
98 if start:entry(register) then
99 return Task(self, register, start)
101 return nil, register.error