/// <summary>
        /// Gets the result of a FlagSet, cast to the given type parameter. Array types are not supported
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="flags"></param>
        /// <returns></returns>
        public T Get <T>(FlagSet flags)
        {
            if (!_results.ContainsKey(flags))
            {
                return(default(T));
            }

            object result = _results[flags];
            Type   t      = typeof(T);

            if (t == typeof(string))
            {
                if (result == null)
                {
                    return((T)(object)string.Empty);
                }

                return((T)result);
            }

            if (t.IsValueType)
            {
                TypeConverter tc = TypeDescriptor.GetConverter(t);
                return((T)tc.ConvertFromString(result.ToString()));
            }

            return((T)Activator.CreateInstance(t, result));
        }
        /// <summary>
        /// Adds a callback after a flag's parsing has been completed.
        /// This method automatically attaches the callback to the last added flag
        /// </summary>
        /// <param name="callback">An Action with no parameters.</param>
        /// <returns></returns>
        public CommandLineParser After(Action callback)
        {
            FlagSet flags = _flags.Last();

            flags.continuation = callback;
            return(this);
        }
        /// <summary>
        /// Adds a flag to be parsed, with the given callback being invoked when the flag is found.
        /// This method assumes the flag has no arguments
        /// </summary>
        /// <param name="flag"></param>
        /// <param name="callback"></param>
        /// <returns></returns>
        public CommandLineParser AddFlag(string flag, Action callback)
        {
            FlagSet flags = new FlagSet(flag)
            {
                NoArgs = true, callback = callback
            };

            return(AddFlags(flags));
        }
        /// <summary>
        /// Adds a flag to be parsed
        /// </summary>
        /// <param name="flag">The flag to be added</param>
        /// <param name="noArgs">Whether or not the flag is followed by an argument</param>
        public CommandLineParser AddFlag(string flag, bool noArgs = false)
        {
            FlagSet flags = new FlagSet(flag)
            {
                NoArgs = noArgs
            };

            return(AddFlags(flags));
        }
        /// <summary>
        /// Attempts to get the result of a FlagSet, cast to the given type parameter. Array types are not supported
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="flags"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool TryGet <T>(FlagSet flags, out T value)
        {
            object result = _results[flags];

            if (result == null)
            {
                //Null result shouldn't happen, but return false if it does
                value = default(T);
                return(false);
            }

            Type t = typeof(T);

            //Strings get special handling because the result object is a string
            if (t == typeof(string))
            {
                if (result == null)
                {
                    //Null strings shouldn't happen, but return false if it does
                    value = default(T);
                    return(false);
                }

                value = (T)result;
                return(true);
            }

            //Value types get converted with a TypeConverter
            if (t.IsValueType)
            {
                try
                {
                    TypeConverter tc = TypeDescriptor.GetConverter(t);
                    value = (T)tc.ConvertFrom(result);
                    return(true);
                }
                catch
                {
                    value = default(T);
                    return(false);
                }
            }

            try
            {
                //Reference types get created with an Activator
                value = (T)Activator.CreateInstance(t, result);
                return(true);
            }
            catch
            {
                value = default(T);
                return(false);
            }
        }
        /// <summary>
        /// Adds a range of flags to be parsed
        /// </summary>
        /// <param name="flags">The FlagSet to be added</param>
        /// <returns></returns>
        public CommandLineParser AddFlags(FlagSet flags)
        {
            if (_flags.Contains(flags))
            {
                return(this);
            }

            _flags.Add(flags);

            return(this);
        }
        /// <summary>
        /// Gets the result of a flag, cast to the given type parameter. Array types are not supported
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="flag"></param>
        /// <returns></returns>
        public T Get <T>(string flag)
        {
            FlagSet flags = _flags.FirstOrDefault(f => f.Contains(flag));

            if (flags == null)
            {
                return(default(T));
            }

            return(Get <T>(flags));
        }
        /// <summary>
        /// Attempts to get the result of a flag, cast to the given type parameter. Array types are not supported
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="flag"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool TryGet <T>(string flag, out T value)
        {
            FlagSet flags = _flags.FirstOrDefault(f => f.Contains(flag));

            if (flags == null)
            {
                value = default(T);
                return(false);
            }

            return(TryGet(flags, out value));
        }
Beispiel #9
0
        /// <summary>
        /// Parses the given source for flags registered with the parser
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public CommandLineParser ParseFromSource(string[] source)
        {
            _source = source;

            for (int i = 0; i < (source.Length - 1 == 0 ? 1 : source.Length); i++)
            {
                string flag     = source[i].ToLowerInvariant();
                string argument = null;

                if (string.IsNullOrWhiteSpace(flag))
                {
                    continue;
                }

                if (i + 1 < source.Length)
                {
                    argument = source[i + 1];
                }

                FlagSet flags = _flags.FirstOrDefault(f => f.Contains(flag));
                if (flags == null)
                {
                    continue;
                }

                if (flags.NoArgs)
                {
                    if (flags.callback != null)
                    {
                        ((Action)flags.callback).Invoke();
                    }
                    else
                    {
                        _results.Add(flags, true);
                    }
                }
                else
                {
                    if (flags.callback != null)
                    {
                        ((Action <string>)flags.callback).Invoke(argument);
                    }
                    else
                    {
                        _results.Add(flags, argument);
                    }
                }
                flags.continuation?.Invoke();
            }

            return(this);
        }
 /// <summary>
 /// Adds a range of flags to be parsed, with the given callback being invoked when the flag's argument is found.
 /// This method assumes the flag has no arguments
 /// </summary>
 /// <param name="flags">The FlagSet to be added</param>
 /// <param name="callback">An Action with no parameters.</param>
 /// <returns></returns>
 public CommandLineParser AddFlags(FlagSet flags, Action callback)
 {
     flags.callback = callback;
     flags.NoArgs   = true;
     return(AddFlags(flags));
 }
 /// <summary>
 /// Adds a range of flags to be parsed, with the given callback being invoked with the flag's argument when it is found.
 /// The callback's parameter is the argument passed to the flag
 /// </summary>
 /// <param name="flags">The FlagSet to be added</param>
 /// <param name="callback">An Action with a single string parameter. This parameter is the value passed to the flag</param>
 /// <returns></returns>
 public CommandLineParser AddFlags(FlagSet flags, Action <string> callback)
 {
     flags.callback = callback;
     return(AddFlags(flags));
 }