Skip to content

Commit a83eaf4

Browse files
committed
feat:refactor cid
Signed-off-by: Chen Kai <281165273grape@gmail.com>
1 parent 9dfa1f1 commit a83eaf4

File tree

2 files changed

+31
-105
lines changed

2 files changed

+31
-105
lines changed

src/cid.zig

Lines changed: 30 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ const std = @import("std");
22
const Allocator = std.mem.Allocator;
33
const Multicodec = @import("multicodec.zig").Multicodec;
44
const Multihash = @import("multihash.zig").Multihash;
5+
const varint = @import("unsigned_varint.zig");
56

67
pub const Error = error{
78
UnknownCodec,
@@ -84,115 +85,40 @@ pub fn Cid(comptime S: usize) type {
8485
}
8586
}
8687

87-
// pub fn fromBytes(allocator: Allocator, bytes: []const u8) !@This() {
88-
// if (CidVersion.isV0Binary(bytes)) {
89-
// return @This().init(allocator, .V0, 0x70, bytes[2..]);
90-
// }
91-
//
92-
// if (bytes.len < 2) {
93-
// return Error.InputTooShort;
94-
// }
95-
//
96-
// const version = try std.meta.intToEnum(CidVersion, bytes[0]);
97-
// const codec = bytes[1];
98-
//
99-
// return @This().init(allocator, version, codec, bytes[2..]);
100-
// }
88+
pub fn readBytes(allocator: Allocator, reader: anytype) !Cid {
89+
const version = try varint.decode_stream(reader, u64);
90+
const codec = try varint.decode_stream(reader, u64);
10191

92+
// CIDv0 has the fixed `0x12 0x20` prefix
93+
if (version == 0x12 and codec == 0x20) {
94+
var digest: [32]u8 = undefined;
95+
try reader.readNoEof(&digest);
96+
const mh = try Multihash(32).wrap(version, &digest);
97+
return newV0(allocator, mh);
98+
}
99+
100+
const ver = try CidVersion.fromInt(version);
101+
switch (ver) {
102+
.V0 => return Error.InvalidExplicitCidV0,
103+
.V1 => {
104+
const mh = try Multihash(32).read(reader);
105+
return Cid.init(allocator, ver, codec, mh.getDigest());
106+
},
107+
}
108+
}
109+
110+
fn writeBytesV1(self: *const Cid, writer: anytype) !usize {
111+
const version_written=try varint.encode_stream(writer,u64,self.version.toInt());
112+
const codec_written=try varint.encode_stream(writer,u64,self.codec);
102113

114+
const written: usize = version_written + codec_written;
115+
116+
return written;
117+
}
103118

104-
// pub fn toBytes(self: @This()) ![]u8 {
105-
// var buf = try self.allocator.alloc(u8, 2 + self.hash.len);
106-
//
107-
// switch (self.version) {
108-
// .V0 => {
109-
// buf[0] = 0x12;
110-
// buf[1] = 0x20;
111-
// },
112-
// .V1 => {
113-
// buf[0] = @as(u8, @intCast(@intFromEnum(self.version)));
114-
// buf[1] = @as(u8, @intCast(self.codec));
115-
// },
116-
// }
117-
//
118-
// @memcpy(buf[2..], &self.hash);
119-
// return buf;
120-
// }
121119
};
122120
}
123-
// pub const Codec = enum(u64) {
124-
// Raw = 0x55,
125-
// DagPb = 0x70,
126-
// DagCbor = 0x71,
127-
//
128-
// pub fn fromInt(value: u64) Error!Codec {
129-
// return switch (value) {
130-
// 0x55 => .Raw,
131-
// 0x70 => .DagPb,
132-
// 0x71 => .DagCbor,
133-
// else => Error.UnknownCodec,
134-
// };
135-
// }
136-
// };
137-
//
138-
// pub const Cid = struct {
139-
// version: CidVersion,
140-
// codec: Codec,
141-
// hash: []const u8,
142-
// allocator: Allocator,
143-
//
144-
// pub fn init(allocator: Allocator, version: CidVersion, codec: Codec, hash: []const u8) !Cid {
145-
// if (version == .V0 and codec != .DagPb) {
146-
// return Error.InvalidCidV0Codec;
147-
// }
148-
//
149-
// const hash_copy = try allocator.dupe(u8, hash);
150-
// return Cid{
151-
// .version = version,
152-
// .codec = codec,
153-
// .hash = hash_copy,
154-
// .allocator = allocator,
155-
// };
156-
// }
157-
//
158-
// pub fn fromBytes(allocator: Allocator, bytes: []const u8) !Cid {
159-
// if (CidVersion.isV0Binary(bytes)) {
160-
// return Cid.init(allocator, .V0, .DagPb, bytes[2..]);
161-
// }
162-
//
163-
// if (bytes.len < 2) {
164-
// return Error.InputTooShort;
165-
// }
166-
//
167-
// const version = try std.meta.intToEnum(CidVersion, bytes[0]);
168-
// const codec = try Codec.fromInt(bytes[1]);
169-
//
170-
// return Cid.init(allocator, version, codec, bytes[2..]);
171-
// }
172-
//
173-
// pub fn deinit(self: *Cid) void {
174-
// self.allocator.free(self.hash);
175-
// }
176-
//
177-
// pub fn toBytes(self: Cid) ![]u8 {
178-
// var buf = try self.allocator.alloc(u8, 2 + self.hash.len);
179-
//
180-
// switch (self.version) {
181-
// .V0 => {
182-
// buf[0] = 0x12;
183-
// buf[1] = 0x20;
184-
// },
185-
// .V1 => {
186-
// buf[0] = @as(u8, @intCast(@intFromEnum(self.version)));
187-
// buf[1] = @as(u8, @intCast(@intFromEnum(self.codec)));
188-
// },
189-
// }
190-
//
191-
// std.mem.copyForwards(u8, buf[2..], self.hash);
192-
// return buf;
193-
// }
194-
// };
195-
//
121+
196122
// test "CID basic operations" {
197123
// const testing = std.testing;
198124
// const allocator = testing.allocator;

src/unsigned_varint.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub fn bufferSize(comptime T: type) usize {
8383
}
8484

8585
pub fn encode_stream(writer: anytype, comptime T: type, number: T) !usize {
86-
var buf: [10]u8 = undefined;
86+
var buf: [bufferSize(T)]u8 = undefined;
8787
const encoded = encode(T, number, &buf);
8888
try writer.writeAll(encoded);
8989
return encoded.len;

0 commit comments

Comments
 (0)