#!/usr/bin/env ruby
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

require "arrow"

table = Arrow::Table.new(a: [1, 2, 3],
                         b: ["a", "b", "c"])
IO.pipe do |input, output|
  pid = spawn(RbConfig.ruby, File.join(__dir__, "read-pipe.rb"), in: input)
  input.close
  output.singleton_class.__send__(:undef_method, :seek)
  Gio::RubyOutputStream.open(output) do |gio_output|
    Arrow::GIOOutputStream.open(gio_output) do |arrow_output|
      Arrow::RecordBatchStreamWriter.open(arrow_output, table.schema) do |writer|
        writer.write_table(table)
      end
    end
  end
  output.close
  Process.waitpid(pid)
end
