8f97a8b8d5c7b949b11bc4b1a678008cf1a7b319
[cli-helper.git] / src / main / java / eu / svjatoslav / commons / cli_helper / parameter_parser / parameter / DirectoryOption.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
12 public class DirectoryOption extends Option<File, DirectoryOption> {
13
14     private ExistenceType existenceType = ExistenceType.DOES_NOT_MATTER;
15
16     public DirectoryOption(final String description) {
17         super(description, ParameterCount.SINGLE);
18     }
19
20     @Override
21     public java.lang.String describeFormat() {
22         return existenceType.description + " directory";
23     }
24
25     @Override
26     public File getValue() {
27
28         if (parameters.size() != 1)
29             throw new RuntimeException("Parameter " + description
30                     + " shall have exactly 1 argument.");
31
32         return new File(parameters.get(0));
33     }
34
35     public DirectoryOption mustExist() {
36         existenceType = ExistenceType.MUST_EXIST;
37         return this;
38     }
39
40     public DirectoryOption mustNotExist() {
41         existenceType = ExistenceType.MUST_NOT_EXIST;
42         return this;
43     }
44
45     @Override
46     public boolean isValid(final java.lang.String value) {
47         final File file = new File(value);
48
49         if (existenceType == ExistenceType.MUST_EXIST) {
50             return file.exists() && file.isDirectory();
51         }
52
53         if (existenceType == ExistenceType.MUST_NOT_EXIST) {
54             return !file.exists();
55         }
56
57         if (existenceType == ExistenceType.DOES_NOT_MATTER) {
58             if (file.exists())
59                 if (file.isFile())
60                     return false;
61
62             return true;
63         }
64
65         return false;
66     }
67
68 }