lib/peer/src/text.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub const EncodeError = error{OutputTooSmall};
4 pub const DecodeError = error{
5 InvalidEncoding,
6 InvalidLength,
7 OutputTooSmall,
8 };
9
10 pub fn encodedLength(source_bytes: usize) usize {
11 return std.base64.url_safe_no_pad.Encoder.calcSize(source_bytes);
12 }
13
14 pub fn encode(source: []const u8, output: []u8) EncodeError![]const u8 {
15 const needed = encodedLength(source.len);
16 if (output.len < needed) return error.OutputTooSmall;
17 return std.base64.url_safe_no_pad.Encoder.encode(output[0..needed], source);
18 }
19
20 pub fn decodedLength(source: []const u8) DecodeError!usize {
21 return std.base64.url_safe_no_pad.Decoder.calcSizeForSlice(source) catch
22 return error.InvalidLength;
23 }
24
25 pub fn decode(source: []const u8, output: []u8) DecodeError!usize {
26 const needed = try decodedLength(source);
27 if (output.len < needed) return error.OutputTooSmall;
28 std.base64.url_safe_no_pad.Decoder.decode(output[0..needed], source) catch
29 return error.InvalidEncoding;
30 return needed;
31 }