您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

64 行
1.8 KiB

  1. %% -*- erlang-indent-level: 4;indent-tabs-mode: nil -*-
  2. %% ex: ts=4 sw=4 et
  3. -module(rebar_resource).
  4. -export([new/3,
  5. find_resource_module/2,
  6. find_resource_state/2]).
  7. -export_type([resource/0
  8. ,source/0
  9. ,type/0
  10. ,location/0
  11. ,ref/0]).
  12. -record(resource, {type :: atom(),
  13. module :: module(),
  14. state :: term()}).
  15. -type resource() :: #resource{}.
  16. -type source() :: {type(), location(), ref()}.
  17. -type type() :: atom().
  18. -type location() :: string().
  19. -type ref() :: any().
  20. -callback init(rebar_state:t()) -> {ok, term()}.
  21. -callback lock(file:filename_all(), tuple()) ->
  22. source().
  23. -callback download(file:filename_all(), tuple(), rebar_state:t()) ->
  24. {tarball, file:filename_all()} | {ok, any()} | {error, any()}.
  25. -callback needs_update(file:filename_all(), tuple()) ->
  26. boolean().
  27. -callback make_vsn(file:filename_all()) ->
  28. {plain, string()} | {error, string()}.
  29. -optional_callbacks([init/1]).
  30. -spec new(type(), module(), term()) -> resource().
  31. new(Type, Module, State) ->
  32. #resource{type=Type,
  33. module=Module,
  34. state=State}.
  35. find_resource_module(Type, Resources) ->
  36. case lists:keyfind(Type, #resource.type, Resources) of
  37. false when is_atom(Type) ->
  38. case code:which(Type) of
  39. non_existing ->
  40. {error, not_found};
  41. _ ->
  42. {ok, Type}
  43. end;
  44. false ->
  45. {error, not_found};
  46. #resource{module=Module} ->
  47. {ok, Module}
  48. end.
  49. find_resource_state(Type, Resources) ->
  50. case lists:keyfind(Type, #resource.type, Resources) of
  51. false ->
  52. {error, not_found};
  53. #resource{state=State} ->
  54. State
  55. end.