diff --git a/pkg/sentry/level.zig b/pkg/sentry/level.zig new file mode 100644 index 000000000..4b618678a --- /dev/null +++ b/pkg/sentry/level.zig @@ -0,0 +1,8 @@ +/// sentry_level_t +pub const Level = enum(c_int) { + debug = -1, + info = 0, + warning = 1, + err = 2, + fatal = 3, +}; diff --git a/pkg/sentry/main.zig b/pkg/sentry/main.zig index 6c1940f60..b8133800f 100644 --- a/pkg/sentry/main.zig +++ b/pkg/sentry/main.zig @@ -1,5 +1,15 @@ pub const c = @import("c.zig").c; +pub const Level = @import("level.zig").Level; +pub const Value = @import("value.zig").Value; +pub const UUID = @import("uuid.zig").UUID; + +pub fn captureEvent(value: Value) ?UUID { + const uuid: UUID = .{ .value = c.sentry_capture_event(value.value) }; + if (uuid.isNil()) return null; + return uuid; +} + test { @import("std").testing.refAllDecls(@This()); } diff --git a/pkg/sentry/uuid.zig b/pkg/sentry/uuid.zig new file mode 100644 index 000000000..d1e234dda --- /dev/null +++ b/pkg/sentry/uuid.zig @@ -0,0 +1,18 @@ +const std = @import("std"); +const assert = std.debug.assert; +const c = @import("c.zig").c; + +/// sentry_uuid_t +pub const UUID = struct { + value: c.sentry_uuid_t, + + pub fn isNil(self: UUID) bool { + return c.sentry_uuid_is_nil(&self.value) != 0; + } + + pub fn string(self: UUID) [37]u8 { + var buf: [37]u8 = undefined; + c.sentry_uuid_as_string(&self.value, &buf); + return buf; + } +}; diff --git a/pkg/sentry/value.zig b/pkg/sentry/value.zig new file mode 100644 index 000000000..6df70d6d7 --- /dev/null +++ b/pkg/sentry/value.zig @@ -0,0 +1,34 @@ +const std = @import("std"); +const assert = std.debug.assert; +const c = @import("c.zig").c; +const Level = @import("level.zig").Level; + +/// sentry_value_t +pub const Value = struct { + /// The underlying value. This is a union that could be represented with + /// an extern union but I don't want to risk C ABI issues so we wrap it + /// in a struct. + value: c.sentry_value_t, + + pub fn initMessageEvent( + level: Level, + logger: ?[]const u8, + message: []const u8, + ) Value { + return .{ .value = c.sentry_value_new_message_event_n( + @intFromEnum(level), + if (logger) |v| v.ptr else null, + if (logger) |v| v.len else 0, + message.ptr, + message.len, + ) }; + } + + pub fn decref(self: Value) void { + c.sentry_value_decref(self.value); + } + + pub fn incref(self: Value) Value { + c.sentry_value_incref(self.value); + } +};