lxc-exporter/lib/cborio.rb

55 lines
976 B
Ruby
Raw Normal View History

require 'cbor'
class CBORIO
include Enumerable
def orig_io() @io end
def unpacker() @un end
def close() @io.close end
def write( obj) @io.write CBOR.pack( obj) end
def sync() @io.sync end
def sync( v) @io.sync = v end
def self.pipe() IO.pipe.map &self.method(:new) end
def self.popen &exe
rd, wr = self.pipe
pid =
fork do
rd.close
yield wr
exit 0
end
wr.close
[pid, rd]
end
def initialize io
@io, @un = io, CBOR::Unpacker.new
@io.sync = true
end
def self.open io, &exe
if block_given?
s = self.new io
begin yield s
ensure s.close
end
else self.new io
end
end
def read
return @un.read rescue EOFError
loop do
@un.feed @io.readpartial( 1024)
return @un.read rescue EOFError
end
end
def each &exe
return to_enum __method__ unless block_given?
loop { yield read }
self
rescue EOFError
self
end
end