src/rocksky@decoders.erl
-module(rocksky@decoders).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/rocksky/decoders.gleam").
-export([profile/0, artist/0, album/0, song/0, scrobble/0, listener/0, stats/0, api_key/0, shout/0, list_in_field/2, unwrap/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Reusable `gleam/dynamic/decode` decoders for the public types in\n"
" `rocksky/types`. These are exposed so callers can also decode raw\n"
" `Dynamic` payloads themselves (e.g. embedded in custom responses).\n"
).
-file("src/rocksky/decoders.gleam", 33).
-spec opt_string(binary()) -> gleam@dynamic@decode:decoder(gleam@option:option(binary())).
opt_string(Name) ->
gleam@dynamic@decode:optional_field(
Name,
none,
gleam@dynamic@decode:map(
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Field@0) -> {some, Field@0} end
),
fun gleam@dynamic@decode:success/1
).
-file("src/rocksky/decoders.gleam", 42).
-spec opt_int(binary()) -> gleam@dynamic@decode:decoder(gleam@option:option(integer())).
opt_int(Name) ->
gleam@dynamic@decode:optional_field(
Name,
none,
gleam@dynamic@decode:map(
{decoder, fun gleam@dynamic@decode:decode_int/1},
fun(Field@0) -> {some, Field@0} end
),
fun gleam@dynamic@decode:success/1
).
-file("src/rocksky/decoders.gleam", 51).
-spec opt_bool(binary()) -> gleam@dynamic@decode:decoder(gleam@option:option(boolean())).
opt_bool(Name) ->
gleam@dynamic@decode:optional_field(
Name,
none,
gleam@dynamic@decode:map(
{decoder, fun gleam@dynamic@decode:decode_bool/1},
fun(Field@0) -> {some, Field@0} end
),
fun gleam@dynamic@decode:success/1
).
-file("src/rocksky/decoders.gleam", 60).
-spec string_list(binary()) -> gleam@dynamic@decode:decoder(list(binary())).
string_list(Name) ->
gleam@dynamic@decode:optional_field(
Name,
[],
gleam@dynamic@decode:list(
{decoder, fun gleam@dynamic@decode:decode_string/1}
),
fun gleam@dynamic@decode:success/1
).
-file("src/rocksky/decoders.gleam", 66).
-spec profile() -> gleam@dynamic@decode:decoder(rocksky@generated@types:actor_profile_view_basic()).
profile() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"did"/utf8>>),
fun(Did) ->
gleam@dynamic@decode:then(
opt_string(<<"handle"/utf8>>),
fun(Handle) ->
gleam@dynamic@decode:then(
opt_string(<<"displayName"/utf8>>),
fun(Display_name) ->
gleam@dynamic@decode:then(
opt_string(<<"avatar"/utf8>>),
fun(Avatar) ->
gleam@dynamic@decode:then(
opt_string(<<"createdAt"/utf8>>),
fun(Created_at) ->
gleam@dynamic@decode:then(
opt_string(
<<"updatedAt"/utf8>>
),
fun(Updated_at) ->
gleam@dynamic@decode:success(
{actor_profile_view_basic,
Id,
Did,
Handle,
Display_name,
Avatar,
Created_at,
Updated_at}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 85).
-spec artist() -> gleam@dynamic@decode:decoder(rocksky@generated@types:artist_view_basic()).
artist() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"uri"/utf8>>),
fun(Uri) ->
gleam@dynamic@decode:then(
opt_string(<<"name"/utf8>>),
fun(Name) ->
gleam@dynamic@decode:then(
opt_string(<<"picture"/utf8>>),
fun(Picture) ->
gleam@dynamic@decode:then(
opt_string(<<"sha256"/utf8>>),
fun(Sha256) ->
gleam@dynamic@decode:then(
opt_int(<<"playCount"/utf8>>),
fun(Play_count) ->
gleam@dynamic@decode:then(
opt_int(
<<"uniqueListeners"/utf8>>
),
fun(Unique_listeners) ->
gleam@dynamic@decode:then(
string_list(
<<"tags"/utf8>>
),
fun(Tags) ->
gleam@dynamic@decode:success(
{artist_view_basic,
Id,
Uri,
Name,
Picture,
Sha256,
Play_count,
Unique_listeners,
Tags}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 106).
-spec album() -> gleam@dynamic@decode:decoder(rocksky@generated@types:album_view_basic()).
album() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"uri"/utf8>>),
fun(Uri) ->
gleam@dynamic@decode:then(
opt_string(<<"title"/utf8>>),
fun(Title) ->
gleam@dynamic@decode:then(
opt_string(<<"artist"/utf8>>),
fun(Art_name) ->
gleam@dynamic@decode:then(
opt_string(<<"artistUri"/utf8>>),
fun(Artist_uri) ->
gleam@dynamic@decode:then(
opt_int(<<"year"/utf8>>),
fun(Year) ->
gleam@dynamic@decode:then(
opt_string(
<<"albumArt"/utf8>>
),
fun(Album_art) ->
gleam@dynamic@decode:then(
opt_string(
<<"releaseDate"/utf8>>
),
fun(
Release_date
) ->
gleam@dynamic@decode:then(
opt_string(
<<"sha256"/utf8>>
),
fun(
Sha256
) ->
gleam@dynamic@decode:then(
opt_int(
<<"playCount"/utf8>>
),
fun(
Play_count
) ->
gleam@dynamic@decode:then(
opt_int(
<<"uniqueListeners"/utf8>>
),
fun(
Unique_listeners
) ->
gleam@dynamic@decode:success(
{album_view_basic,
Id,
Uri,
Title,
Art_name,
Artist_uri,
Year,
Album_art,
Release_date,
Sha256,
Play_count,
Unique_listeners}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 133).
-spec song() -> gleam@dynamic@decode:decoder(rocksky@generated@types:song_view_basic()).
song() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"uri"/utf8>>),
fun(Uri) ->
gleam@dynamic@decode:then(
opt_string(<<"title"/utf8>>),
fun(Title) ->
gleam@dynamic@decode:then(
opt_string(<<"artist"/utf8>>),
fun(Art_name) ->
gleam@dynamic@decode:then(
opt_string(<<"albumArtist"/utf8>>),
fun(Album_artist) ->
gleam@dynamic@decode:then(
opt_string(<<"album"/utf8>>),
fun(Album) ->
gleam@dynamic@decode:then(
opt_string(
<<"albumArt"/utf8>>
),
fun(Album_art) ->
gleam@dynamic@decode:then(
opt_string(
<<"albumUri"/utf8>>
),
fun(Album_uri) ->
gleam@dynamic@decode:then(
opt_string(
<<"artistUri"/utf8>>
),
fun(
Artist_uri
) ->
gleam@dynamic@decode:then(
opt_int(
<<"duration"/utf8>>
),
fun(
Duration
) ->
gleam@dynamic@decode:then(
opt_int(
<<"trackNumber"/utf8>>
),
fun(
Track_number
) ->
gleam@dynamic@decode:then(
opt_int(
<<"discNumber"/utf8>>
),
fun(
Disc_number
) ->
gleam@dynamic@decode:then(
opt_int(
<<"playCount"/utf8>>
),
fun(
Play_count
) ->
gleam@dynamic@decode:then(
opt_int(
<<"uniqueListeners"/utf8>>
),
fun(
Unique_listeners
) ->
gleam@dynamic@decode:then(
opt_string(
<<"sha256"/utf8>>
),
fun(
Sha256
) ->
gleam@dynamic@decode:then(
opt_string(
<<"mbid"/utf8>>
),
fun(
Mbid
) ->
gleam@dynamic@decode:then(
opt_string(
<<"isrc"/utf8>>
),
fun(
Isrc
) ->
gleam@dynamic@decode:then(
string_list(
<<"tags"/utf8>>
),
fun(
Tags
) ->
gleam@dynamic@decode:then(
opt_string(
<<"createdAt"/utf8>>
),
fun(
Created_at
) ->
gleam@dynamic@decode:success(
{song_view_basic,
Id,
Title,
Art_name,
Album_artist,
Album_art,
Uri,
Album,
Duration,
Track_number,
Disc_number,
Play_count,
Unique_listeners,
Album_uri,
Artist_uri,
Sha256,
Mbid,
Isrc,
Tags,
Created_at}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 176).
-spec scrobble() -> gleam@dynamic@decode:decoder(rocksky@generated@types:scrobble_view_basic()).
scrobble() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"uri"/utf8>>),
fun(Uri) ->
gleam@dynamic@decode:then(
opt_string(<<"user"/utf8>>),
fun(User) ->
gleam@dynamic@decode:then(
opt_string(<<"userDisplayName"/utf8>>),
fun(User_display_name) ->
gleam@dynamic@decode:then(
opt_string(<<"userAvatar"/utf8>>),
fun(User_avatar) ->
gleam@dynamic@decode:then(
opt_string(<<"title"/utf8>>),
fun(Title) ->
gleam@dynamic@decode:then(
opt_string(
<<"artist"/utf8>>
),
fun(Art_name) ->
gleam@dynamic@decode:then(
opt_string(
<<"artistUri"/utf8>>
),
fun(Artist_uri) ->
gleam@dynamic@decode:then(
opt_string(
<<"album"/utf8>>
),
fun(
Album
) ->
gleam@dynamic@decode:then(
opt_string(
<<"albumUri"/utf8>>
),
fun(
Album_uri
) ->
gleam@dynamic@decode:then(
opt_string(
<<"cover"/utf8>>
),
fun(
Cover
) ->
gleam@dynamic@decode:then(
opt_string(
<<"date"/utf8>>
),
fun(
Date
) ->
gleam@dynamic@decode:then(
opt_string(
<<"sha256"/utf8>>
),
fun(
Sha256
) ->
gleam@dynamic@decode:then(
opt_bool(
<<"liked"/utf8>>
),
fun(
Liked
) ->
gleam@dynamic@decode:then(
opt_int(
<<"likesCount"/utf8>>
),
fun(
Likes_count
) ->
gleam@dynamic@decode:success(
{scrobble_view_basic,
Id,
User,
User_display_name,
User_avatar,
Title,
Art_name,
Artist_uri,
Album,
Album_uri,
Cover,
Date,
Uri,
Sha256,
Liked,
Likes_count}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 211).
-spec listener() -> gleam@dynamic@decode:decoder(rocksky@generated@types:song_recent_listener_view()).
listener() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"did"/utf8>>),
fun(Did) ->
gleam@dynamic@decode:then(
opt_string(<<"handle"/utf8>>),
fun(Handle) ->
gleam@dynamic@decode:then(
opt_string(<<"displayName"/utf8>>),
fun(Display_name) ->
gleam@dynamic@decode:then(
opt_string(<<"avatar"/utf8>>),
fun(Avatar) ->
gleam@dynamic@decode:then(
opt_string(<<"timestamp"/utf8>>),
fun(Timestamp) ->
gleam@dynamic@decode:then(
opt_string(
<<"scrobbleUri"/utf8>>
),
fun(Scrobble_uri) ->
gleam@dynamic@decode:success(
{song_recent_listener_view,
Id,
Did,
Handle,
Display_name,
Avatar,
Timestamp,
Scrobble_uri}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 230).
-spec stats() -> gleam@dynamic@decode:decoder(rocksky@generated@types:stats_view()).
stats() ->
gleam@dynamic@decode:then(
opt_int(<<"scrobbles"/utf8>>),
fun(Scrobbles) ->
gleam@dynamic@decode:then(
opt_int(<<"artists"/utf8>>),
fun(Artists) ->
gleam@dynamic@decode:then(
opt_int(<<"lovedTracks"/utf8>>),
fun(Loved_tracks) ->
gleam@dynamic@decode:then(
opt_int(<<"albums"/utf8>>),
fun(Albums) ->
gleam@dynamic@decode:then(
opt_int(<<"tracks"/utf8>>),
fun(Tracks) ->
gleam@dynamic@decode:success(
{stats_view,
Scrobbles,
Artists,
Loved_tracks,
Albums,
Tracks}
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 245).
-spec api_key() -> gleam@dynamic@decode:decoder(rocksky@types:api_key()).
api_key() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"name"/utf8>>),
fun(Name) ->
gleam@dynamic@decode:then(
opt_string(<<"description"/utf8>>),
fun(Description) ->
gleam@dynamic@decode:then(
opt_string(<<"key"/utf8>>),
fun(Key) ->
gleam@dynamic@decode:then(
opt_string(<<"createdAt"/utf8>>),
fun(Created_at) ->
gleam@dynamic@decode:success(
{api_key,
Id,
Name,
Description,
Key,
Created_at}
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 260).
-spec shout() -> gleam@dynamic@decode:decoder(rocksky@types:shout()).
shout() ->
gleam@dynamic@decode:then(
opt_string(<<"id"/utf8>>),
fun(Id) ->
gleam@dynamic@decode:then(
opt_string(<<"uri"/utf8>>),
fun(Uri) ->
gleam@dynamic@decode:then(
opt_string(<<"authorDid"/utf8>>),
fun(Author_did) ->
gleam@dynamic@decode:then(
opt_string(<<"authorHandle"/utf8>>),
fun(Author_handle) ->
gleam@dynamic@decode:then(
opt_string(<<"authorAvatar"/utf8>>),
fun(Author_avatar) ->
gleam@dynamic@decode:then(
opt_string(<<"message"/utf8>>),
fun(Message) ->
gleam@dynamic@decode:then(
opt_string(
<<"createdAt"/utf8>>
),
fun(Created_at) ->
gleam@dynamic@decode:then(
opt_int(
<<"likesCount"/utf8>>
),
fun(Likes_count) ->
gleam@dynamic@decode:then(
opt_int(
<<"repliesCount"/utf8>>
),
fun(
Replies_count
) ->
gleam@dynamic@decode:then(
opt_bool(
<<"liked"/utf8>>
),
fun(
Liked
) ->
gleam@dynamic@decode:success(
{shout,
Id,
Uri,
Author_did,
Author_handle,
Author_avatar,
Message,
Created_at,
Likes_count,
Replies_count,
Liked}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/rocksky/decoders.gleam", 286).
?DOC(" Convenience: decode an object whose `key` field is a list of `inner`.\n").
-spec list_in_field(binary(), gleam@dynamic@decode:decoder(GQU)) -> gleam@dynamic@decode:decoder(list(GQU)).
list_in_field(Key, Inner) ->
gleam@dynamic@decode:optional_field(
Key,
[],
gleam@dynamic@decode:list(Inner),
fun gleam@dynamic@decode:success/1
).
-file("src/rocksky/decoders.gleam", 297).
?DOC(
" Decode `{ items: [...] }`-shaped responses into a list of items.\n"
" Many Rocksky list endpoints wrap their array in a single object field\n"
" (e.g. `{ \"scrobbles\": [...] }`, `{ \"songs\": [...] }`). This helper hides\n"
" that detail from callers that just want the list.\n"
).
-spec unwrap(binary(), gleam@dynamic@decode:decoder(GQY)) -> gleam@dynamic@decode:decoder(list(GQY)).
unwrap(Field_name, Inner) ->
gleam@dynamic@decode:optional_field(
Field_name,
[],
gleam@dynamic@decode:list(Inner),
fun gleam@dynamic@decode:success/1
).