///|
extern "c" fn uv_os_uname(buffer : Bytes) -> Int = "moonbit_uv_os_uname"

///|
struct Utsname {
  sysname : String
  release : String
  version : String
  machine : String
}

///|
pub fn Utsname::sysname(self : Utsname) -> String {
  self.sysname
}

///|
pub fn Utsname::release(self : Utsname) -> String {
  self.release
}

///|
pub fn Utsname::version(self : Utsname) -> String {
  self.version
}

///|
pub fn Utsname::machine(self : Utsname) -> String {
  self.machine
}

///|
pub fn os_uname() -> Utsname raise Errno {
  fn decode(bytes : @bytes.View) -> String {
    let buffer = @buffer.new()
    for i in 0.. Int = "moonbit_uv_os_tmpdir"

///|
pub fn os_tmpdir() -> String raise Errno {
  let size = 64
  let mut bytes = Bytes::make(size, 0)
  let size : FixedArray[Int] = [size]
  let status = uv_os_tmpdir(bytes, size)
  if status < 0 {
    let errno = Errno::of_int(status)
    guard errno is Errno(ENOBUFS) else { raise errno }
    bytes = Bytes::make(size[0] + 1, 0)
    let status = uv_os_tmpdir(bytes, size)
    if status < 0 {
      raise Errno::of_int(status)
    }
  }
  @encoding.decode_lossy(encoding=UTF8, bytes[:size[0]])
}