%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
|
%% ex: ts=4 sw=4 et
|
|
-module(rebar_resource).
|
|
|
|
-export([new/3,
|
|
find_resource_module/2,
|
|
find_resource_state/2]).
|
|
|
|
-export_type([resource/0
|
|
,source/0
|
|
,type/0
|
|
,location/0
|
|
,ref/0]).
|
|
|
|
-record(resource, {type :: atom(),
|
|
module :: module(),
|
|
state :: term()}).
|
|
|
|
-type resource() :: #resource{}.
|
|
-type source() :: {type(), location(), ref()}.
|
|
-type type() :: atom().
|
|
-type location() :: string().
|
|
-type ref() :: any().
|
|
|
|
-callback init(rebar_state:t()) -> {ok, term()}.
|
|
-callback lock(file:filename_all(), tuple()) ->
|
|
source().
|
|
-callback download(file:filename_all(), tuple(), rebar_state:t()) ->
|
|
{tarball, file:filename_all()} | {ok, any()} | {error, any()}.
|
|
-callback needs_update(file:filename_all(), tuple()) ->
|
|
boolean().
|
|
-callback make_vsn(file:filename_all()) ->
|
|
{plain, string()} | {error, string()}.
|
|
|
|
-optional_callbacks([init/1]).
|
|
|
|
-spec new(type(), module(), term()) -> resource().
|
|
new(Type, Module, State) ->
|
|
#resource{type=Type,
|
|
module=Module,
|
|
state=State}.
|
|
|
|
find_resource_module(Type, Resources) ->
|
|
case lists:keyfind(Type, #resource.type, Resources) of
|
|
false when is_atom(Type) ->
|
|
case code:which(Type) of
|
|
non_existing ->
|
|
{error, not_found};
|
|
_ ->
|
|
{ok, Type}
|
|
end;
|
|
false ->
|
|
{error, not_found};
|
|
#resource{module=Module} ->
|
|
{ok, Module}
|
|
end.
|
|
|
|
find_resource_state(Type, Resources) ->
|
|
case lists:keyfind(Type, #resource.type, Resources) of
|
|
false ->
|
|
{error, not_found};
|
|
#resource{state=State} ->
|
|
State
|
|
end.
|