feat: add Bytearray wrapper
This fixes some byte arrays being deserialized as []u32
This commit is contained in:
parent
4c91738fd0
commit
e9afbcf8ae
52
src/deserialization_blocks/bytearray.zig
Normal file
52
src/deserialization_blocks/bytearray.zig
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
const std = @import("std");
|
||||||
|
const getty = @import("getty");
|
||||||
|
const types = @import("../types.zig");
|
||||||
|
|
||||||
|
const Vis = struct {
|
||||||
|
pub usingnamespace getty.de.Visitor(
|
||||||
|
@This(),
|
||||||
|
types.Bytearray,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
visitSeq,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
pub fn visitSeq(
|
||||||
|
_: @This(),
|
||||||
|
alloc: ?std.mem.Allocator,
|
||||||
|
comptime Deserializer: type,
|
||||||
|
input: anytype,
|
||||||
|
) Deserializer.Error!types.Bytearray {
|
||||||
|
var list = std.ArrayList(u8).init(alloc.?);
|
||||||
|
while (try input.nextElement(alloc, u8)) |element| {
|
||||||
|
try list.append(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
return types.Bytearray{ .a = list.toOwnedSlice() };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn is(comptime T: type) bool {
|
||||||
|
return T == types.Bytearray;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn Visitor(comptime _: type) type {
|
||||||
|
return Vis;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize(
|
||||||
|
alloc: ?std.mem.Allocator,
|
||||||
|
comptime _: type,
|
||||||
|
deserializer: anytype,
|
||||||
|
visitor: anytype,
|
||||||
|
) !@TypeOf(visitor).Value {
|
||||||
|
return try deserializer.deserializeSeq(alloc, visitor);
|
||||||
|
}
|
|
@ -50,7 +50,7 @@ pub fn createPlugin(comptime Plugin: type) void {
|
||||||
|
|
||||||
export fn update() void {
|
export fn update() void {
|
||||||
if (allocator == null) {
|
if (allocator == null) {
|
||||||
@panic("Got event while allocator is null! Did you forget to set it?");
|
@panic("Got event while allocator is null! Did you forget to set it?");
|
||||||
}
|
}
|
||||||
|
|
||||||
var ev = api.recvObj(types.Event) catch |err| {
|
var ev = api.recvObj(types.Event) catch |err| {
|
||||||
|
|
|
@ -4,6 +4,7 @@ const json = @import("json");
|
||||||
|
|
||||||
/// getty deserialization blocks required to properly deserialize messages
|
/// getty deserialization blocks required to properly deserialize messages
|
||||||
pub const dbs = .{
|
pub const dbs = .{
|
||||||
|
@import("deserialization_blocks/bytearray.zig"),
|
||||||
@import("deserialization_blocks/char.zig"),
|
@import("deserialization_blocks/char.zig"),
|
||||||
@import("deserialization_blocks/char_or_arrow.zig"),
|
@import("deserialization_blocks/char_or_arrow.zig"),
|
||||||
@import("deserialization_blocks/line_and_column.zig"),
|
@import("deserialization_blocks/line_and_column.zig"),
|
||||||
|
@ -54,6 +55,37 @@ test "deserialize Char" {
|
||||||
defer deser.deinit();
|
defer deser.deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A struct that wraps a bytearray.
|
||||||
|
/// This struct has some custom deserialization behaviour,
|
||||||
|
/// so that bytearrays aren't deserialized as strings.
|
||||||
|
pub const Bytearray = struct {
|
||||||
|
a: []u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
test "deserialize Bytearray" {
|
||||||
|
const valid_json_src =
|
||||||
|
\\[
|
||||||
|
\\ 1,
|
||||||
|
\\ 2,
|
||||||
|
\\ 3,
|
||||||
|
\\ 4
|
||||||
|
\\]
|
||||||
|
;
|
||||||
|
|
||||||
|
var valid_deser = try OwnedDeserData(Bytearray)
|
||||||
|
.deserialize(std.testing.allocator, valid_json_src);
|
||||||
|
defer valid_deser.deinit();
|
||||||
|
|
||||||
|
const invalid_json_src =
|
||||||
|
\\"I'm a string!"
|
||||||
|
;
|
||||||
|
|
||||||
|
try std.testing.expectError(
|
||||||
|
error.InvalidType,
|
||||||
|
OwnedDeserData(Bytearray).deserialize(std.testing.allocator, invalid_json_src),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
pub const EventType = enum {
|
pub const EventType = enum {
|
||||||
ModeUpdate,
|
ModeUpdate,
|
||||||
TabUpdate,
|
TabUpdate,
|
||||||
|
@ -515,11 +547,9 @@ pub const SearchOption = enum {
|
||||||
Wrap,
|
Wrap,
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: Write, TabNameInput, PaneNameInput and SearchInput are actually `[]u8`,
|
|
||||||
// but getty thinks they have to be a string, and not byte arrays.
|
|
||||||
pub const Action = union(enum) {
|
pub const Action = union(enum) {
|
||||||
Quit,
|
Quit,
|
||||||
Write: []u32,
|
Write: Bytearray,
|
||||||
WriteChars: []u8,
|
WriteChars: []u8,
|
||||||
SwitchToMode: InputMode,
|
SwitchToMode: InputMode,
|
||||||
Resize: ResizeDirection,
|
Resize: ResizeDirection,
|
||||||
|
@ -547,7 +577,7 @@ pub const Action = union(enum) {
|
||||||
TogglePaneEmbedOrFloating,
|
TogglePaneEmbedOrFloating,
|
||||||
ToggleFloatingPanes,
|
ToggleFloatingPanes,
|
||||||
CloseFocus,
|
CloseFocus,
|
||||||
PaneNameInput: []u32,
|
PaneNameInput: Bytearray,
|
||||||
UndoRenamePane,
|
UndoRenamePane,
|
||||||
NewTab: ?TabLayout,
|
NewTab: ?TabLayout,
|
||||||
NoOp,
|
NoOp,
|
||||||
|
@ -556,7 +586,7 @@ pub const Action = union(enum) {
|
||||||
CloseTab,
|
CloseTab,
|
||||||
GoToTab: u32,
|
GoToTab: u32,
|
||||||
ToggleTab,
|
ToggleTab,
|
||||||
TabNameInput: []u32,
|
TabNameInput: Bytearray,
|
||||||
UndoRenameTab,
|
UndoRenameTab,
|
||||||
Run: RunCommandAction,
|
Run: RunCommandAction,
|
||||||
Detach,
|
Detach,
|
||||||
|
@ -568,7 +598,7 @@ pub const Action = union(enum) {
|
||||||
Confirm,
|
Confirm,
|
||||||
Deny,
|
Deny,
|
||||||
SkipConfirm: *Action,
|
SkipConfirm: *Action,
|
||||||
SearchInput: []u32,
|
SearchInput: Bytearray,
|
||||||
Search: SearchDirection,
|
Search: SearchDirection,
|
||||||
SearchToggleOption: SearchOption,
|
SearchToggleOption: SearchOption,
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,4 +7,3 @@ pub extern "zellij" fn host_open_file() void;
|
||||||
pub extern "zellij" fn host_switch_tab_to(tab_idx: u32) void;
|
pub extern "zellij" fn host_switch_tab_to(tab_idx: u32) void;
|
||||||
pub extern "zellij" fn host_set_timeout(secs: f64) void;
|
pub extern "zellij" fn host_set_timeout(secs: f64) void;
|
||||||
pub extern "zellij" fn host_exec_cmd() void;
|
pub extern "zellij" fn host_exec_cmd() void;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue