song: zero fields for variants
Once again, helps remove code duplication and be more future-proof in case any more variants are uncovered. Signed-off-by: Yonah <contrib@gensokyo.uk>
This commit is contained in:
parent
a63af7a4fb
commit
526a0371a4
47
song.go
47
song.go
@ -13,7 +13,6 @@ import (
|
|||||||
type SongResponse Response[Song]
|
type SongResponse Response[Song]
|
||||||
|
|
||||||
// Song holds the metadata of a song.
|
// Song holds the metadata of a song.
|
||||||
// Fields marked with omitempty are only populated when the IsFull method returns true.
|
|
||||||
type Song struct {
|
type Song struct {
|
||||||
CID StringInt `json:"cid"`
|
CID StringInt `json:"cid"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
@ -25,9 +24,53 @@ type Song struct {
|
|||||||
Artists []string `json:"artists"`
|
Artists []string `json:"artists"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsFull returns whether the metadata held by [Song] is considered full (originating from a [SongResponse]).
|
const (
|
||||||
|
// SongVariantCurrent copies the current variant as-is.
|
||||||
|
SongVariantCurrent = iota
|
||||||
|
// SongVariantFull leaves all fields intact in the copy.
|
||||||
|
// This variant is returned by /api/song/%d.
|
||||||
|
SongVariantFull
|
||||||
|
// SongVariantBase zeroes [Song.SourceURL], [Song.LyricURL], [Song.MvURL], [Song.MvCoverURL].
|
||||||
|
// This variant is included in /api/songs.
|
||||||
|
SongVariantBase
|
||||||
|
)
|
||||||
|
|
||||||
|
// IsFull returns whether [Song] is considered to be its [SongVariantFull] variant.
|
||||||
func (s *Song) IsFull() bool { return s.SourceURL != "" }
|
func (s *Song) IsFull() bool { return s.SourceURL != "" }
|
||||||
|
|
||||||
|
// Copy makes a copy of [Song].
|
||||||
|
// For a [Song] where the IsFull method returns true, Copy zeroes fields to convert the copy into other variants.
|
||||||
|
// For [Song] where IsFull returns false, any variant other than [SongVariantCurrent] is undefined.
|
||||||
|
func (s *Song) Copy(variant int) *Song {
|
||||||
|
if s == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
v := *s
|
||||||
|
if variant == SongVariantCurrent {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
if !s.IsFull() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch variant {
|
||||||
|
case SongVariantFull:
|
||||||
|
break
|
||||||
|
|
||||||
|
case SongVariantBase:
|
||||||
|
s.SourceURL = ""
|
||||||
|
s.LyricURL = ""
|
||||||
|
s.MvURL = ""
|
||||||
|
s.MvCoverURL = ""
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// Enrich populates the remaining fields of a non-full [Song].
|
// Enrich populates the remaining fields of a non-full [Song].
|
||||||
func (s *Song) Enrich(ctx context.Context, n Net) error {
|
func (s *Song) Enrich(ctx context.Context, n Net) error {
|
||||||
if s == nil || s.IsFull() {
|
if s == nil || s.IsFull() {
|
||||||
|
|||||||
60
song_test.go
60
song_test.go
@ -22,6 +22,66 @@ func TestSong(t *testing.T) {
|
|||||||
LyricURL: "https://web.hycdn.cn/siren/lyric/20240709/4a10c70629b68a187fdbef4a27bd32d8.lrc",
|
LyricURL: "https://web.hycdn.cn/siren/lyric/20240709/4a10c70629b68a187fdbef4a27bd32d8.lrc",
|
||||||
Artists: []string{"塞壬唱片-MSR"},
|
Artists: []string{"塞壬唱片-MSR"},
|
||||||
}}, songJSON)
|
}}, songJSON)
|
||||||
|
|
||||||
|
t.Run("copy", func(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
a *Song
|
||||||
|
variant int
|
||||||
|
want *Song
|
||||||
|
}{
|
||||||
|
{"nil", nil, SongVariantBase, nil},
|
||||||
|
{"current", new(Song), SongVariantCurrent, new(Song)},
|
||||||
|
{"full guard", new(Song), SongVariantFull, nil},
|
||||||
|
|
||||||
|
{"current full", &Song{
|
||||||
|
SourceURL: "\x00",
|
||||||
|
}, SongVariantCurrent, &Song{
|
||||||
|
SourceURL: "\x00",
|
||||||
|
}},
|
||||||
|
|
||||||
|
{"oob", &Song{
|
||||||
|
SourceURL: "\x00",
|
||||||
|
}, 0xbad, nil},
|
||||||
|
|
||||||
|
{"full", &Song{
|
||||||
|
CID: 48794,
|
||||||
|
Name: "Warm and Small Light",
|
||||||
|
AlbumCID: 6660,
|
||||||
|
SourceURL: "https://res01.hycdn.cn/04ce5de54bb52eb85008644d541d40fa/68CA0442/siren/audio/20240709/a7f650238eaefc9c30a9627d7f78d819.wav",
|
||||||
|
LyricURL: "https://web.hycdn.cn/siren/lyric/20240709/4a10c70629b68a187fdbef4a27bd32d8.lrc",
|
||||||
|
Artists: []string{"塞壬唱片-MSR"},
|
||||||
|
}, SongVariantFull, &Song{
|
||||||
|
CID: 48794,
|
||||||
|
Name: "Warm and Small Light",
|
||||||
|
AlbumCID: 6660,
|
||||||
|
SourceURL: "https://res01.hycdn.cn/04ce5de54bb52eb85008644d541d40fa/68CA0442/siren/audio/20240709/a7f650238eaefc9c30a9627d7f78d819.wav",
|
||||||
|
LyricURL: "https://web.hycdn.cn/siren/lyric/20240709/4a10c70629b68a187fdbef4a27bd32d8.lrc",
|
||||||
|
Artists: []string{"塞壬唱片-MSR"},
|
||||||
|
}},
|
||||||
|
|
||||||
|
{"base", &Song{
|
||||||
|
CID: 48794,
|
||||||
|
Name: "Warm and Small Light",
|
||||||
|
AlbumCID: 6660,
|
||||||
|
SourceURL: "https://res01.hycdn.cn/04ce5de54bb52eb85008644d541d40fa/68CA0442/siren/audio/20240709/a7f650238eaefc9c30a9627d7f78d819.wav",
|
||||||
|
LyricURL: "https://web.hycdn.cn/siren/lyric/20240709/4a10c70629b68a187fdbef4a27bd32d8.lrc",
|
||||||
|
Artists: []string{"塞壬唱片-MSR"},
|
||||||
|
}, SongVariantBase, &Song{
|
||||||
|
CID: 48794,
|
||||||
|
Name: "Warm and Small Light",
|
||||||
|
AlbumCID: 6660,
|
||||||
|
Artists: []string{"塞壬唱片-MSR"},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
if got := tc.a.Copy(tc.variant); !reflect.DeepEqual(got, tc.want) {
|
||||||
|
t.Errorf("Copy: %#v, want %#v", got, tc.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSongEnrich(t *testing.T) {
|
func TestSongEnrich(t *testing.T) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user