Skip to content

Commit 734b1be

Browse files
committed
add more array and map access function
1 parent 68c8c57 commit 734b1be

File tree

2 files changed

+48
-16
lines changed

2 files changed

+48
-16
lines changed

src/msgpack.zig

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ pub const Payload = union(enum) {
7474
/// the error for Payload
7575
pub const Errors = error{
7676
NotMap,
77+
NotArr,
7778
};
7879

7980
nil: void,
@@ -87,6 +88,38 @@ pub const Payload = union(enum) {
8788
map: Map,
8889
ext: EXT,
8990

91+
/// get array element
92+
pub fn getArrElement(self: Payload, index: usize) !Payload {
93+
if (self != .arr) {
94+
return Errors.NotArr;
95+
}
96+
return self.arr[index];
97+
}
98+
99+
/// get array length
100+
pub fn getArrLen(self: Payload) !usize {
101+
if (self != .arr) {
102+
return Errors.NotArr;
103+
}
104+
return self.arr.len;
105+
}
106+
107+
/// get map's element
108+
pub fn mapGet(self: Payload, key: []const u8) !?Payload {
109+
if (self != .map) {
110+
return Errors.NotMap;
111+
}
112+
return self.map.get(key);
113+
}
114+
115+
/// set array element
116+
pub fn setArrElement(self: *Payload, index: usize, val: Payload) !void {
117+
if (self.* != .arr) {
118+
return Errors.NotArr;
119+
}
120+
self.arr[index] = val;
121+
}
122+
90123
/// put a new element to map payload
91124
pub fn mapPut(self: *Payload, key: []const u8, val: Payload) !void {
92125
if (self.* != .map) {

src/msgpack_unit_test.zig

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ test "bin write and read" {
131131
}
132132

133133
test "map write and read" {
134-
// TODO: made test
135134
var arr: [0xffff_f]u8 = std.mem.zeroes([0xffff_f]u8);
136135
var write_buffer = std.io.fixedBufferStream(&arr);
137136
var read_buffer = std.io.fixedBufferStream(&arr);
@@ -171,16 +170,16 @@ test "map write and read" {
171170
defer val.free(allocator);
172171

173172
try expect(val == .map);
174-
try expect(val.map.get("nil").? == .nil);
175-
try expect(val.map.get("id").?.uint == 16);
176-
try expect(val.map.get("bool").?.bool == true);
173+
try expect((try val.mapGet("nil")).? == .nil);
174+
try expect((try val.mapGet("id")).?.uint == 16);
175+
try expect((try val.mapGet("bool")).?.bool == true);
177176
// Additional consideration needs
178177
// to be given to the precision of floating point numbers
179-
try expect(val.map.get("float").?.float == 0.5);
180-
try expect(u8eql(str, val.map.get("str").?.str.value()));
181-
try expect(u8eql(&bin, val.map.get("bin").?.bin.value()));
182-
try expect(val.map.get("ss").?.map.get("kk").?.int == -5);
183-
for (val.map.get("arr").?.arr, 0..) |v, i| {
178+
try expect((try val.mapGet("float")).?.float == 0.5);
179+
try expect(u8eql(str, (try val.mapGet("str")).?.str.value()));
180+
try expect(u8eql(&bin, (try val.mapGet("bin")).?.bin.value()));
181+
try expect((try (try val.mapGet("ss")).?.mapGet("kk")).?.int == -5);
182+
for ((try val.mapGet("arr")).?.arr, 0..) |v, i| {
184183
try expect(v.uint == i);
185184
}
186185
}
@@ -196,19 +195,19 @@ test "array write and read" {
196195
);
197196

198197
const test_val = [5]u8{ 1, 2, 3, 4, 5 };
199-
var test_payload: [5]Payload = undefined;
198+
var test_payload = try Payload.arrPayload(5, allocator);
199+
defer test_payload.free(allocator);
200200
for (test_val, 0..) |v, i| {
201-
test_payload[i] = Payload{
202-
.uint = v,
203-
};
201+
try test_payload.setArrElement(i, Payload.uintToPayload(v));
204202
}
205203

206-
try p.write(.{ .arr = &test_payload });
204+
try p.write(test_payload);
207205
const val = try p.read(allocator);
208206
defer val.free(allocator);
209207

210-
for (val.arr, 0..) |v, i| {
211-
try expect(v.uint == test_val[i]);
208+
for (0..try val.getArrLen()) |i| {
209+
const element = try val.getArrElement(i);
210+
try expect(element.uint == test_val[i]);
212211
}
213212
}
214213

0 commit comments

Comments
 (0)