internal static T GetValueOrDefault <T>(this ArgumentConversionResult result) { switch (result) { case SuccessfulArgumentConversionResult successful: return((T)successful.Value !); case FailedArgumentConversionResult failed: throw new InvalidOperationException(failed.ErrorMessage); case NoArgumentConversionResult _: return(default !); default: return(default !); } }
internal static ArgumentConversionResult ConvertIfNeeded( this ArgumentConversionResult conversionResult, SymbolResult symbolResult, Type toType) { if (conversionResult is null) { throw new ArgumentNullException(nameof(conversionResult)); } switch (conversionResult) { case SuccessfulArgumentConversionResult successful when !toType.IsInstanceOfType(successful.Value): return(ConvertObject( conversionResult.Argument, toType, successful.Value)); case SuccessfulArgumentConversionResult successful when toType == typeof(object) && conversionResult.Argument.Arity.MaximumNumberOfValues > 1 && successful.Value is string: return(ConvertObject( conversionResult.Argument, typeof(IEnumerable <string>), successful.Value)); case NoArgumentConversionResult _ when toType == typeof(bool): return(Success(conversionResult.Argument, true)); case NoArgumentConversionResult _ when conversionResult.Argument.Arity.MinimumNumberOfValues > 0: return(new MissingArgumentConversionResult( conversionResult.Argument, ValidationMessages.Instance.RequiredArgumentMissing(symbolResult))); case NoArgumentConversionResult _ when conversionResult.Argument.Arity.MaximumNumberOfValues > 1: return(Success( conversionResult.Argument, Array.Empty <string>())); default: return(conversionResult); } }
internal static object?GetValueOrDefault(this ArgumentConversionResult result) => result.GetValueOrDefault <object?>();