- %% -*- 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.
|