feat: add allocating json encode/decode functions to cbor

This commit is contained in:
CJ van den Berg 2024-04-02 23:01:20 +02:00
parent d20e071a4d
commit d159ba0632

View file

@ -810,6 +810,15 @@ pub fn toJson(cbor_buf: []const u8, json_buf: []u8) CborJsonError![]const u8 {
return fbs.getWritten(); return fbs.getWritten();
} }
pub fn toJsonAlloc(a: std.mem.Allocator, cbor_buf: []const u8) CborJsonError![]const u8 {
var buf = std.ArrayList(u8).init(a);
defer buf.deinit();
var s = json.writeStream(buf.writer(), .{});
var iter: []const u8 = cbor_buf;
try JsonStream(@TypeOf(buf)).jsonWriteValue(&s, &iter);
return buf.toOwnedSlice();
}
pub fn toJsonPretty(cbor_buf: []const u8, json_buf: []u8) CborJsonError![]const u8 { pub fn toJsonPretty(cbor_buf: []const u8, json_buf: []u8) CborJsonError![]const u8 {
var fbs = fixedBufferStream(json_buf); var fbs = fixedBufferStream(json_buf);
var s = json.writeStream(fbs.writer(), .{ .whitespace = .indent_1 }); var s = json.writeStream(fbs.writer(), .{ .whitespace = .indent_1 });
@ -818,6 +827,15 @@ pub fn toJsonPretty(cbor_buf: []const u8, json_buf: []u8) CborJsonError![]const
return fbs.getWritten(); return fbs.getWritten();
} }
pub fn toJsonPrettyAlloc(a: std.mem.Allocator, cbor_buf: []const u8) CborJsonError![]const u8 {
var buf = std.ArrayList(u8).init(a);
defer buf.deinit();
var s = json.writeStream(buf.writer(), .{ .whitespace = .indent_1 });
var iter: []const u8 = cbor_buf;
try JsonStream(@TypeOf(buf)).jsonWriteValue(&s, &iter);
return buf.toOwnedSlice();
}
fn writeJsonValue(writer: anytype, value: json.Value) !void { fn writeJsonValue(writer: anytype, value: json.Value) !void {
try switch (value) { try switch (value) {
.array => |_| unreachable, .array => |_| unreachable,
@ -917,3 +935,15 @@ pub fn fromJson(json_buf: []const u8, cbor_buf: []u8) ![]const u8 {
_ = try jsonScanUntil(writer, &scanner, .end_of_document); _ = try jsonScanUntil(writer, &scanner, .end_of_document);
return stream.getWritten(); return stream.getWritten();
} }
pub fn fromJsonAlloc(a: std.mem.Allocator, json_buf: []const u8) ![]const u8 {
var stream = std.ArrayList(u8).init(a);
defer stream.deinit();
const writer = stream.writer();
var scanner = json.Scanner.initCompleteInput(a, json_buf);
defer scanner.deinit();
_ = try jsonScanUntil(writer, &scanner, .end_of_document);
return stream.toOwnedSlice();
}