Example #1
0
        public object ConvertValueToExpectedType(string value, Type expectedType, IArgumentConverter converter)
        {
            if (value == null)
            {
                return(null);
            }

            if (expectedType == typeof(string))
            {
                return(value);
            }

            if (converter != null && converter.CanConvert(expectedType))
            {
                return(converter.Convert(expectedType, value));
            }

            foreach (var c in _argumentConverters)
            {
                if (c.CanConvert(expectedType))
                {
                    return(c.Convert(expectedType, value));
                }
            }

            throw new MissingConverterException(expectedType);
        }
        public OverloadResolver(IArgumentConverter argumentConverter)
        {
            if (argumentConverter == null)
                throw new ArgumentNullException(nameof(argumentConverter));

            _argumentConverter = argumentConverter;
        }
Example #3
0
        /// <summary>
        /// Registers an argument converter for specified type.
        /// </summary>
        /// <typeparam name="T">Type for which to register the converter.</typeparam>
        /// <param name="converter">Converter to register.</param>
        public void RegisterConverter <T>(IArgumentConverter <T> converter)
        {
            if (converter == null)
            {
                throw new ArgumentNullException(nameof(converter), "Converter cannot be null.");
            }

            var t  = typeof(T);
            var ti = t.GetTypeInfo();

            this.ArgumentConverters[t] = converter;

            if (!ti.IsValueType)
            {
                return;
            }

            var nullableConverterType = typeof(NullableConverter <>).MakeGenericType(t);
            var nullableType          = typeof(Nullable <>).MakeGenericType(t);

            if (this.ArgumentConverters.ContainsKey(nullableType))
            {
                return;
            }

            var nullableConverter = Activator.CreateInstance(nullableConverterType) as IArgumentConverter;

            this.ArgumentConverters[nullableType] = nullableConverter;
        }
        public void Setup()
        {
            _reflector     = Substitute.For <IArgumentPropertyReflector>();
            _generator     = new FFmpegArgumentGenerator(_reflector);
            _mockConverter = Substitute.For <IArgumentConverter>();

            _mockConverter.Convert(Arg.Any <string>(), Arg.Any <object>()).Returns(x => $"{x[0]} {x[1]}");
        }
        /// <summary>
        /// Registers an argument converter for specified type.
        /// </summary>
        /// <typeparam name="T">Type for which to register the converter.</typeparam>
        /// <param name="converter">Converter to register.</param>
        public static void RegisterConverter <T>(IArgumentConverter <T> converter)
        {
            if (converter == null)
            {
                throw new ArgumentNullException("Converter cannot be null.", nameof(converter));
            }

            ArgumentConverters[typeof(T)] = converter;
        }
Example #6
0
 /// <summary>
 ///  コマンド行引数を指定された型'<typeparamref name="T"/>'へ変換します。
 /// </summary>
 /// <typeparam name="T">変換後のオブジェクトです。</typeparam>
 /// <param name="converter">実際に変換を行うオブジェクトです。</param>
 /// <param name="args">コマンド行引数の全部または一部を表す文字列配列です。</param>
 /// <returns>変換結果を表す新しい指定された型'<typeparamref name="T"/>'のオブジェクトです。</returns>
 /// <exception cref="System.ArgumentNullException"/>
 public static T Convert <T>(this IArgumentConverter <T> converter, IEnumerable <string> args)
 {
     if (converter == null)
     {
         throw new ArgumentNullException(nameof(converter));
     }
     if (args == null)
     {
         throw new ArgumentNullException(nameof(args));
     }
     return(converter.Convert(args.ToArray()));
 }
