using System; using System.Collections.Generic; using System.IO; using SabreTools.Logging; namespace SabreTools.Help { /// /// Represents an actionable top-level feature /// public abstract class TopLevel : Feature { #region Fields /// /// List of files, directories, and potential wildcard paths /// public List Inputs = new(); #endregion #region Logging /// /// Logging object /// private readonly Logger logger; #endregion #region Constructors /// /// Constructor /// public TopLevel() { logger = new Logger(this); } #endregion #region Processing /// /// Process args list based on current feature /// public virtual bool ProcessArgs(string[] args, FeatureSet help) { for (int i = 1; i < args.Length; i++) { // Verify that the current flag is proper for the feature if (!ValidateInput(args[i])) { // Special precautions for files and directories if (File.Exists(args[i]) || Directory.Exists(args[i])) { Inputs.Add(args[i]); } // Special precautions for wildcarded inputs (potential paths) #if NETFRAMEWORK else if (args[i].Contains("*") || args[i].Contains("?")) #else else if (args[i].Contains('*') || args[i].Contains('?')) #endif { Inputs.Add(args[i]); } // Everything else isn't a file else { logger.Error($"Invalid input detected: {args[i]}"); help.OutputIndividualFeature(this.Name); LoggerImpl.Close(); return false; } } } return true; } /// /// Process and extract variables based on current feature /// /// True if execution was successful, false otherwise public virtual bool ProcessFeatures(Dictionary features) => true; #endregion #region Generic Extraction /// /// Get boolean value from nullable feature /// protected static bool GetBoolean(Dictionary features, string key) { if (!features.ContainsKey(key)) return false; return true; } /// /// Get int value from nullable feature /// protected static int GetInt32(Dictionary features, string key) { if (!features.ContainsKey(key)) return Int32.MinValue; return features[key].GetInt32Value(); } /// /// Get long value from nullable feature /// protected static long GetInt64(Dictionary features, string key) { if (!features.ContainsKey(key)) return Int64.MinValue; return features[key].GetInt64Value(); } /// /// Get list value from nullable feature /// protected static List GetList(Dictionary features, string key) { if (!features.ContainsKey(key)) return []; return features[key].GetListValue() ?? []; } /// /// Get string value from nullable feature /// protected static string? GetString(Dictionary features, string key) { if (!features.ContainsKey(key)) return null; return features[key].GetStringValue(); } #endregion } }