From f2bfc8e1c99a3cb3d54a9f4cfab8969cbcd9a634 Mon Sep 17 00:00:00 2001
From: jinzhongjia <mail@nvimer.org>
Date: Mon, 15 Jan 2024 16:11:23 +0800
Subject: [PATCH] fix read and write type error

---
 src/msgpack.zig   | 39 ++++++++++++++++++++++++++++++---------
 src/uint-test.zig |  8 ++++----
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/src/msgpack.zig b/src/msgpack.zig
index 298c521..0a2c197 100644
--- a/src/msgpack.zig
+++ b/src/msgpack.zig
@@ -684,13 +684,7 @@ pub fn MsgPack(
                         }
                     },
                     .Struct => {
-                        if (field_type == Str) {
-                            try self.write_str(@as(Str, field_value).value());
-                        } else if (field_type == Bin) {
-                            try self.write_bin(@as(Bin, field_value).value());
-                        } else {
-                            try self.write_map(field_type, field_value);
-                        }
+                        try self.write_map(field_type, field_value);
                     },
                     else => {
                         @compileError("type is not supported!");
@@ -776,6 +770,13 @@ pub fn MsgPack(
             if (type_info != .Struct or type_info.Struct.is_tuple) {
                 @compileError("now only support struct");
             }
+            if (T == EXT) {
+                return self.write_ext(@as(EXT, val));
+            } else if (T == Str) {
+                return self.write_str(@as(Str, val).value());
+            } else if (T == Bin) {
+                return self.write_bin(@as(Bin, val).value());
+            }
 
             const fields_len = type_info.Struct.fields.len;
 
@@ -1602,6 +1603,15 @@ pub fn MsgPack(
 
         /// read map
         pub fn read_map(self: Self, comptime T: type, allocator: Allocator) !T {
+            if (T == EXT) {
+                @compileError("please use read_ext for EXT");
+            }
+            if (T == Str) {
+                @compileError("please use read_str for Str");
+            }
+            if (T == Bin) {
+                @compileError("please use read_bin for Bin");
+            }
             const marker_u8 = try self.read_type_marker_u8();
             const marker = try self.marker_u8_to(marker_u8);
             var len: usize = 0;
@@ -1690,6 +1700,9 @@ pub fn MsgPack(
                                 } else if (field_type == Bin) {
                                     const bin = try self.read_bin(allocator);
                                     @field(res, field_name) = wrapBin(bin);
+                                } else if (field_type == EXT) {
+                                    const ext = try self.read_ext(allocator);
+                                    @field(res, field_name) = ext;
                                 } else {
                                     const val = try self.read_map(field_type, allocator);
                                     @field(res, field_name) = val;
@@ -1795,7 +1808,15 @@ pub fn MsgPack(
                     }
                 },
                 .Struct => {
-                    return self.read_map(T, allocator);
+                    if (T == Bin) {
+                        return self.read_bin(allocator);
+                    } else if (T == Str) {
+                        return self.read_str(allocator);
+                    } else if (T == EXT) {
+                        return self.read_ext(allocator);
+                    } else {
+                        return self.read_map(T, allocator);
+                    }
                 },
                 else => {
                     @compileError("type is not supported!");
@@ -1878,7 +1899,7 @@ const PO = struct {
     }
 };
 
-const EXT = struct {
+pub const EXT = struct {
     type: u8,
     data: []u8,
 };
diff --git a/src/uint-test.zig b/src/uint-test.zig
index 9b10eca..26c4d59 100644
--- a/src/uint-test.zig
+++ b/src/uint-test.zig
@@ -311,8 +311,8 @@ test "arrary write and read" {
 
     const test_val = [5]u8{ 1, 2, 3, 4, 5 };
 
-    try p.write_arr(u8, &test_val);
-    const val = try p.read_arr(allocator, u8);
+    try p.write(&test_val);
+    const val = try p.read([]u8, allocator);
     defer allocator.free(val);
     try expect(std.mem.eql(u8, &test_val, val));
 }
@@ -325,8 +325,8 @@ test "ext write and read" {
     var test_data = [5]u8{ 1, 2, 3, 4, 5 };
     const test_type: u8 = 1;
 
-    try p.write_ext(.{ .type = test_type, .data = &test_data });
-    const val = try p.read_ext(allocator);
+    try p.write(msgpack.EXT{ .type = test_type, .data = &test_data });
+    const val = try p.read(msgpack.EXT, allocator);
     defer allocator.free(val.data);
     try expect(std.mem.eql(u8, &test_data, val.data));
     try expect(test_type == val.type);