class Terminalwire::Client::Handler

def connect

def connect
  @adapter.write(event: "initialization",
   protocol: { version: VERSION },
   entitlement: @entitlement.serialize,
   program: {
     name: @program_name,
     arguments: @program_arguments
   })
  loop do
    handle @adapter.read
  end
end

def handle(message)

def handle(message)
  case message
  in { event: "resource", action: "command", name:, parameters: }
    @resources.dispatch(**message)
  in { event: "exit", status: }
    exit Integer(status)
  end
end

def initialize(adapter, arguments: ARGV, program_name: $0, entitlement:)

def initialize(adapter, arguments: ARGV, program_name: $0, entitlement:)
  @entitlement = entitlement
  @adapter = adapter
  @program_arguments = arguments
  @program_name = program_name
  @resources = Resource::Handler.new do |it|
    it << Resource::STDOUT.new("stdout", @adapter, entitlement:)
    it << Resource::STDIN.new("stdin", @adapter, entitlement:)
    it << Resource::STDERR.new("stderr", @adapter, entitlement:)
    it << Resource::Browser.new("browser", @adapter, entitlement:)
    it << Resource::File.new("file", @adapter, entitlement:)
    it << Resource::Directory.new("directory", @adapter, entitlement:)
  end
end