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 }