-
Notifications
You must be signed in to change notification settings - Fork 22
/
agner_spec.erl
46 lines (38 loc) · 1.5 KB
/
agner_spec.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-module(agner_spec).
-include_lib("agner.hrl").
-export([parse/1, list_to_version/2, version_to_list/1]).
-type agner_spec_source() :: string().
-spec parse(agner_spec_source()) -> agner_spec().
parse(S) ->
{ok, Tokens, _ } = erl_scan:string(S),
lists:reverse(
lists:map(fun (Term) ->
{ok, T} = erl_parse:parse_term(lists:reverse(Term)),
T
end,
tl(lists:foldl(fun ({dot, _}=Dot,[Term|Terms]) ->
[[]|[[Dot|Term]|Terms]];
(Token, [Term|Terms]) ->
[[Token|Term]|Terms];
(Token, []) ->
[[Token]]
end, [], Tokens)))).
-spec list_to_version(agner_spec_name(), string()) -> agner_spec_version().
list_to_version(Name, "atleast:" ++ Version) ->
case lists:reverse(lists:dropwhile(fun(V) ->
V < {tag, Version}
end, lists:usort(agner:versions(Name)))) of
[] ->
no_such_version;
[_|_] = L ->
hd(L)
end;
list_to_version(_, "@" ++ Version) ->
{branch, Version};
list_to_version(_, Version) ->
{tag, Version}.
-spec version_to_list(agner_spec_version()) -> string().
version_to_list({branch, Version}) ->
"@" ++ Version;
version_to_list({tag, Version}) ->
Version.