StartupConfiguration.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Xml.XPath;
  6. using Quadarax.Foundation.Core.Console;
  7. using Quadarax.Foundation.Core.Logging;
  8. using Quadarax.Foundation.Core.QConsole.Handlers;
  9. namespace Quadarax.Foundation.Core.QConsole.Configuration
  10. {
  11. public class StartupConfiguration
  12. {
  13. #region *** Private Fields ***
  14. private bool _isConsoleDebug;
  15. private string[] _defaultCommands = {"CmdClear", "CmdExit", "CmdPrint", "CmdSelection"};
  16. private readonly IList<string> _disabledCommands = new List<string>();
  17. #endregion
  18. #region *** Properties ***
  19. /// <summary>
  20. /// Name of console application, If not defined uses default name from entryAssembly.
  21. /// </summary>
  22. public string ConsoleName { get; } = string.Empty;
  23. /// <summary>
  24. /// Console application version. If not defined uses version of entryAssembly.
  25. /// </summary>
  26. public Version ConsoleVersion { get; } = Version.Parse("0.0.0.0");
  27. /// <summary>
  28. /// Console application copyright message. If not set skip this info.
  29. /// </summary>
  30. public string ConsoleCopyright { get; set; } = string.Empty;
  31. /// <summary>
  32. /// Defines if console is initialized from XML definition.
  33. /// </summary>
  34. public bool IsInitFromXml { get; }
  35. /// <summary>
  36. /// Left introducing of interactive mode character.
  37. /// </summary>
  38. public string CharacterLineIntroduce { get; set; } = string.Empty;
  39. /// <summary>
  40. /// Separator between two ordinal arguments
  41. /// </summary>
  42. public string CharacterOrdinalArgumentSeparator { get; set; } = string.Empty;
  43. /// <summary>
  44. /// Named argument prefix character.
  45. /// </summary>
  46. public string CharacterNamedArgumentSeparator { get; set; } = string.Empty;
  47. /// <summary>
  48. /// Named argument postfix character {defines end of argument code and value)
  49. /// </summary>
  50. public string CharacterNamedArgumentValueSeparator { get; set; } = string.Empty;
  51. /// <summary>
  52. /// Start end end string value character
  53. /// </summary>
  54. public string CharacterTextValueBraceSeparator { get; set; } = string.Empty;
  55. /// <summary>
  56. /// Separator between two selection inputs
  57. /// </summary>
  58. public string CharacterSelectionInputValueSeparator { get; set; } = string.Empty;
  59. /// <summary>
  60. /// Date input/output value format
  61. /// </summary>
  62. public string DateFormat { get; set; } = string.Empty;
  63. /// <summary>
  64. /// Time input/output value format
  65. /// </summary>
  66. public string TimeFormat { get; set; } = string.Empty;
  67. /// <summary>
  68. /// Defines if interactive mode is enabled
  69. /// </summary>
  70. public bool AllowInteractive { get; set; }
  71. /// <summary>
  72. /// Defines if initial variables is allowed for interactive mode.
  73. /// </summary>
  74. public bool AllowPreset { get; set; }
  75. /// <summary>
  76. /// Defines assembly list where custom commands are defined (in case explicit command definition).
  77. /// </summary>
  78. public Assembly[] CommandDefinitionAssembly { get; set; } = Array.Empty<Assembly>();
  79. /// <summary>
  80. /// Returns name of command classes that will be disabled (hidden)
  81. /// </summary>
  82. public string[] DisabledCommands => _disabledCommands.ToArray();
  83. /// <summary>
  84. /// Defines if waits on key at the end of process in non-interactive mode (inline mode)
  85. /// </summary>
  86. public bool WaitOnKeyInNonInteractiveMode { get; set; }
  87. /// <summary>
  88. /// Defines if show status of engine and command context before every command executed.
  89. /// </summary>
  90. public bool ShowStatusOnEveryCommand { get; set; }
  91. /// <summary>
  92. /// Defines if throws exception when command execution is not successful.
  93. /// </summary>
  94. public bool ThrowExceptionWhenNotSuccess { get; set; } = false;
  95. public bool UseDefaultHandlers { get; set; }
  96. /// <summary>
  97. /// Handler when no arguments input specified. If not set then do nothing.
  98. /// </summary>
  99. public NothingToDo? HandlerNothingToDo { get; set; }
  100. public bool IsConsoleDebug {
  101. get
  102. {
  103. return _isConsoleDebug;
  104. }
  105. set
  106. {
  107. _isConsoleDebug = value;
  108. DebugConsoleWriter.IsWriteDebugEnabled = value;
  109. }
  110. }
  111. public ILogger? DefaultLoggerFactory { get; set; }
  112. #endregion
  113. #region *** Constructor ***
  114. public StartupConfiguration(string consoleName, Version consoleVersion)
  115. {
  116. ConsoleName = consoleName;
  117. ConsoleVersion = consoleVersion;
  118. IsInitFromXml = false;
  119. InitDefaults();
  120. }
  121. public StartupConfiguration(string consoleXmlFileName)
  122. {
  123. IsInitFromXml = true;
  124. InitDefaults();
  125. }
  126. public StartupConfiguration(XPathNavigator configurationNavigator)
  127. {
  128. IsInitFromXml = true;
  129. InitDefaults();
  130. }
  131. #endregion
  132. #region *** Public Operations ***
  133. public StartupConfiguration EnableDebugMode()
  134. {
  135. IsConsoleDebug = true;
  136. return this;
  137. }
  138. public StartupConfiguration DisableDebugMode()
  139. {
  140. IsConsoleDebug = false;
  141. return this;
  142. }
  143. public StartupConfiguration DisableDefaultCommands()
  144. {
  145. return DisableCommands(_defaultCommands);
  146. }
  147. public StartupConfiguration EnableDefaultCommands()
  148. {
  149. return EnableCommands(_defaultCommands);
  150. }
  151. public StartupConfiguration EnableCommands(params string[]? commandClassNames)
  152. {
  153. if (commandClassNames == null)
  154. return this;
  155. foreach (var className in commandClassNames)
  156. {
  157. if (_disabledCommands.Contains(className))
  158. _disabledCommands.Remove(className);
  159. }
  160. return this;
  161. }
  162. public StartupConfiguration DisableCommands(params string[]? commandClassNames)
  163. {
  164. if (commandClassNames == null)
  165. return this;
  166. foreach (var className in commandClassNames)
  167. {
  168. if (!_disabledCommands.Contains(className))
  169. _disabledCommands.Add(className);
  170. }
  171. return this;
  172. }
  173. #endregion
  174. #region *** Private Operations ***
  175. private void InitDefaults()
  176. {
  177. CharacterLineIntroduce = Defaults.RoleCharacters.ConsoleLineIntroduce;
  178. CharacterOrdinalArgumentSeparator = Defaults.RoleCharacters.OrdinalArgumentSeparator;
  179. CharacterNamedArgumentSeparator = Defaults.RoleCharacters.NamedArgumentSeparator;
  180. CharacterNamedArgumentValueSeparator = Defaults.RoleCharacters.NamedArgumentValueSeparator;
  181. CharacterTextValueBraceSeparator = Defaults.RoleCharacters.TextValueBraceSeparator;
  182. CharacterSelectionInputValueSeparator = Defaults.RoleCharacters.InputSelectionValueSeparator;
  183. DateFormat = Defaults.Formats.DateFormat;
  184. TimeFormat = Defaults.Formats.TimeFormat;
  185. AllowInteractive = Defaults.Console.InteractiveAllowed;
  186. AllowPreset = Defaults.Console.PresetAllowed;
  187. IsConsoleDebug = Defaults.Console.ConsoleDebugMode;
  188. WaitOnKeyInNonInteractiveMode = Defaults.Console.WaitOnKeyInNonInteractiveMode;
  189. ShowStatusOnEveryCommand = Defaults.Console.ShowStatusOnEveryCommand;
  190. UseDefaultHandlers = Defaults.Console.UseDefaultHadlers;
  191. if (UseDefaultHandlers)
  192. {
  193. HandlerNothingToDo += engine =>
  194. {
  195. using (var writer = new ConsoleWriter(ConsoleColor.Yellow))
  196. {
  197. writer.WriteLine("Nothing to do.");
  198. }
  199. using (var writer = new ConsoleWriter(ConsoleColor.DarkGreen))
  200. {
  201. writer.WriteLine("Put some arguments to do something. For example -help to list commands and arguments.");
  202. }
  203. };
  204. }
  205. }
  206. #endregion
  207. }
  208. }