diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/resolvers/chain.lua | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/net/resolvers/chain.lua b/net/resolvers/chain.lua new file mode 100644 index 00000000..b3135e67 --- /dev/null +++ b/net/resolvers/chain.lua @@ -0,0 +1,38 @@ + +local methods = {}; +local resolver_mt = { __index = methods }; + +-- Find the next target to connect to, and +-- pass it to cb() +function methods:next(cb) + if self.resolvers then + if not self.resolver then + if #self.resolvers == 0 then + cb(nil); + return; + end + local next_resolver = table.remove(self.resolvers, 1); + self.resolver = next_resolver; + end + self.resolver:next(function (...) + if self.resolver then + self.last_error = self.resolver.last_error; + end + if ... == nil then + self.resolver = nil; + self:next(cb); + else + cb(...); + end + end); + return; + end +end + +local function new(resolvers) + return setmetatable({ resolvers = resolvers }, resolver_mt); +end + +return { + new = new; +}; |