Example #7
0
        public bool AddConverter(IArgumentConverter converter)
        {
            if (!_converter_list.Add(converter ?? throw new ArgumentNullException(nameof(converter))))
            {
                return(false);
            }

            foreach (KeyValuePair <Type, HashSet <IArgumentConverter> > kvp in _converters)
            {
                if (converter.GetCompatibilty(kvp.Key) == ConversionCompability.Possible)
                {
                    kvp.Value.Add(converter);
                }
            }

            return(true);
        }
        IArgumentConverter GetConverter(Type type)
        {
            IArgumentConverter result = DEFAULT_CONVERTER;

            if (type != null)
            {
                result = _convertersByType.GetValueOrDefault(type)
                         ?? Activator.CreateInstance(type) as IArgumentConverter;
            }

            if (result != null)
            {
                result.Reflector = this;
            }

            return(result);
        }
        /// <summary>Attempts to convert argument to parameter type.</summary>
        /// <param name="parameter">Parameter to convert argument to.</param>
        /// <param name="argIndex">Index of argument.</param>
        /// <param name="values">Builder values. Must contain Args and ArgumentConverterProvider.</param>
        /// <param name="result">Result of the conversion. Null if conversion failed.</param>
        /// <param name="error">Exception that occured when converting. Null if there was no exception.</param>
        /// <returns>True if converting was successful; otherwise false.</returns>
        protected static bool TryConvertArgument(ParameterInfo parameter, int argIndex, ParameterBuilderValues values, out object result, out Exception error)
        {
            if (argIndex < 0)
            {
                throw new ArgumentException("Argument index cannot be negative", nameof(argIndex));
            }
            if (values == null)
            {
                throw new ArgumentNullException(nameof(values));
            }

            error  = null;
            result = null;

            // check if we didn't run out of args
            if (values.Args == null || values.Args.Length - 1 < argIndex)
            {
                return(false);
            }

            // get from provider
            IArgumentConverterProvider provider  = values.ArgumentConverterProvider;
            IArgumentConverter         converter = provider?.GetConverter(parameter);

            if (converter == null)
            {
                return(false);
            }

            try
            {
                result = converter.Convert(parameter, values.Args[argIndex]);
                return(true);
            }
            catch (Exception ex)
            {
                error = ex;
                return(false);
            }
        }
        /// <summary>
        /// Set converter
        /// </summary>
        /// <param name="converter">Converter instance</param>
        /// <returns>Self instance</returns>
        public ParameterSeriesBuilder <T> Converter(IArgumentConverter converter)
        {
            _converter = converter;

            return(this);
        }
Example #11
0
        /// <summary>
        /// Registers Converter to convert argument values
        /// </summary>
        /// <param name="argumentConverter">Param Converter to register</param>
        /// <returns>Self instance</returns>
        public CliConfigurator RegisterConverter(IArgumentConverter argumentConverter)
        {
            _argumentConverters.Add(argumentConverter);

            return(this);
        }
Example #12
0
        /// <summary>
        /// Set converter
        /// </summary>
        /// <param name="converter">Converter instance</param>
        /// <returns>Self instance</returns>
        public OptionBuilder <T> Converter(IArgumentConverter converter)
        {
            _converter = converter;

            return(this);
        }
 public static Task <Optional <T> > ConvertAsync <T>(this IArgumentConverter <T> converter, string value, CommandContext ctx)
 {
     return(converter.ConvertAsync(value, ctx));
 }
Example #14
0
 /// <summary>
 /// Registers an argument converter for specified type.
 /// </summary>
 /// <typeparam name="T">Type for which to register the converter.</typeparam>
 /// <param name="extensions">Extensions to register the converter on.</param>
 /// <param name="converter">Converter to register.</param>
 public static void RegisterConverter <T>(this IReadOnlyDictionary <int, CommandsNextExtension> extensions, IArgumentConverter <T> converter)
 {
     foreach (var extension in extensions.Values)
     {
         extension.RegisterConverter(converter);
     }
 }
Example #15
0
 // for argument converter provider
 /// <summary>Sets a fallback enum argument converter in Argument Converter Provider.</summary>
 /// <param name="builder">Hosted Commands Service builder.</param>
 /// <param name="converter">Converter to convert enums with.</param>
 /// <seealso cref="IArgumentConverterProvider"/>
 /// <seealso cref="IArgumentConverter"/>
 /// <seealso cref="ArgumentConverterProviderOptions.EnumConverter"/>
 public static IHostedCommandsServiceBuilder SetEnumArgumentConverter(this IHostedCommandsServiceBuilder builder, IArgumentConverter converter)
 => builder.ConfigureArgumentConverterProvider(options => options.EnumConverter = converter);
Example #16
0
 /// <summary>Maps an argument converter in Argument Converter Provider.</summary>
 /// <param name="builder">Hosted Commands Service builder.</param>
 /// <param name="parameterType">Type of parameter to set converter for.</param>
 /// <param name="converter">Converter to convert type with.</param>
 /// <seealso cref="IArgumentConverterProvider"/>
 /// <seealso cref="IArgumentConverter"/>
 /// <seealso cref="ArgumentConverterProviderOptions.Converters"/>
 public static IHostedCommandsServiceBuilder MapArgumentConverter(this IHostedCommandsServiceBuilder builder, Type parameterType, IArgumentConverter converter)
 => builder.ConfigureArgumentConverterProvider(options => options.Converters[parameterType] = converter);
Example #17
0
 /// <summary>
 /// Registers an argument converter for specified type.
 /// </summary>
 /// <typeparam name="T">Type for which to register the converter.</typeparam>
 /// <param name="converter">Converter to register.</param>
 public void RegisterConverter <T>(IArgumentConverter <T> converter)
 => CommandsNextUtilities.RegisterConverter(converter);