Packages

Erlang wrapper for Rust's cargo build tool

Current section

Files

Jump to
cargo src cargo_artifact.erl
Raw

src/cargo_artifact.erl

-module(cargo_artifact).
-export([
from_json/1,
name/1,
version/1,
version/2,
package_id/1,
fresh/1,
kind/1,
filenames/1,
executable/1
]).
-record(artifact, {
name :: binary(),
% crate :: binary(), from package_id?
version :: binary() | undefined,
package_id :: binary(),
fresh :: boolean(),
kind :: kind(),
filenames :: [binary()],
executable :: binary() | undefined
}).
-type kind() :: bin | cdylib | other.
-opaque t() :: #artifact{}.
-export_type([t/0]).
-spec from_json(jsx:json_term()) -> {ok, t()} | error.
from_json(Entry) ->
case maps:get(<<"reason">>, Entry, undefined) of
<<"compiler-artifact">> ->
#{
<<"package_id">> := PackageId,
<<"target">> := Target
} = Entry,
Kind = kind_to_atom(maps:get(<<"kind">>, Target)),
Executable = case maps:get(<<"executable">>, Entry, undefined) of
null -> undefined;
V -> V
end,
{ok, #artifact{
name = maps:get(<<"name">>, Target),
filenames = maps:get(<<"filenames">>, Entry),
kind = Kind,
package_id = PackageId,
fresh = maps:get(<<"fresh">>, Entry, false),
executable = Executable
}};
_ ->
error
end.
-spec name(t()) -> binary().
name(#artifact{name=C}) -> C.
-spec version(t()) -> binary() | undefined.
version(#artifact{version=V}) -> V.
-spec version(t(), binary()) -> t().
version(#artifact{} = A, V) -> A#artifact{version=V}.
-spec package_id(t()) -> binary().
package_id(#artifact{package_id=P}) -> P.
-spec fresh(t()) -> boolean().
fresh(#artifact{fresh=F}) -> F.
-spec kind(t()) -> kind().
kind(#artifact{kind=K}) -> K.
-spec filenames(t()) -> [binary()].
filenames(#artifact{filenames=F}) -> F.
-spec executable(t()) -> binary() | undefined.
executable(#artifact{executable=E}) -> E.
kind_to_atom([<<"bin">>]) -> bin;
kind_to_atom([<<"cdylib">>]) -> cdylib;
kind_to_atom(_) -> other.