19
19
% % -------------------------------------------------------------------
20
20
-module (clique_usage ).
21
21
22
+ -ifdef (TEST ).
23
+ -compile (export_all ).
24
+ -include_lib (" eunit/include/eunit.hrl" ).
25
+ -endif .
26
+
22
27
-define (usage_table , clique_usage ).
28
+ -define (usage_prefix , " Usage: " ).
23
29
24
30
-type err () :: {error , term ()}.
31
+ -type usage_function () :: fun (() -> iolist ()).
25
32
26
33
% % API
27
34
-export ([init /0 ,
@@ -35,9 +42,8 @@ init() ->
35
42
36
43
% % @doc Register usage for a given command sequence. Lookups are by longest
37
44
% % match.
38
- -spec register ([string ()], iolist ()) -> true .
39
- register (Cmd , Usage0 ) ->
40
- Usage = [" Usage: " , Usage0 ],
45
+ -spec register ([string ()], iolist () | usage_function ()) -> true .
46
+ register (Cmd , Usage ) ->
41
47
ets :insert (? usage_table , {Cmd , Usage }).
42
48
43
49
-spec print (iolist ()) -> ok .
@@ -55,10 +61,27 @@ find([]) ->
55
61
{error , " Error: Usage information not found for the given command\n\n " };
56
62
find (Cmd ) ->
57
63
case ets :lookup (? usage_table , Cmd ) of
64
+ [{Cmd , Fun }] when is_function (Fun ) ->
65
+ [? usage_prefix , Fun ()];
58
66
[{Cmd , Usage }] ->
59
- Usage ;
67
+ [ ? usage_prefix , Usage ] ;
60
68
[] ->
61
69
Cmd2 = lists :reverse (tl (lists :reverse (Cmd ))),
62
70
find (Cmd2 )
63
71
end .
64
72
73
+ -ifdef (TEST ).
74
+ find_different_types_test () ->
75
+ {setup ,
76
+ fun init /0 ,
77
+ fun (_ ) -> ets :delete (? usage_table ) end ,
78
+ ? _test (begin
79
+ String = " clique foo [-f]\n " ,
80
+ Fun = fun () -> String end ,
81
+ ? MODULE :register ([" fun" , " usage" ], Fun ),
82
+ ? MODULE :register ([" string" , " usage" ], String ),
83
+ ? assertEqual ([? usage_prefix , String ], find ([" fun" , " usage" ])),
84
+ ? assertEqual ([? usage_prefix , String ], find ([" string" , " usage" ])),
85
+ ? assertMatch ({error , _ }, find ([" foo" ]))
86
+ end )}.
87
+ -endif .
0 commit comments