diff --git a/src/date_fmt.zig b/src/date_fmt.zig index 7e44da7..9746fe6 100644 --- a/src/date_fmt.zig +++ b/src/date_fmt.zig @@ -33,3 +33,20 @@ pub fn scrobbleToRow(allocator: std.mem.Allocator, scrobble: Data.Scrobble) !Dat .date = try dateFmt(allocator, scrobble.date), }; } + +pub fn urlDecode(allocator: std.mem.Allocator, str: []const u8) ![]const u8 { + var decoded = std.ArrayList(u8).init(allocator); + var i: usize = 0; + while (i < str.len) : (i += 1) { + const v = str[i]; + if (v == '%') { + if (i + 2 < str.len) { + const hex = str[i + 1 .. i + 3]; + const char = try std.fmt.parseInt(u8, hex, 16); + try decoded.append(char); + i += 2; + } else return error.InvalidInput; + } else try decoded.append(v); + } + return decoded.toOwnedSlice(); +}