26321743abced8ccadba213945cdbe21348528bd
[cli-helper.git] / src / main / java / eu / svjatoslav / commons / cli_helper / parameter_parser / parameter / DirectoryOptions.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.parameter;
6
7 import eu.svjatoslav.commons.cli_helper.parameter_parser.ParameterCount;
8 import eu.svjatoslav.commons.cli_helper.parameter_parser.Option;
9
10 import java.io.File;
11 import java.util.List;
12 import java.util.stream.Collectors;
13
14 public class DirectoryOptions extends Option<List<File>, DirectoryOptions> {
15
16     private ExistenceType existenceType = ExistenceType.DOES_NOT_MATTER;
17
18     public DirectoryOptions(final String description) {
19         super(description, ParameterCount.ONE_OR_MORE);
20     }
21
22     @Override
23     public String describeFormat() {
24         switch (existenceType) {
25             case MUST_EXIST:
26                 return "One to many existing directories.";
27             case MUST_NOT_EXIST:
28                 return "One to many non-existing directories.";
29             default:
30                 return "One to many directories.";
31         }
32     }
33
34     @Override
35     public List<File> getValue() {
36         return parameters.stream().map(File::new).collect(Collectors.toList());
37     }
38
39     public DirectoryOptions mustExist() {
40         existenceType = ExistenceType.MUST_EXIST;
41         return this;
42     }
43
44     public DirectoryOptions mustNotExist() {
45         existenceType = ExistenceType.MUST_NOT_EXIST;
46         return this;
47     }
48
49     @Override
50     public boolean isValid(final String value) {
51         final File file = new File(value);
52
53         if (existenceType == ExistenceType.MUST_EXIST) {
54             return file.exists() && file.isDirectory();
55         }
56
57         if (existenceType == ExistenceType.MUST_NOT_EXIST) {
58             return !file.exists();
59         }
60
61         if (existenceType == ExistenceType.DOES_NOT_MATTER) {
62             if (file.exists())
63                 if (file.isFile())
64                     return false;
65
66             return true;
67         }
68
69         return false;
70     }
71
72 }