diff --git a/src/discord.zig b/src/discord.zig index c0edb1b..6375ca9 100644 --- a/src/discord.zig +++ b/src/discord.zig @@ -310,7 +310,7 @@ pub const GatewayPayload = @import("structures/types.zig").GatewayPayload; // END USING NAMESPACE pub const Shard = @import("shard.zig"); -pub const zjson = @import("json.zig"); +pub const zjson = @compileError("Deprecated, use std.json instead."); pub const Internal = @import("internal.zig"); const GatewayDispatchEvent = Internal.GatewayDispatchEvent; diff --git a/src/shard.zig b/src/shard.zig index 59d6dfa..a5a0fa0 100644 --- a/src/shard.zig +++ b/src/shard.zig @@ -381,7 +381,7 @@ pub fn close(self: *Self, code: ShardSocketCloseCodes, reason: []const u8) Close .reason = reason, //[]const u8 }) catch { // log that the connection died, but don't stop the bot - self.logif("Shard {d} closed with error: {s} # {d}", .{self.id, reason, @intFromEnum(code)}); + std.debug.print("Shard {d} closed with error: {s} # {d}\n", .{self.id, reason, @intFromEnum(code)}); }; } diff --git a/src/structures/component.zig b/src/structures/component.zig index 4ad359e..5c0b252 100644 --- a/src/structures/component.zig +++ b/src/structures/component.zig @@ -153,6 +153,28 @@ pub const SelectMenu = union(MessageComponentTypes) { SelectMenuUsersAndRoles: SelectMenuUsersAndRoles, SelectMenuChannels: SelectMenuChannels, + pub fn jsonParse(allocator: std.mem.Allocator, src: []const u8) !@This() { + const value = try std.json.innerParse(std.json.Value, allocator, src, .{ + .max_value_len = 0x100, + }); + + if (!value != .object) @panic("coulnd't match against non-object type"); + + switch (value.object.get("type") orelse @panic("couldn't find property `type`")) { + .integer => |num| return switch (@as(MessageComponentTypes, @enumFromInt(num))) { + .SelectMenu => .{ .SelectMenu = try std.json.parseFromValue(SelectMenuString, allocator, value, .{.max_value_len = 0x100})}, + .SelectMenuUsers => .{ .SelectMenuUsers = try std.json.parseFromValue(SelectMenuUsers, allocator, value, .{.max_value_len = 0x100})}, + .SelectMenuRoles => .{ .SelectMenuRoles = try std.json.parseFromValue(SelectMenuRoles, allocator, value, .{.max_value_len = 0x100})}, + .SelectMenuUsersAndRoles => .{ .SelectMenuUsersAndRoles = try std.json.parseFromValue(SelectMenuUsersAndRoles, allocator, value, .{.max_value_len = 0x100})}, + .SelectMenuChannels => .{ .SelectMenuChannels = try std.json.parseFromValue(SelectMenuChannels, allocator, value, .{.max_value_len = 0x100})}, + }, + else => @panic("got type but couldn't match against non enum member `type`"), + } + + return try MessageComponent.json(allocator, value); + } + + // legacy pub fn json(allocator: std.mem.Allocator, value: zjson.JsonType) !@This() { if (!value.is(.object)) @panic("coulnd't match against non-object type"); diff --git a/src/structures/snowflake.zig b/src/structures/snowflake.zig index c5d70c0..e001ccc 100644 --- a/src/structures/snowflake.zig +++ b/src/structures/snowflake.zig @@ -54,6 +54,7 @@ pub const Snowflake = enum(u64) { } /// zjson parse + /// legacy pub fn json(_: std.mem.Allocator, value: zjson.JsonType) !@This() { if (value.is(.string)) return Snowflake.fromRaw(value.string) catch @@ -61,6 +62,18 @@ pub const Snowflake = enum(u64) { unreachable; } + /// std.json parse + pub fn jsonParse(allocator: std.mem.Allocator, src: []const u8) !@This() { + const value = try std.json.parseFromSlice(std.json.Value, allocator, src, .{ + .max_value_len = 0x100 + }); + + if (value != .string) + return Snowflake.fromRaw(value.string) catch + std.debug.panic("invalid snowflake: {s}\n", .{value.string}); + unreachable; + } + /// print pub fn format(self: Snowflake, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void { try writer.print("{d}", .{self.into()});