6a84919c5f320a48e8292d12c09f8fdbe40c8304
[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.MULTI);
20     }
21
22     @Override
23     public String describeFormat() {
24         return existenceType.description + " directories";
25     }
26
27     @Override
28     public List<File> getValue() {
29         return parameters.stream().map(File::new).collect(Collectors.toList());
30     }
31
32     public DirectoryOptions mustExist() {
33         existenceType = ExistenceType.MUST_EXIST;
34         return this;
35     }
36
37     public DirectoryOptions mustNotExist() {
38         existenceType = ExistenceType.MUST_NOT_EXIST;
39         return this;
40     }
41
42     @Override
43     public boolean isValid(final String value) {
44         final File file = new File(value);
45
46         if (existenceType == ExistenceType.MUST_EXIST) {
47             return file.exists() && file.isDirectory();
48         }
49
50         if (existenceType == ExistenceType.MUST_NOT_EXIST) {
51             return !file.exists();
52         }
53
54         if (existenceType == ExistenceType.DOES_NOT_MATTER) {
55             if (file.exists())
56                 if (file.isFile())
57                     return false;
58
59             return true;
60         }
61
62         return false;
63     }
64
65 }