summaryrefslogtreecommitdiff
path: root/src/type/Watcher.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/type/Watcher.zig')
-rw-r--r--src/type/Watcher.zig43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/type/Watcher.zig b/src/type/Watcher.zig
new file mode 100644
index 0000000..6369df5
--- /dev/null
+++ b/src/type/Watcher.zig
@@ -0,0 +1,43 @@
+const std = @import("std");
+const c = @import("c");
+const zpy = @import("../root.zig");
+
+const Self = @This();
+
+id: c_int,
+
+pub const Callback = fn (*zpy.Type) error{Exception}!void;
+
+pub fn add(callback: Callback) !Self {
+ const wrapper = struct {
+ pub fn wrapper(t: [*c]c.PyObject) callconv(.c) c_int {
+ return if (std.meta.isError(callback(@ptrCast(t)))) -1 else 0;
+ }
+ };
+
+ const result = c.PyType_AddWatcher(&wrapper);
+
+ if (result == -1) {
+ return error.Exception;
+ }
+
+ return .{ .id = result };
+}
+
+pub fn clear(self: Self) !void {
+ if (c.PyType_Clear(self.id) == -1) {
+ return error.Exception;
+ }
+}
+
+pub fn watch(self: Self, t: *zpy.Dict) !void {
+ if (c.PyType_Watch(self.id, t) == -1) {
+ return error.Exception;
+ }
+}
+
+pub fn unwatch(self: Self, t: *zpy.Dict) !void {
+ if (c.PyType_Unwatch(self.id, t) == -1) {
+ return error.Exception;
+ }
+}