1
2
3
4
5
6
7 package com.varmateo.yawg.cli;
8
9 import java.util.function.Consumer;
10 import java.util.function.Function;
11 import java.util.function.Supplier;
12
13 import io.vavr.control.Try;
14
15
16
17
18
19
20 abstract class BakerCliAction {
21
22
23
24
25
26 public static Try<BakerCliAction> parse(final String[] args) {
27
28 if ( args.length == 0 ) {
29 return Try.success(printHelp());
30 } else {
31 return BakerCliParameters.parse(args)
32 .flatMap(BakerCliAction::parseParameters);
33 }
34 }
35
36
37 private static Try<BakerCliAction> parseParameters(final CliParameterSet cliParams) {
38
39 if ( cliParams.hasOption(BakerCliParameters.HELP) ) {
40 return Try.success(printHelp());
41 } else if ( cliParams.hasOption(BakerCliParameters.VERSION) ) {
42 return Try.success(printVersion());
43 } else {
44 return BakerCliBakeOptionsParser.parse(cliParams)
45 .map(BakerCliAction::bake);
46 }
47 }
48
49
50
51
52
53 public abstract <T> T match(
54 Supplier<T> a,
55 Supplier<T> b,
56 Function<Bake, T> c);
57
58
59
60
61
62 public abstract void onMatch(
63 Runnable a,
64 Runnable b,
65 Consumer<Bake> c);
66
67
68
69
70
71 public static BakerCliAction printHelp() {
72
73 return new PrintHelp();
74 }
75
76
77
78
79
80 public static BakerCliAction printVersion() {
81
82 return new PrintVersion();
83 }
84
85
86
87
88
89 public static BakerCliAction bake(final BakerCliBakeOptions options) {
90
91 return new Bake(options);
92 }
93
94
95
96
97
98 public static final class PrintHelp
99 extends BakerCliAction {
100
101
102 private PrintHelp() {
103
104 }
105
106
107
108
109
110 @Override
111 public <T> T match(
112 final Supplier<T> a,
113 final Supplier<T> b,
114 final Function<Bake, T> c) {
115
116 return a.get();
117 }
118
119
120
121
122
123 @Override
124 public void onMatch(
125 final Runnable a,
126 final Runnable b,
127 final Consumer<Bake> c) {
128
129 a.run();
130 }
131 }
132
133
134
135
136
137 public static final class PrintVersion
138 extends BakerCliAction {
139
140
141 private PrintVersion() {
142
143 }
144
145
146
147
148
149 @Override
150 public <T> T match(
151 final Supplier<T> a,
152 final Supplier<T> b,
153 final Function<Bake, T> c) {
154
155 return b.get();
156 }
157
158
159
160
161
162 @Override
163 public void onMatch(
164 final Runnable a,
165 final Runnable b,
166 final Consumer<Bake> c) {
167
168 b.run();
169 }
170 }
171
172
173
174
175
176 public static final class Bake
177 extends BakerCliAction {
178
179
180 private final BakerCliBakeOptions _options;
181
182
183 private Bake(final BakerCliBakeOptions options) {
184
185 _options = options;
186 }
187
188
189
190
191
192 public BakerCliBakeOptions options() {
193
194 return _options;
195 }
196
197
198
199
200
201 @Override
202 public <T> T match(
203 final Supplier<T> a,
204 final Supplier<T> b,
205 final Function<Bake, T> c) {
206
207 return c.apply(this);
208 }
209
210
211
212
213
214 @Override
215 public void onMatch(
216 final Runnable a,
217 final Runnable b,
218 final Consumer<Bake> c) {
219
220 c.accept(this);
221 }
222 }
223
224 }