import gleam/bytes_tree pub type Socket // https://www.erlang.org/doc/apps/kernel/inet#t:address_family/0 // local socket type Local { Local(socket_path: String) } type ModeValue { Binary } type IPCOption { Active(Bool) Mode(ModeValue) } pub type IPCError { IPCError(reason: String) } pub fn connect(socket_path: String) -> Result(Socket, IPCError) { let options = [Mode(Binary), Active(False)] // timeout in ms let timeout = 1000 gen_tcp_connect(Local(socket_path), 0, options, timeout) } pub fn send(socket: Socket, message: String) -> Result(Nil, IPCError) { gen_tcp_send(socket, bytes_tree.from_string(message)) } pub fn close(socket: Socket) -> Nil { gen_tcp_close(socket) } // https://www.erlang.org/doc/apps/kernel/gen_tcp.html#connect/4 @external(erlang, "gen_tcp", "connect") fn gen_tcp_connect( address: Local, port: Int, options: List(IPCOption), timeout: Int, ) -> Result(Socket, IPCError) // https://www.erlang.org/doc/apps/kernel/gen_tcp.html#send/2 @external(erlang, "ipc_ffi", "send") fn gen_tcp_send( socket: Socket, packet: bytes_tree.BytesTree, ) -> Result(Nil, IPCError) // https://www.erlang.org/doc/apps/kernel/gen_tcp.html#close/1 @external(erlang, "gen_tcp", "close") fn gen_tcp_close(socket: Socket) -> Nil