summaryrefslogtreecommitdiff
path: root/lib/net/ssh/multi/server_list.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/net/ssh/multi/server_list.rb')
-rw-r--r--lib/net/ssh/multi/server_list.rb61
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