1 /*
2  * hunt-console eases the creation of beautiful and testable command line interfaces.
3  *
4  * Copyright (C) 2018-2019, HuntLabs
5  *
6  * Website: https://www.huntlabs.net
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.console.descriptor.AbstractDescriptor;
13 
14 import std.string;
15 
16 import hunt.console.Console;
17 import hunt.console.error.InvalidArgumentException;
18 import hunt.console.command.Command;
19 import hunt.console.input.InputArgument;
20 import hunt.console.input.InputDefinition;
21 import hunt.console.input.InputOption;
22 import hunt.console.output.Output;
23 import hunt.console.output.OutputType;
24 import hunt.console.descriptor.Descriptor;
25 import hunt.console.descriptor.DescriptorOptions;
26 
27 public abstract class AbstractDescriptor : Descriptor
28 {
29     private Output output;
30 
31     /* override */ public void describe(Output output, Object object)
32     {
33         describe(output, object, new DescriptorOptions());
34     }
35 
36     override public void describe(Output output, Object object, DescriptorOptions options)
37     {
38         this.output = output;
39 
40         if (cast(InputArgument)object !is null) {
41             describeInputArgument(cast(InputArgument) object, options);
42         } else if (cast(InputOption)object !is null) {
43             describeInputOption(cast(InputOption) object, options);
44         } else if (cast(InputDefinition)object !is null) {
45             describeInputDefinition(cast(InputDefinition) object, options);
46         } else if (cast(Command)object !is null) {
47             describeCommand(cast(Command) object, options);
48         } else if (cast(Console)object !is null) {
49             describeConsole(cast(Console) object, options);
50         } else {
51             throw new InvalidArgumentException(format("Object of type '%s' is not describable.", typeid(object).name));
52         }
53     }
54 
55     protected void write(string message)
56     {
57         write(message, false);
58     }
59 
60     protected void write(string message, bool decorated)
61     {
62         output.write(message, false, decorated ? OutputType.NORMAL : OutputType.RAW);
63     }
64 
65     abstract protected void describeInputArgument(InputArgument inputArgument, DescriptorOptions options);
66 
67     abstract protected void describeInputOption(InputOption inputOption, DescriptorOptions options);
68 
69     protected abstract void describeInputDefinition(InputDefinition inputDefinition, DescriptorOptions options);
70 
71     protected abstract void describeCommand(Command command, DescriptorOptions options);
72 
73     protected abstract void describeConsole(Console application, DescriptorOptions options);
74 }