ableos/sysdata/libraries/sunset_proto/src/lib.hb

58 lines
1.2 KiB
Plaintext

.{math: .{Vec2}, buffer, memory} := @use("../../stn/src/lib.hb");
.{Surface} := @use("../../render/src/lib.hb")
$BUFFER := "sunset\0"
client := @use("./client.hb")
server := @use("./server.hb")
message := @use("./message.hb")
receive_message := fn($Expr: type, buffer_id: uint): ?Expr {
recv := @as(?Expr, null)
@inline(buffer.recv, ?Expr, buffer_id, &recv)
return recv
}
send_message := fn($Expr: type, msg: Expr, buffer_id: uint): void {
@inline(buffer.write, ?Expr, buffer_id, &@as(?Expr, msg))
}
await_buffer := fn(name: ^u8): uint {
id := 0
loop if id != 0 return id else id = buffer.search(BUFFER)
}
await_message := fn($Expr: type, buffer_id: uint): Expr {
response := @as(?Expr, null)
loop {
@inline(buffer.recv, ?Expr, buffer_id, &response)
if response != null {
i := 0
return @as(Expr, response)
}
}
}
// ! we need a better message format but this will do for now.
// enums would be nice
MessageHeader := packed struct {
kind: uint,
data: uint,
}
WindowProps := struct {
position: Vec2(uint),
dimensions: Vec2(uint),
// ! replace with owned string type later
title: ^u8,
}
WindowData := struct {
props: WindowProps,
buffer_id: uint,
}
Window := struct {
data: WindowData,
surface: Surface,
}