718aa0966a292d09d7cf0a5b849469828e37ab1c
[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.ONE);
18     }
19
20     @Override
21     public java.lang.String describeFormat() {
22         switch (existenceType) {
23             case MUST_EXIST:
24                 return "Existing directory.";
25             case MUST_NOT_EXIST:
26                 return "Non-existing directory.";
27             default:
28                 return "Directory.";
29         }
30     }
31
32     @Override
33     public File getValue() {
34
35         if (parameters.size() != 1)
36             throw new RuntimeException("Parameter " + description
37                     + " shall have exactly 1 argument.");
38
39         return new File(parameters.get(0));
40     }
41
42     public DirectoryOption mustExist() {
43         existenceType = ExistenceType.MUST_EXIST;
44         return this;
45     }
46
47     public DirectoryOption mustNotExist() {
48         existenceType = ExistenceType.MUST_NOT_EXIST;
49         return this;
50     }
51
52     @Override
53     public boolean isValid(final java.lang.String value) {
54         final File file = new File(value);
55
56         if (existenceType == ExistenceType.MUST_EXIST) {
57             return file.exists() && file.isDirectory();
58         }
59
60         if (existenceType == ExistenceType.MUST_NOT_EXIST) {
61             return !file.exists();
62         }
63
64         if (existenceType == ExistenceType.DOES_NOT_MATTER) {
65             if (file.exists())
66                 if (file.isFile())
67                     return false;
68
69             return true;
70         }
71
72         return false;
73     }
74
75 }