Initial commit
[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<Parameter<?, ? extends Parameter>> parameters = new ArrayList<>();
15
16     public <E extends Parameter> E add(final E parameter) {
17         parameters.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 Parameter parameter : parameters)
28             if (parameter.isMandatory() && (!parameter.isSpecified())) {
29                 System.out.println("Error! Mandatory parameter ("
30                         + parameter.getAliases() + ") 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 Parameter findParameterByAlias(final String alias) {
45
46         for (final Parameter parameter : parameters)
47             if (parameter.matchesAlias(alias))
48                 return parameter;
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         Parameter currentParameter = null;
61
62         for (final String argument : args) {
63
64             final Parameter parameterForAlias = findParameterByAlias(argument);
65             if (parameterForAlias == null) {
66                 if (currentParameter == null) {
67                     System.out.println("Unknown commandline parameter: "
68                             + argument);
69                     return false;
70                 }
71
72                 if (!currentParameter.addArgument(argument))
73                     return false;
74
75             } else {
76                 if (currentParameter != null)
77                     if (!currentParameter.noMoreArguments())
78                         return false;
79
80                 parameterForAlias.setSpecified(true);
81                 currentParameter = parameterForAlias;
82             }
83
84         }
85
86         return checkMandatoryArgumentsPresent();
87     }
88
89     public void showHelp() {
90         System.out.println("Available commandline arguments:");
91         for (final Parameter parameter : parameters)
92             System.out.println(parameter.getHelp());
93     }
94
95 }