# HG changeset patch # User Kim Alvefur # Date 1642784180 -3600 # Node ID 7c397a49d1632832df0cfc045ad36b1348e8ce98 # Parent 320de3e4b579fe5fdb50188eb2c2423eee5d74cc net.resolvers.chain: A resolver for combining other resolvers Say if you wanted to try both _xmpp and _xmpps services diff -r 320de3e4b579 -r 7c397a49d163 net/resolvers/chain.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/net/resolvers/chain.lua Fri Jan 21 17:56:20 2022 +0100 @@ -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; +};