@@ -9,21 +9,22 @@ pub const State = struct {
99 slice : []* Parameter ,
1010 allocator : std.mem.Allocator ,
1111
12- pub fn serialize (self : * const State , writer : * std.Io.Writer ) ! void {
12+ pub fn serialize (self : * const State , writer : * std.Io.Writer , comptime UserParameters : type ) ! void {
1313 var aw = std .Io .Writer .Allocating .init (self .allocator );
1414 defer aw .deinit ();
1515
1616 var w = bufzilla .Writer .init (& aw .writer );
1717
1818 try w .startObject ();
1919
20- for (self .slice ) | parameter |
21- switch (parameter .* ) {
22- inline else = > | * p | {
23- const id = p .options .id .? ;
24- const value = p .get ();
20+ const parameters : * UserParameters = @ptrCast (@alignCast (self .context ));
21+ inline for (std .meta .fields (UserParameters )) | field |
22+ switch (@field (parameters , field .name )) {
23+ inline else = > | * parameter | {
24+ const id = parameter .options .id .? ;
25+ const value = parameter .get ();
2526
26- try w .writeAny (id );
27+ try w .writeAny (parameter . options . id .? );
2728 try w .writeAnyExplicit (@TypeOf (value ), value );
2829
2930 self .log .debug ("saved parameter '{s}' = {any}" , .{ id , value });
@@ -38,7 +39,7 @@ pub const State = struct {
3839 try writer .flush ();
3940 }
4041
41- pub fn deserialize (self : * State , reader : * std.Io.Reader ) ! void {
42+ pub fn deserialize (self : * State , reader : * std.Io.Reader , comptime UserParameters : type ) ! void {
4243 var aw = std .Io .Writer .Allocating .init (self .allocator );
4344 defer aw .deinit ();
4445
@@ -49,23 +50,39 @@ pub const State = struct {
4950
5051 var r = bufzilla .Reader (.{}).init (bytes );
5152
52- for (self .slice ) | parameter |
53- switch (parameter .* ) {
54- inline else = > | * p | {
55- const id = p .options .id .? ;
56- const decoded_value = try r .readPath (id );
57- if (decoded_value ) | value | {
53+ const parameters : * UserParameters = @ptrCast (@alignCast (self .context ));
54+ const fields = std .meta .fields (UserParameters );
55+
56+ var queries : [fields .len ]bufzilla.PathQuery = undefined ;
57+
58+ inline for (fields , 0.. ) | field , i |
59+ queries [i ] = .{
60+ .path = switch (@field (parameters , field .name )) {
61+ inline else = > | p | p .options .id .? ,
62+ },
63+ };
64+
65+ try r .readPaths (& queries );
66+
67+ inline for (fields , 0.. ) | field , i |
68+ switch (@field (parameters , field .name )) {
69+ inline else = > | * parameter | {
70+ const id = parameter .options .id .? ;
71+ const param_type = @TypeOf (parameter .* ).param_type ;
72+
73+ if (queries [i ].value ) | value |
5874 switch (value ) {
59- @TypeOf ( p .* ). param_type .bufzillaValueTag () = > | v | {
60- p .set (v );
75+ param_type .bufzillaValueTag () = > | v | {
76+ parameter .set (v );
6177 self .log .debug ("read parameter '{s}' = {any}" , .{ id , v });
6278 },
6379 else = > self .log .warn (
6480 "wrong type for parameter '{s}': expected {s}, got {s}" ,
65- .{ id , @tagName (@TypeOf ( p .* ). param_type ), @tagName (value ) },
81+ .{ id , @tagName (param_type ), @tagName (value ) },
6682 ),
6783 }
68- } else self .log .warn ("did not find parameter '{s}'" , .{id });
84+ else
85+ self .log .warn ("did not find parameter '{s}'" , .{id });
6986 },
7087 };
7188 }
0 commit comments