Packages

Gleam dynamic decoders for the API of Hex, the package manager for the BEAM ecosystem.

Current section

Files

Jump to
gleam_hexpm src gleam@hexpm.erl
Raw

src/gleam@hexpm.erl

-module(gleam@hexpm).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([decode_retirement_reason/1, retirement_reason_to_string/1, decode_package/1, decode_release/1]).
-export_type([package/0, package_meta/0, package_release/0, package_owner/0, release/0, release_meta/0, release_retirement/0, retirement_reason/0]).
-type package() :: {package,
binary(),
gleam@option:option(binary()),
gleam@option:option(binary()),
package_meta(),
gleam@map:map_(binary(), integer()),
gleam@option:option(list(package_owner())),
list(package_release()),
birl@time:date_time(),
birl@time:date_time()}.
-type package_meta() :: {package_meta,
gleam@map:map_(binary(), binary()),
list(binary()),
gleam@option:option(binary())}.
-type package_release() :: {package_release,
binary(),
binary(),
birl@time:date_time()}.
-type package_owner() :: {package_owner,
binary(),
gleam@option:option(binary()),
binary()}.
-type release() :: {release,
binary(),
binary(),
binary(),
integer(),
gleam@option:option(package_owner()),
release_meta(),
gleam@option:option(release_retirement()),
birl@time:date_time(),
birl@time:date_time()}.
-type release_meta() :: {release_meta,
gleam@option:option(binary()),
list(binary())}.
-type release_retirement() :: {release_retirement,
retirement_reason(),
gleam@option:option(binary())}.
-type retirement_reason() :: other_reason |
invalid |
security |
deprecated |
renamed.
-spec decode_retirement_reason(gleam@dynamic:dynamic_()) -> {ok,
retirement_reason()} |
{error, list(gleam@dynamic:decode_error())}.
decode_retirement_reason(Data) ->
case gleam@dynamic:string(Data) of
{error, E} ->
{error, E};
{ok, <<"invalid"/utf8>>} ->
{ok, invalid};
{ok, <<"security"/utf8>>} ->
{ok, security};
{ok, <<"deprecated"/utf8>>} ->
{ok, deprecated};
{ok, <<"renamed"/utf8>>} ->
{ok, renamed};
{ok, _} ->
{ok, other_reason}
end.
-spec retirement_reason_to_string(retirement_reason()) -> binary().
retirement_reason_to_string(Reason) ->
case Reason of
other_reason ->
<<"other"/utf8>>;
invalid ->
<<"invalid"/utf8>>;
security ->
<<"security"/utf8>>;
deprecated ->
<<"deprecated"/utf8>>;
renamed ->
<<"renamed"/utf8>>
end.
-spec decode_package_owner(gleam@dynamic:dynamic_()) -> {ok, package_owner()} |
{error, list(gleam@dynamic:decode_error())}.
decode_package_owner(Data) ->
(gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {package_owner, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(<<"username"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:any(
[gleam@dynamic:field(
<<"email"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
),
gleam@function:constant({ok, none})]
),
gleam@dynamic:field(<<"url"/utf8>>, fun gleam@dynamic:string/1)
))(Data).
-spec decode_iso_timestamp(gleam@dynamic:dynamic_()) -> {ok,
birl@time:date_time()} |
{error, list(gleam@dynamic:decode_error())}.
decode_iso_timestamp(Data) ->
gleam@result:then(
gleam@dynamic:string(Data),
fun(S) -> case birl@time:from_iso8601(S) of
{ok, T} ->
{ok, T};
{error, _} ->
{error,
[{decode_error,
<<"Timestamp"/utf8>>,
gleam@dynamic:classify(Data),
[]}]}
end end
).
-spec decode_package(gleam@dynamic:dynamic_()) -> {ok, package()} |
{error, list(gleam@dynamic:decode_error())}.
decode_package(Data) ->
(gleam@dynamic:decode9(
fun(Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8) -> {package, Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8} end,
gleam@dynamic:field(<<"name"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(
<<"html_url"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
),
gleam@dynamic:field(
<<"docs_html_url"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
),
gleam@dynamic:field(
<<"meta"/utf8>>,
gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {package_meta, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(
<<"links"/utf8>>,
gleam@dynamic:map(
fun gleam@dynamic:string/1,
fun gleam@dynamic:string/1
)
),
gleam@dynamic:field(
<<"licenses"/utf8>>,
gleam@dynamic:list(fun gleam@dynamic:string/1)
),
gleam@dynamic:field(
<<"description"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
)
)
),
gleam@dynamic:field(
<<"downloads"/utf8>>,
gleam@dynamic:map(
fun gleam@dynamic:string/1,
fun gleam@dynamic:int/1
)
),
gleam@dynamic:any(
[gleam@dynamic:field(
<<"owners"/utf8>>,
gleam@dynamic:optional(
gleam@dynamic:list(fun decode_package_owner/1)
)
),
fun(_) -> {ok, none} end]
),
gleam@dynamic:field(
<<"releases"/utf8>>,
gleam@dynamic:list(
gleam@dynamic:decode3(
fun(Field@0, Field@1, Field@2) -> {package_release, Field@0, Field@1, Field@2} end,
gleam@dynamic:field(
<<"version"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(
<<"url"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(
<<"inserted_at"/utf8>>,
fun decode_iso_timestamp/1
)
)
)
),
gleam@dynamic:field(<<"inserted_at"/utf8>>, fun decode_iso_timestamp/1),
gleam@dynamic:field(<<"updated_at"/utf8>>, fun decode_iso_timestamp/1)
))(Data).
-spec decode_release(gleam@dynamic:dynamic_()) -> {ok, release()} |
{error, list(gleam@dynamic:decode_error())}.
decode_release(Data) ->
(gleam@dynamic:decode9(
fun(Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8) -> {release, Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8} end,
gleam@dynamic:field(<<"version"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"url"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"checksum"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(
<<"downloads"/utf8>>,
gleam@dynamic:any(
[fun gleam@dynamic:int/1, gleam@function:constant({ok, 0})]
)
),
gleam@dynamic:field(
<<"publisher"/utf8>>,
gleam@dynamic:optional(fun decode_package_owner/1)
),
gleam@dynamic:field(
<<"meta"/utf8>>,
gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {release_meta, Field@0, Field@1} end,
gleam@dynamic:field(
<<"app"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
),
gleam@dynamic:field(
<<"build_tools"/utf8>>,
gleam@dynamic:list(fun gleam@dynamic:string/1)
)
)
),
gleam@dynamic:field(
<<"retirement"/utf8>>,
gleam@dynamic:optional(
gleam@dynamic:decode2(
fun(Field@0, Field@1) -> {release_retirement, Field@0, Field@1} end,
gleam@dynamic:field(
<<"reason"/utf8>>,
fun decode_retirement_reason/1
),
gleam@dynamic:field(
<<"message"/utf8>>,
gleam@dynamic:optional(fun gleam@dynamic:string/1)
)
)
)
),
gleam@dynamic:field(<<"inserted_at"/utf8>>, fun decode_iso_timestamp/1),
gleam@dynamic:field(<<"updated_at"/utf8>>, fun decode_iso_timestamp/1)
))(Data).