lib/choir/src/composition/abi/context.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const contract = @import("contract.zig");
2
3 const Status = contract.Status;
4
5 /// Stable header that binds a frame to one loaded composition.
6 pub const Context = extern struct {
7 version: u32,
8 byte_size: u32,
9 owner_address: u64,
10 owner_cookie: u64,
11
12 pub fn init(owner_address: u64, owner_cookie: u64) Context {
13 return .{
14 .version = contract.version,
15 .byte_size = @sizeOf(Context),
16 .owner_address = owner_address,
17 .owner_cookie = owner_cookie,
18 };
19 }
20
21 pub fn validate(self: *const Context) Status {
22 if (self.version != contract.version or self.byte_size < @sizeOf(Context)) return .incompatible_context;
23 if (self.owner_address == 0 or self.owner_cookie == 0) return .incompatible_context;
24 return .ok;
25 }
26 };