%% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*- %% ex: ts=4 sw=4 et -module(rebar_resource). -export([new/3, lock/2, download/4, needs_update/2, make_vsn/2]). -export_type([source/0, type/0, location/0, ref/0]). -include("rebar.hrl"). -type source() :: {type(), location(), ref()} | {type(), location(), ref(), binary()}. -type type() :: atom(). -type location() :: string(). -type ref() :: any(). -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()}. -spec new(type(), module(), term()) -> rebar_resource_v2:resource(). new(Type, Module, State) -> #resource{type=Type, module=Module, state=State, implementation=?MODULE}. lock(Module, AppInfo) -> Module:lock(rebar_app_info:dir(AppInfo), rebar_app_info:source(AppInfo)). download(Module, TmpDir, AppInfo, State) -> case Module:download(TmpDir, rebar_app_info:source(AppInfo), State) of {ok, _} -> ok; Error -> Error end. needs_update(Module, AppInfo) -> Module:needs_update(rebar_app_info:dir(AppInfo), rebar_app_info:source(AppInfo)). make_vsn(Module, AppInfo) -> Module:make_vsn(rebar_app_info:dir(AppInfo)).