Implement date parsing
zeit is a little heavy handed for what I'm doing. It was easier, but this isn't hard. And this behaves more how I want
This commit is contained in:
parent
4634838a25
commit
5e5abc7bf3
3 changed files with 31 additions and 10 deletions
|
|
@ -2,7 +2,8 @@
|
||||||
//! Fields based on JSON response fields
|
//! Fields based on JSON response fields
|
||||||
|
|
||||||
const Alias = @import("Alias.zig").Alias;
|
const Alias = @import("Alias.zig").Alias;
|
||||||
const zeit = @import("zeit");
|
//const zeit = @import("zeit");
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
pub const Artist = struct {
|
pub const Artist = struct {
|
||||||
id: []const u8,
|
id: []const u8,
|
||||||
|
|
@ -28,7 +29,7 @@ pub const Recording = struct {
|
||||||
@"artist-credit": ?[]ArtistCredit = null,
|
@"artist-credit": ?[]ArtistCredit = null,
|
||||||
//artist_credit: []ArtistCredit,
|
//artist_credit: []ArtistCredit,
|
||||||
@"first-release-date": ?[]const u8 = null,
|
@"first-release-date": ?[]const u8 = null,
|
||||||
dt: ?i64 = null,
|
//dt: ?i64 = null,
|
||||||
//@"first-release-date": ?union(enum) { date: []const u8, dt: zeit.Date } = null,
|
//@"first-release-date": ?union(enum) { date: []const u8, dt: zeit.Date } = null,
|
||||||
//first_release_date: []const u8,
|
//first_release_date: []const u8,
|
||||||
releases: ?[]Release = null,
|
releases: ?[]Release = null,
|
||||||
|
|
@ -37,8 +38,28 @@ pub const Recording = struct {
|
||||||
disambiguation: ?[]const u8 = null,
|
disambiguation: ?[]const u8 = null,
|
||||||
|
|
||||||
pub fn lessThan(context: void, a: Recording, b: Recording) bool {
|
pub fn lessThan(context: void, a: Recording, b: Recording) bool {
|
||||||
_ = context;
|
_ = context; // Idk what this is but it's in the Zig docs
|
||||||
return a.dt.? < b.dt.?;
|
if (a.@"first-release-date") |adtstr| {
|
||||||
|
if (b.@"first-release-date") |bdtstr| {
|
||||||
|
const adtyr = std.fmt.parseInt(u32, adtstr[0..4], 10) catch 0; // Each `catch 0` is to avoid returning an error
|
||||||
|
const bdtyr = std.fmt.parseInt(u32, bdtstr[0..4], 10) catch 0;
|
||||||
|
if (adtyr != bdtyr) {
|
||||||
|
return adtyr < bdtyr;
|
||||||
|
} else if (adtstr.len > 7) {
|
||||||
|
if (bdtstr.len < 7) return true; // a provides more information
|
||||||
|
const adtmn = std.fmt.parseInt(u32, adtstr[5..7], 10) catch 0;
|
||||||
|
const bdtmn = std.fmt.parseInt(u32, bdtstr[5..7], 10) catch 0;
|
||||||
|
if (adtmn != bdtmn) {
|
||||||
|
return adtmn < bdtmn;
|
||||||
|
} else if (adtstr.len == 10) {
|
||||||
|
if (bdtstr.len < 10) return true; // a provides more information
|
||||||
|
const adtdy = std.fmt.parseInt(u32, adtstr[8..10], 10) catch 0;
|
||||||
|
const bdtdy = std.fmt.parseInt(u32, bdtstr[8..10], 10) catch 0;
|
||||||
|
return adtdy < bdtdy;
|
||||||
|
} else return false; // Either b provides more information, or they're the same date
|
||||||
|
} else return false; // Either b provides more information, or they're the same date
|
||||||
|
} else return true; // b provides no information
|
||||||
|
} else return false; // a provides no information
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
pub const Release = struct {
|
pub const Release = struct {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const zeit = @import("zeit");
|
//const zeit = @import("zeit");
|
||||||
|
|
||||||
const Entities = @import("Entities.zig");
|
const Entities = @import("Entities.zig");
|
||||||
const Artist = Entities.Artist;
|
const Artist = Entities.Artist;
|
||||||
|
|
@ -80,10 +80,10 @@ pub const Result = struct {
|
||||||
0 => return null,
|
0 => return null,
|
||||||
1 => return self.recordings.?[0].id,
|
1 => return self.recordings.?[0].id,
|
||||||
else => {
|
else => {
|
||||||
var rcs: []Recording = self.recordings.?;
|
const rcs: []Recording = self.recordings.?;
|
||||||
for (rcs, 0..) |rc, i| {
|
//for (rcs, 0..) |rc, i| {
|
||||||
rcs[i].dt = (try zeit.instant(.{ .source = .{ .iso8601 = rc.@"first-release-date".? } })).unixTimestamp();
|
// rcs[i].dt = (try zeit.instant(.{ .source = .{ .iso8601 = rc.@"first-release-date".? } })).unixTimestamp();
|
||||||
}
|
//}
|
||||||
std.mem.sort(Recording, rcs, {}, Recording.lessThan);
|
std.mem.sort(Recording, rcs, {}, Recording.lessThan);
|
||||||
for (rcs) |rc| {
|
for (rcs) |rc| {
|
||||||
if (std.mem.eql(u8, tn, rc.title)) {
|
if (std.mem.eql(u8, tn, rc.title)) {
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ test "rgid_via_recording_multiple_artists_2" {
|
||||||
//try testing.expect(false);
|
//try testing.expect(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "rid" {
|
test "rid_aqualung" {
|
||||||
const test_alloc = std.testing.allocator;
|
const test_alloc = std.testing.allocator;
|
||||||
const track: []const u8 = "Aqualung";
|
const track: []const u8 = "Aqualung";
|
||||||
const album: []const u8 = "Aqualung";
|
const album: []const u8 = "Aqualung";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue