View Javadoc

1   //
2   //Author       : t.wood
3   //Copyright    : (c) Resilient Networks plc 2012 - All Rights Reserved
4   //
5   package com.lexicalscope.jewel.cli.validation;
6   
7   import static com.lexicalscope.fluent.FluentDollar.$;
8   import static com.lexicalscope.jewel.cli.validation.RawOptionMatchers.isLastOption;
9   
10  import java.util.List;
11  import java.util.Map.Entry;
12  
13  import ch.lambdaj.function.convert.Converter;
14  
15  import com.lexicalscope.fluent.functions.BiConverter;
16  import com.lexicalscope.fluent.map.transforms.MapPipelineBuilder;
17  import com.lexicalscope.jewel.cli.ValidationErrorBuilder;
18  import com.lexicalscope.jewel.cli.specification.OptionsSpecification;
19  import com.lexicalscope.jewel.cli.specification.ParsedOptionSpecification;
20  
21  class ValidationPipeline
22  {
23     private final OptionsSpecification<?> specification;
24     private final ValidationErrorBuilder validationErrorBuilder;
25  
26     ValidationPipeline(final OptionsSpecification<?> specification, final ValidationErrorBuilder validationErrorBuilder)
27     {
28        this.specification = specification;
29        this.validationErrorBuilder = validationErrorBuilder;
30     }
31  
32     MapPipelineBuilder<RawOption, List<String>, ParsedOptionSpecification, List<String>> buildValidationPipeline(final List<String> validatedUnparsedArguments)
33     {
34        return $.<RawOption, List<String>>mapPipeline().
35                 allowKeys(thatAreKnownOptions()).
36                 processPuts(trimExcessOptionsInto(validatedUnparsedArguments)).
37                 convertKeys(lookupSpecifcationFromOption()).
38                 allowKeys(butRejectHelpOption()).
39                 vetoPuts(thatHaveTheWrongNumberOfValues()).
40                 vetoPuts(thatHaveValuesInTheWrongFormat());
41     }
42  
43     private KnownOptions thatAreKnownOptions()
44     {
45        return new KnownOptions(specification, validationErrorBuilder);
46     }
47  
48     private Converter<Entry<RawOption, List<String>>, Entry<RawOption, List<String>>> trimExcessOptionsInto(final List<String> validatedUnparsedArguments)
49     {
50        return $.predicatedConverter(isLastOption(), new TrimExccessValues(specification, validatedUnparsedArguments));
51     }
52  
53     private BiConverter<ParsedOptionSpecification, RawOption> lookupSpecifcationFromOption()
54     {
55        return new ConverterRawOptionToParsedOptionSpecification(specification);
56     }
57  
58     private ReportWrongFormatValues thatHaveValuesInTheWrongFormat()
59     {
60        return new ReportWrongFormatValues(validationErrorBuilder);
61     }
62  
63     private ReportWrongNumberOfValues thatHaveTheWrongNumberOfValues()
64     {
65        return new ReportWrongNumberOfValues(validationErrorBuilder);
66     }
67  
68     private RejectHelpOption butRejectHelpOption()
69     {
70        return new RejectHelpOption(specification);
71     }
72  }