View Javadoc
1   /**************************************************************************
2    *
3    * Copyright (c) 2019 Yawg project contributors.
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   * ADT representing one of the possible actions to be performed by the
18   * CLI app.
19   */
20  /* default */ 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             // Nothing to do.
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             // Nothing to do.
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 }