diff options
Diffstat (limited to 'lib/net/ssh/multi/server_list.rb')
-rw-r--r-- | lib/net/ssh/multi/server_list.rb | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/net/ssh/multi/server_list.rb b/lib/net/ssh/multi/server_list.rb new file mode 100644 index 0000000..1f83be3 --- /dev/null +++ b/lib/net/ssh/multi/server_list.rb @@ -0,0 +1,61 @@ +require 'net/ssh/multi/server' +require 'net/ssh/multi/dynamic_server' + +module Net; module SSH; module Multi + + class ServerList + include Enumerable + + def initialize(list=[]) + @list = list.uniq + end + + def add(server) + index = @list.index(server) + if index + server = @list[index] + else + @list.push(server) + end + server + end + + def concat(servers) + servers.each { |server| add(server) } + self + end + + def each + @list.each do |server| + case server + when Server then yield server + when DynamicServer then server.each { |item| yield item } + else raise ArgumentError, "server list contains non-server: #{server.class}" + end + end + self + end + + def select + subset = @list.select { |i| yield i } + ServerList.new(subset) + end + + def flatten + result = @list.inject([]) do |aggregator, server| + case server + when Server then aggregator.push(server) + when DynamicServer then aggregator.concat(server) + else raise ArgumentError, "server list contains non-server: #{server.class}" + end + end + + result.uniq + end + + def to_ary + flatten + end + end + +end; end; end
\ No newline at end of file |