Update naming in commandline parser
[cli-helper.git] / src / main / java / eu / svjatoslav / commons / cli_helper / parameter_parser / Parser.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.cli_helper.parameter_parser;
6
7 import java.util.ArrayList;
8
9 /**
10  * Single commandline parameter can have any amount of arguments.
11  */
12 public class Parser {
13
14     private final ArrayList<Option<?, ? extends Option>> options = new ArrayList<>();
15
16     public <E extends Option> E add(final E parameter) {
17         options.add(parameter);
18         return parameter;
19     }
20
21     /**
22      * @return <code>true</code> if no errors were found. <code>false</code>
23      * otherwise.
24      */
25     private boolean checkMandatoryArgumentsPresent() {
26
27         for (final Option option : options)
28             if (option.isMandatory() && (!option.isPresent())) {
29                 System.out.println("Error! Mandatory parameter ("
30                         + option.getAliasesAsString() + ") is not specified.");
31                 return false;
32             }
33
34         return true;
35     }
36
37     /**
38      * Return parameter by given alias or <code>null</code> if no parameter
39      * exists for given alias.
40      *
41      * @param alias parameter alias
42      * @return found parameter or <code>null</code> if parameter was not found.
43      */
44     public Option findParameterByAlias(final String alias) {
45
46         for (final Option option : options)
47             if (option.matchesAlias(alias))
48                 return option;
49
50         return null;
51     }
52
53     /**
54      * @param args commandline arguments
55      * @return <code>true</code> if no errors were found. <code>false</code>
56      * otherwise.
57      */
58     public boolean parse(final String[] args) {
59
60         Option currentOption = null;
61
62         for (final String argument : args) {
63
64             final Option optionForAlias = findParameterByAlias(argument);
65             if (optionForAlias == null) {
66                 if (currentOption == null) {
67                     System.out.println("Unknown commandline parameter: "
68                             + argument);
69                     return false;
70                 }
71
72                 if (!currentOption.addParameter(argument))
73                     return false;
74
75             } else {
76                 if (currentOption != null)
77                     if (!currentOption.noMoreArguments())
78                         return false;
79
80                 optionForAlias.setPresent(true);
81                 currentOption = optionForAlias;
82             }
83
84         }
85
86         return checkMandatoryArgumentsPresent();
87     }
88
89     public void showHelp() {
90         System.out.println("Available commandline arguments:");
91         for (final Option option : options)
92             System.out.println(option.getHelp());
93     }
94
95 }