using System;
using System.Collections.Generic;
using System.IO;
using SabreTools.IO.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 readonly List Inputs = [];
#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]))
continue;
// Special precautions for files and directories
if (File.Exists(args[i]) || Directory.Exists(args[i]))
{
Inputs.Add(item: 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(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]!.GetStringFieldValue();
}
#endregion
}
}