55 lines
976 B
Ruby
55 lines
976 B
Ruby
|
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
|