MoonBit binding to libuv
moon update
moon add tonyfettes/uv{
"import": [
"tonyfettes/uv"
]
}fn main {
try {
let uv = @uv.Loop::new()
let options = @uv.ProcessOptions::new(
"moon",
["moon", "version"],
fn(process, exit_status, term_signal) {
println(
"Process exited with status \{exit_status} and signal \{term_signal}",
)
process.close(fn(_) { })
},
)
let process = uv.spawn(options)
println("Launched process with ID \{(process).pid()}")
uv.run(Default)
uv.stop()
uv.close()
} catch {
error => println("Error: \{error}")
}
}pub trait Share {
share(Self) -> Self
}pub trait ToStream : ToHandle {
to_stream(Self) -> Stream
of_stream(Stream) -> Self
read_start(Self, (Self, Int) -> View, (Self, Int, View) -> Unit, (Self, Errno) -> Unit) -> Unit raise Errno
read_stop(Self) -> Unit raise Errno
write(Self, Array[View], () -> Unit, (Errno) -> Unit) -> Unit raise Errno
listen(Self, Int, (Self) -> Unit, (Self, Errno) -> Unit) -> Unit raise Errno
is_readable(Self) -> Bool
is_writable(Self) -> Bool
shutdown(Self, () -> Unit, (Errno) -> Unit) -> Shutdown raise Errno
}type AccessFlagstype AddrInfotype AddrInfoFlagsfn AddrInfoFlags::new(passive~ : Bool = .., canonname~ : Bool = .., numeric_host~ : Bool = .., numeric_serv~ : Bool = .., all~ : Bool = .., addrconfig~ : Bool = .., v4mapped~ : Bool = ..) -> AddrInfoFlagstype AddrInfoHintsfn AddrInfoHints::new(flags? : AddrInfoFlags, family? : AddressFamily, socktype? : SockType, protocol? : Protocol) -> AddrInfoHintspub enum AddressFamily {
Inet
Inet6
}let ipv4 = AddressFamily::inet()
let ipv6 = AddressFamily::inet6()
inspect(ipv4, content="Inet")
inspect(ipv6, content="Inet6")impl Show for AddressFamilytype CopyFileFlagsfn CopyFileFlags::new(allow_exists~ : Bool = .., copy_on_write~ : CopyOnWrite = ..) -> CopyFileFlagspub struct CpuTimes {
user : UInt64
nice : UInt64
sys : UInt64
idle : UInt64
irq : UInt64
}pub enum DirentType {
Unknown
File
Dir
Link
Fifo
Socket
Char
Block
}impl Show for DirentTypeimpl ToJson for DirentTypetype Environtype FsEventfn[ToNtbs : ToNtbs] FsEvent::start(self : FsEvent, path : ToNtbs, flags : FsEventFlags, event_cb : (FsEvent, String?, Array[FsEventType]) -> Unit, error_cb : (FsEvent, String?, Errno) -> Unit) -> Unit raise Errnotype FsEventFlagspub enum FsEventType {
Rename
Change
}type Handlepub enum HandleType {
Unknown
Async
Check
FsEvent
FsPoll
Handle
Idle
Pipe
Poll
Prepare
Process
Stream
Tcp
Timer
Tty
Udp
Signal
File
}type Idlelet uv = @uv.Loop::new()
let idle = @uv.Idle::new(uv)
idle.start(fn(_) {
println("Idle callback running")
idle.stop() catch {
error => println("Error stopping idle watcher: \{error}")
}
idle.close(_ => ())
})
uv.run(Default)
uv.close()type Looplet uv = @uv.Loop::new()
uv.close()fn[Ntbs : ToNtbs] Loop::fs_access_sync(self : Loop, path : Ntbs, mode : AccessFlags) -> Unit raise Errnolet uv = Loop::new()
let file = uv.fs_open_sync("README.md", OpenFlags::read_only(), 0o644)
uv.fs_close(
file,
fn() { println("File closed successfully") },
fn(error) { println("Failed to close file: \{error}") }
)
|> ignore()
uv.run(Default)
uv.close()fn[Ntbs : ToNtbs] Loop::fs_copyfile_sync(self : Loop, path : Ntbs, new_path : Ntbs, flags : CopyFileFlags) -> Unit raise Errnolet uv = @uv.Loop::new()
let dir = "test/fixtures/doc-test-dir"
uv.fs_mkdir(
dir,
0o755,
fn() { println("Directory created successfully") },
fn(error) {
println("Failed to create directory: \{error} (expected)")
}
)
|> ignore()
uv.run(Default)
uv.fs_rmdir_sync(dir)
uv.close()let uv = @uv.Loop::new()
uv.fs_mkdir_sync("test/fixtures", 0o755) catch {
error => println("Failed to create directory: \{error} (expected)")
}
uv.close()let uv = Loop::new()
uv.fs_open(
"README.md",
OpenFlags::read_only(),
0o644,
(file) => uv.fs_close_sync(file) catch { _ => () },
(error) => println("Failed to open file: \{error}"),
)
|> ignore()
uv.run(Default)
uv.close()let uv = @uv.Loop::new()
let file = uv.fs_open_sync("README.md", @uv.OpenFlags::read_only(), 0o644)
uv.fs_close_sync(file)
uv.close()let uv = @uv.Loop::new()
uv.fs_read(
@uv.stdin(),
[Bytes::make(100, 0)],
fn(bytes_read) { println("Read \{bytes_read} bytes") },
fn(error) { println("Error: \{error}") }
)
|> ignore()
uv.run(Default)
uv.close()let uv = @uv.Loop::new()
uv.fs_realpath(
"test/fixtures/example.txt",
realpath => println("Resolved: \{realpath}"),
error => println("Failed to resolve path: \{error}")
)
|> ignore()
uv.run(Default)
uv.close()let uv = @uv.Loop::new()
let path = "test/fixtures/doc-test.txt"
let file = uv.fs_open_sync(
path,
@uv.OpenFlags::write_only(create=true),
0o644
)
let data : Bytes = "Hello, World!"
uv.fs_write(
file,
[data],
fn(written) { println("Wrote \{written} bytes") },
fn(error) { println("Error: \{error}") }
)
|> ignore()
uv.run(Default)
uv.fs_close_sync(file)
uv.fs_unlink_sync(path)
uv.close()let uv = @uv.Loop::new()
let path = "test/fixtures/doc-test-sync.txt"
let file = uv.fs_open_sync(
path,
@uv.OpenFlags::write_only(create=true),
0o644
)
let data : Bytes = "Hello, World!"
uv.fs_write_sync(file, [data])
uv.fs_close_sync(file)
uv.fs_unlink_sync(path)
uv.close()fn[Node : ToNtbs, Service : ToNtbs] Loop::getaddrinfo(self : Loop, getaddrinfo_cb : (GetAddrInfo, Iter[AddrInfo]) -> Unit, error_cb : (GetAddrInfo, Errno) -> Unit, node : Node, service : Service, hints? : AddrInfoHints) -> Unit raise Errnolet uv = @uv.Loop::new()
uv.close()let uv = @uv.Loop::new()
uv.run(Default)
uv.close()type Mutextype OpenFlagslet uv = @uv.Loop::new()
let flags = @uv.OpenFlags::read_only()
let file = uv.fs_open_sync("README.md", flags, 0o644)
uv.fs_close_sync(file)
uv.close()let uv = @uv.Loop::new()
// Create a new file for reading and writing, fail if it exists
let flags = @uv.OpenFlags::read_write(create=true, exclusive=true)
let path = "new_file.txt"
let file = uv.fs_open_sync(path, flags, 0o644)
uv.fs_close_sync(file)
uv.fs_unlink_sync(path)
uv.close()let uv = @uv.Loop::new()
// Create a new file for writing, truncate if it exists
let flags = @uv.OpenFlags::write_only(create=true, truncate=true)
let path = "output.txt"
let file = uv.fs_open_sync(path, flags, 0o644)
uv.fs_close_sync(file)
uv.fs_unlink_sync(path)
uv.close()type Pipetype PipeBindFlagstype Processtype ProcessOptionsfn[Ntbs : ToNtbs] ProcessOptions::new(file : Ntbs, args : Array[StringView], env? : Array[StringView], cwd? : StringView, stdio? : Array[StdioContainer], uid? : Uid, gid? : Gid, exit_cb : (Process, Int64, Int) -> Unit) -> ProcessOptionspub enum Protocol {
Tcp
Udp
}type Signaltype Signumtype SockTypetype Sockaddrtype Statpub(all) enum Status {
E2BIG
EACCES
EADDRINUSE
EADDRNOTAVAIL
EAFNOSUPPORT
EAGAIN
EAI_ADDRFAMILY
EAI_AGAIN
EAI_BADFLAGS
EAI_BADHINTS
EAI_CANCELED
EAI_FAIL
EAI_FAMILY
EAI_MEMORY
EAI_NODATA
EAI_NONAME
EAI_OVERFLOW
EAI_PROTOCOL
EAI_SERVICE
EAI_SOCKTYPE
EALREADY
EBADF
EBUSY
ECANCELED
ECHARSET
ECONNABORTED
ECONNREFUSED
ECONNRESET
EDESTADDRREQ
EEXIST
EFAULT
EFBIG
EHOSTUNREACH
EINTR
EINVAL
EIO
EISCONN
EISDIR
ELOOP
EMFILE
EMSGSIZE
ENAMETOOLONG
ENETDOWN
ENETUNREACH
ENFILE
ENOBUFS
ENODEV
ENOENT
ENOMEM
ENONET
ENOPROTOOPT
ENOSPC
ENOSYS
ENOTCONN
ENOTDIR
ENOTEMPTY
ENOTSOCK
ENOTSUP
EOVERFLOW
EPERM
EPIPE
EPROTO
EPROTONOSUPPORT
EPROTOTYPE
ERANGE
EROFS
ESHUTDOWN
ESPIPE
ESRCH
ETIMEDOUT
ETXTBSY
EXDEV
UNKNOWN
EOF
ENXIO
EMLINK
EHOSTDOWN
EREMOTEIO
ENOTTY
EFTYPE
EILSEQ
ESOCKTNOSUPPORT
ENODATA
EUNATCH
ENOEXEC
}type StdioContainerfn[Stream : ToStream + ToHandle] StdioContainer::create_pipe(stream : Stream, readable~ : Bool = .., writable~ : Bool = .., non_block~ : Bool = ..) -> StdioContainertype Streamtype Tcpfn[Sockaddr : ToSockaddr] Tcp::bind(self : Tcp, addr : Sockaddr, flags : TcpBindFlags) -> Unit raise Errnotype TcpBindFlagstype Threadtype Timertype Ttytype TtyModetype Udpfn[Sockaddr : ToSockaddr] Udp::bind(self : Udp, addr : Sockaddr, flags : UdpFlags) -> Unit raise Errnotype Utsnameprintln(@uv.args())let cpu_infos = @uv.cpu_info()
println(cpu_infos)let addr = @uv.ip4_addr("127.0.0.1", 8080)
println(addr.ip_name())println(@uv.os_tmpdir())let info = @uv.os_uname()
println(info.sysname())
println(info.release())
println(info.machine())