public void RemoveMember(MemberInfo member)
 {
     if (Members.ContainsKey(member))
     {
         Members.Remove(member);
         OrdinalArguments.Remove(member);
     }
 }
        public virtual void BindModel(TModel model, IEnumerable <string> args)
        {
            var unnamedArgs = args.TakeWhile(s => IsSwitch(s) == false);

            EnsureCorrectNumberOfOrdinalArguments(unnamedArgs);

            for (var i = 0; i < OrdinalArguments.Count; i++)
            {
                MemberBindingDefinition <TModel> member = (MemberBindingDefinition <TModel>)GetMemberBindingDefinition(OrdinalArguments[i]);

                if (member == null)
                {
                    throw new BindingDefinitionException(String.Format("Member {0} in {1} does not have a BindingDefinition defined.", OrdinalArguments[i].Name, typeof(TModel).FullName));
                }

                if (OrdinalArguments.Count != i + 1)
                {
                    HandleInputs(new[] { unnamedArgs.Skip(i).First() }, model, member);
                }
                else
                {
                    //last ordinal, send remaining ordinal arguments
                    HandleInputs(unnamedArgs.Skip(i), model, member);
                }
            }

            var switchedArguments = args.Skip(unnamedArgs.Count());
            var namedMembers      = Members.Where(m => OrdinalArguments.Contains(m.Key) == false);

            foreach (var member in namedMembers)
            {
                //find a suitable switch
                var argument = switchedArguments.SkipWhile(a => a.StartsWith(SwitchDelimiter) == false || a.Length <= SwitchDelimiter.Length || member.Value.CanHandleSwitch(a.Substring(SwitchDelimiter.Length)) == false);

                if (argument.Any())
                {
                    //take all arguments until the next switch is found, skipping the first, which is the switch itself
                    var argumentValue = argument.Skip(1).TakeWhile(a => a.StartsWith(SwitchDelimiter) == false);

                    HandleInputs(argumentValue, model, member.Value);
                }
                else
                {
                    if (member.Value.Required == true)
                    {
                        throw new InvalidOperationException(String.Format(Properties.Resources.RequiredParameterNotProvidedMessage, member.Value.MemberInfo.Name));
                    }

                    //switch not provided
                    if (member.Value.DefaultValue != null)
                    {
                        member.Key.SetValue(model, member.Value.DefaultValue);
                    }
                }
            }
        }
        public void AddOrdinalArgument(MemberInfo member)
        {
            if (OrdinalArguments.Any(m => m.GetDeclaredType().GetGenericIEnumerable() != null))
            {
                throw new InvalidOperationException(Properties.Resources.OnlyLastOridnalArgumentCollectionMessage);
            }

            GetOrCreateMemberBindingDefinition(member);
            OrdinalArguments.Add(member);
        }
Example #4
0
        public virtual void BindModel(TModel model, IEnumerable <string> args)
        {
            var unnamedArgs = args.TakeWhile(s => IsSwitch(s) == false);

            if (unnamedArgs.Count() != OrdinalArguments.Count)
            {
                throw new InvalidArgsFormatException(String.Format("Model requires exactly {0} arguments before the first switch; {1} was/were provided", OrdinalArguments.Count, unnamedArgs.Count()));
            }

            for (var i = 0; i < OrdinalArguments.Count; i++)
            {
                MemberBindingDefinition <TModel> member;

                if (Members.TryGetValue(OrdinalArguments[i], out member) == false)
                {
                    throw new BindingDefinitionException(String.Format("Member {0} in {1} does not have a BindingDefinition defined.", OrdinalArguments[i].Name, typeof(TModel).FullName));
                }


                HandleInputs(new[] { unnamedArgs.Skip(i).First() }, model, member);
            }

            var switchedArguments = args.Skip(unnamedArgs.Count());
            var namedMembers      = Members.Where(m => OrdinalArguments.Contains(m.Key) == false);

            foreach (var member in namedMembers)
            {
                //find a suitable switch, then skip 1 (to skip the switch itself)
                var argument = switchedArguments.SkipWhile(a => a.Length <= SwitchDelimiter.Length || member.Value.CanHandleSwitch(a.Substring(SwitchDelimiter.Length)) == false).Skip(1);

                if (argument.Any())
                {
                    //take all arguments until the next switch is found
                    var argumentValue = argument.TakeWhile(a => a.StartsWith(SwitchDelimiter) == false);

                    HandleInputs(argumentValue, model, member.Value);
                }
                else
                {
                    //switch not provided
                    if (member.Value.DefaultValue != null)
                    {
                        member.Key.SetValue(model, member.Value.DefaultValue);
                    }
                }
            }
        }
        private void EnsureCorrectNumberOfOrdinalArguments(IEnumerable <string> ordinalArgs)
        {
            if (OrdinalArguments.Any())
            {
                if (OrdinalArguments.Count == ordinalArgs.Count())
                {
                    return;
                }

                var hasCollection = OrdinalArguments.Last().GetDeclaredType().GetGenericIEnumerable() != null;

                if (hasCollection && ordinalArgs.Count() >= OrdinalArguments.Count)
                {
                    return;
                }

                throw new InvalidOperationException(string.Format(Properties.Resources.IncorrectNumberOfOrdinalArgumentsMessage, OrdinalArguments.Count));
            }
        }
        public int?OrdinalIndexOf(MemberInfo member)
        {
            var index = OrdinalArguments.IndexOf(member);

            return(index == -1 ? null : new int?(index));
        }
Example #7
0
 public void AddOrdinalArgument(MemberInfo member)
 {
     GetOrCreateMemberBindingDefinition(member);
     OrdinalArguments.Add(member);
 }