diff --git a/Framework/ArgsUniform/ArgsUniform.cs b/Framework/ArgsUniform/ArgsUniform.cs index e8f0277..8804c25 100644 --- a/Framework/ArgsUniform/ArgsUniform.cs +++ b/Framework/ArgsUniform/ArgsUniform.cs @@ -4,9 +4,8 @@ namespace ArgsUniform { public class ArgsUniform { + private readonly Assigner assigner; private readonly Action printAppInfo; - private readonly object? defaultsProvider; - private readonly IEnv.IEnv env; private readonly string[] args; private const int cliStart = 8; private const int shortStart = 38; @@ -31,9 +30,9 @@ namespace ArgsUniform public ArgsUniform(Action printAppInfo, object defaultsProvider, IEnv.IEnv env, params string[] args) { this.printAppInfo = printAppInfo; - this.defaultsProvider = defaultsProvider; - this.env = env; this.args = args; + + assigner = new Assigner(env, args, defaultsProvider); } public T Parse(bool printResult = false) @@ -53,7 +52,7 @@ namespace ArgsUniform var attr = uniformProperty.GetCustomAttribute(); if (attr != null) { - if (!UniformAssign(result, attr, uniformProperty) && attr.Required) + if (!assigner.UniformAssign(result, attr, uniformProperty) && attr.Required) { missingRequired.Add(uniformProperty); } @@ -124,130 +123,5 @@ namespace ArgsUniform Console.CursorLeft = descStart; Console.Write(desc + Environment.NewLine); } - - private object GetDefaultValue(Type t) - { - if (t.IsValueType) return Activator.CreateInstance(t)!; - return null!; - } - - private bool UniformAssign(T result, UniformAttribute attr, PropertyInfo uniformProperty) - { - if (AssignFromArgsIfAble(result, attr, uniformProperty)) return true; - if (AssignFromEnvVarIfAble(result, attr, uniformProperty)) return true; - if (AssignFromDefaultsIfAble(result, uniformProperty)) return true; - return false; - } - - private bool AssignFromDefaultsIfAble(T result, PropertyInfo uniformProperty) - { - var currentValue = uniformProperty.GetValue(result); - var isEmptryString = (currentValue as string) == string.Empty; - if (currentValue != GetDefaultValue(uniformProperty.PropertyType) && !isEmptryString) return true; - - if (defaultsProvider == null) return false; - - var defaultProperty = defaultsProvider.GetType().GetProperties().SingleOrDefault(p => p.Name == uniformProperty.Name); - if (defaultProperty == null) return false; - - var value = defaultProperty.GetValue(defaultsProvider); - if (value != null) - { - return Assign(result, uniformProperty, value); - } - return false; - } - - private bool AssignFromEnvVarIfAble(T result, UniformAttribute attr, PropertyInfo uniformProperty) - { - var e = env.GetEnvVarOrDefault(attr.EnvVar, string.Empty); - if (!string.IsNullOrEmpty(e)) - { - return Assign(result, uniformProperty, e); - } - return false; - } - - private bool AssignFromArgsIfAble(T result, UniformAttribute attr, PropertyInfo uniformProperty) - { - var fromArg = GetFromArgs(attr.Arg); - if (fromArg != null) - { - return Assign(result, uniformProperty, fromArg); - } - var fromShort = GetFromArgs(attr.ArgShort); - if (fromShort != null) - { - return Assign(result, uniformProperty, fromShort); - } - return false; - } - - private bool Assign(T result, PropertyInfo uniformProperty, object value) - { - if (uniformProperty.PropertyType == value.GetType()) - { - uniformProperty.SetValue(result, value); - return true; - } - else - { - if (uniformProperty.PropertyType == typeof(string) || uniformProperty.PropertyType == typeof(int)) - { - uniformProperty.SetValue(result, Convert.ChangeType(value, uniformProperty.PropertyType)); - return true; - } - else - { - if (uniformProperty.PropertyType == typeof(int?)) return AssignOptionalInt(result, uniformProperty, value); - if (uniformProperty.PropertyType.IsEnum) return AssignEnum(result, uniformProperty, value); - if (uniformProperty.PropertyType == typeof(bool)) return AssignBool(result, uniformProperty, value); - - throw new NotSupportedException(); - } - } - } - - private static bool AssignEnum(T result, PropertyInfo uniformProperty, object value) - { - var s = value.ToString(); - if (Enum.TryParse(uniformProperty.PropertyType, s, out var e)) - { - uniformProperty.SetValue(result, e); - return true; - } - return false; - } - - private static bool AssignOptionalInt(T result, PropertyInfo uniformProperty, object value) - { - if (int.TryParse(value.ToString(), out int i)) - { - uniformProperty.SetValue(result, i); - return true; - } - return false; - } - - private static bool AssignBool(T result, PropertyInfo uniformProperty, object value) - { - var s = value.ToString(); - if (s == "1" || (s != null && s.ToLowerInvariant() == "true")) - { - uniformProperty.SetValue(result, true); - } - return true; - } - - private string? GetFromArgs(string key) - { - var argKey = $"--{key}="; - var arg = args.FirstOrDefault(a => a.StartsWith(argKey)); - if (arg != null) - { - return arg.Substring(argKey.Length); - } - return null; - } } } diff --git a/Framework/ArgsUniform/Assigner.cs b/Framework/ArgsUniform/Assigner.cs new file mode 100644 index 0000000..b25c68b --- /dev/null +++ b/Framework/ArgsUniform/Assigner.cs @@ -0,0 +1,142 @@ +using System.Reflection; + +namespace ArgsUniform +{ + public class Assigner + { + private readonly IEnv.IEnv env; + private readonly string[] args; + private readonly object? defaultsProvider; + + public Assigner(IEnv.IEnv env, string[] args, object? defaultsProvider) + { + this.env = env; + this.args = args; + this.defaultsProvider = defaultsProvider; + } + + public bool UniformAssign(T result, UniformAttribute attr, PropertyInfo uniformProperty) + { + if (AssignFromArgsIfAble(result, attr, uniformProperty)) return true; + if (AssignFromEnvVarIfAble(result, attr, uniformProperty)) return true; + if (AssignFromDefaultsIfAble(result, uniformProperty)) return true; + return false; + } + + private bool AssignFromDefaultsIfAble(T result, PropertyInfo uniformProperty) + { + var currentValue = uniformProperty.GetValue(result); + var isEmptryString = (currentValue as string) == string.Empty; + if (currentValue != GetDefaultValueForType(uniformProperty.PropertyType) && !isEmptryString) return true; + if (defaultsProvider == null) return false; + + var defaultProperty = defaultsProvider.GetType().GetProperties().SingleOrDefault(p => p.Name == uniformProperty.Name); + if (defaultProperty == null) return false; + + var value = defaultProperty.GetValue(defaultsProvider); + if (value != null) + { + return Assign(result, uniformProperty, value); + } + return false; + } + + private bool AssignFromEnvVarIfAble(T result, UniformAttribute attr, PropertyInfo uniformProperty) + { + var e = env.GetEnvVarOrDefault(attr.EnvVar, string.Empty); + if (!string.IsNullOrEmpty(e)) + { + return Assign(result, uniformProperty, e); + } + return false; + } + + private bool AssignFromArgsIfAble(T result, UniformAttribute attr, PropertyInfo uniformProperty) + { + var fromArg = GetFromArgs(attr.Arg); + if (fromArg != null) + { + return Assign(result, uniformProperty, fromArg); + } + var fromShort = GetFromArgs(attr.ArgShort); + if (fromShort != null) + { + return Assign(result, uniformProperty, fromShort); + } + return false; + } + + private bool Assign(T result, PropertyInfo uniformProperty, object value) + { + if (uniformProperty.PropertyType == value.GetType()) + { + uniformProperty.SetValue(result, value); + return true; + } + else + { + if (uniformProperty.PropertyType == typeof(string) || uniformProperty.PropertyType == typeof(int)) + { + uniformProperty.SetValue(result, Convert.ChangeType(value, uniformProperty.PropertyType)); + return true; + } + else + { + if (uniformProperty.PropertyType == typeof(int?)) return AssignOptionalInt(result, uniformProperty, value); + if (uniformProperty.PropertyType.IsEnum) return AssignEnum(result, uniformProperty, value); + if (uniformProperty.PropertyType == typeof(bool)) return AssignBool(result, uniformProperty, value); + + throw new NotSupportedException(); + } + } + } + + private static bool AssignEnum(T result, PropertyInfo uniformProperty, object value) + { + var s = value.ToString(); + if (Enum.TryParse(uniformProperty.PropertyType, s, out var e)) + { + uniformProperty.SetValue(result, e); + return true; + } + return false; + } + + private static bool AssignOptionalInt(T result, PropertyInfo uniformProperty, object value) + { + if (int.TryParse(value.ToString(), out int i)) + { + uniformProperty.SetValue(result, i); + return true; + } + return false; + } + + private static bool AssignBool(T result, PropertyInfo uniformProperty, object value) + { + var s = value.ToString(); + if (s == "1" || (s != null && s.ToLowerInvariant() == "true")) + { + uniformProperty.SetValue(result, true); + } + return true; + } + + private string? GetFromArgs(string key) + { + var argKey = $"--{key}="; + var arg = args.FirstOrDefault(a => a.StartsWith(argKey)); + if (arg != null) + { + return arg.Substring(argKey.Length); + } + return null; + } + + private static object GetDefaultValueForType(Type t) + { + if (t.IsValueType) return Activator.CreateInstance(t)!; + return null!; + } + } +}