public
Description: A process execution library which doesn't suck.
Clone URL: git://github.com/codahale/ropen.git
ropen / lib / ropen / pipe.rb
100644 42 lines (31 sloc) 0.677 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
require "ropen"
 
# TODO: document me
# TODO: add writing (e.g., cmd.stdin.puts)
 
class Ropen::Pipe
  attr_reader :reader, :writer
  
  def initialize
    @reader, @writer = IO.pipe
  end
  
  def bind_output(stream)
    swap_streams(stream, @reader, @writer)
  end
  
  def bind_input(stream)
    swap_streams(stream, @writer, @reader)
  end
  
  def close
    close_reader
    close_writer
  end
  
  def close_reader
    @reader.close unless @reader.closed?
  end
  
  def close_writer
    @writer.close unless @writer.closed?
  end
  
private
  
  def swap_streams(stream, to_close, to_reopen)
    to_close.close
    stream.reopen(to_reopen)
    to_reopen.close
  end
  
end