Beispiel #1
0
        private static string GetArgInstanceUsage(int maxCharactersPerLine, ArgInstance instance)
        {
            StringBuilder builder = new StringBuilder();
            List<string> names = new List<string>();
            if (instance.ShortName != null)
            {
                builder.AppendFormat("  -" + instance.ShortName + ", ");
            }
            else
            {
                builder.AppendFormat("      ");
            }

            if (instance.Name != null)
            {
                names.Add("--" + instance.Name);
            }

            // No need to print the FullName as all variables must have a Name.
            // It would also make the usage string quite verbose.
            builder.AppendFormat(
                "{0, -" + HelpStringStartIndex.ToString() + "} {1}",
                string.Join(", ", names),
                instance.Arg.Help);

            if (instance.Arg.AllowedValues != null)
            {
                builder.AppendFormat(" (AllowedValues=[{0}])", string.Join(", ", instance.Arg.AllowedValues));
            }
            else if (instance.Field.FieldType.Equals(typeof(bool)))
            {
                builder.Append(" (AllowedValues=[True, False])");
            }
            else if (instance.Field.FieldType.IsEnum)
            {
                Array enumValues = Enum.GetValues(instance.Field.FieldType);
                List<string> stringValues = new List<string>();
                for (int i = 0; i < enumValues.Length; ++i)
                {
                    stringValues.Add(enumValues.GetValue(i).ToString());
                }
                builder.AppendFormat(" (AllowedValues=[{0}])", string.Join(", ", stringValues));
            }

            if (instance.DefaultValue != null)
            {
                if (instance.DefaultValue.GetType().IsArray)
                {
                    builder.AppendFormat(" (DefaultValue=[{0}])", string.Join(", ", ((Array)instance.DefaultValue).Cast<object>()));
                }
                else
                {
                    builder.AppendFormat(" (DefaultValue=[{0}])", instance.DefaultValue);
                }
            }
            return GetInMultipleLines(builder, maxCharactersPerLine); ;
        }
Beispiel #2
0
 public FindResult GetFindResult(params string[] mandatoryFields)
 {
     HashSet<string> mandatoryFieldsSet = new HashSet<string>(mandatoryFields);
     List<ArgInstance> argInstances = new List<ArgInstance>();
     foreach (FieldInfo fieldInfo in GetType().GetFields())
     {
         ArgAttribute attribute = new ArgAttribute("helpmessage");
         if (mandatoryFieldsSet.Contains(fieldInfo.Name))
         {
             attribute.IsMandatory = true;
         }
         ArgInstance argInstance = new ArgInstance(attribute, fieldInfo, GetType(), this);
         argInstances.Add(argInstance);
     }
     return new FindResult(argInstances, ExecutionLog.CreateErrorLog(), ExecutionLog.CreateWarningLog());
 }
Beispiel #3
0
        public FindResult FindAllArgs(Assembly rootAssembly)
        {
            Stack<Assembly> assembliesToScan = new Stack<Assembly>();
            HashSet<string> scannedAssemblies = new HashSet<string>();
            List<ArgInstance> args = new List<ArgInstance>();
            ExecutionLog errorLog = ExecutionLog.CreateErrorLog();
            ExecutionLog warningLog = ExecutionLog.CreateWarningLog();

            assembliesToScan.Push(rootAssembly);
            while (assembliesToScan.Count > 0)
            {
                Assembly currentAssembly = assembliesToScan.Pop();
                scannedAssemblies.Add(currentAssembly.FullName);
                Log.Info("Scanning Assembly [{0}].", currentAssembly.FullName);

                foreach (AssemblyName childName in currentAssembly.GetReferencedAssemblies())
                {
                    try
                    {
                        Assembly child = Assembly.Load(childName);
                        if (!scannedAssemblies.Contains(child.FullName))
                        {
                            assembliesToScan.Push(child);
                        }
                    }
                    catch (FileLoadException e)
                    {
                        warningLog.Add("Unable to load DLL [{0}] with exception: [{1}]", childName, e);
                    }
                    catch (FileNotFoundException e)
                    {
                        warningLog.Add("Could not find DLL [{0}] with exception: [{1}]", childName, e);
                    }
                    catch (BadImageFormatException e)
                    {
                        warningLog.Add("Unable to load DLL [{0}] with exception: [{1}]", childName, e);
                    }
                }

                Type[] currentAssemblyTypes = null;
                try
                {
                    currentAssemblyTypes = currentAssembly.GetTypes();
                }
                catch (ReflectionTypeLoadException e)
                {
                    warningLog.Add("Unable to retrieve types for DLL [{0}] with exception: [{1}]", currentAssembly.FullName, e);
                    continue;
                }
                Assertions.IsNotNull(currentAssemblyTypes, "currentAssemblyTypes cannot be null.");

                foreach (Type type in currentAssemblyTypes)
                {
                    foreach (FieldInfo field in type.GetFields(FieldBindingFlags))
                    {
                        ArgAttribute arg = field.GetCustomAttribute<ArgAttribute>();
                        if (arg != null)
                        {
                            object defaultValue = field.GetValue(type);
                            ArgInstance argInstance = new ArgInstance(arg, field, type, type, defaultValue);
                            args.Add(argInstance);
                            if (argInstance.Arg.AllowedValues != null &&
                                argInstance.Arg.AllowedValues.GetType().Equals(field.FieldType))
                            {
                                errorLog.Add(
                                    "The Type [{0}] of AllowedValues for Arg [{1}] does not match its original Type [{2}].",
                                    argInstance.Arg.AllowedValues.GetType().Name,
                                    argInstance.FullName,
                                    field.FieldType.Name);
                            }
                        }
                    }
                }
            }

            args = ClearDuplicates(args);
            return new FindResult(args, errorLog, warningLog);
        }
Beispiel #4
0
 private void SetArgInstanceValueOrAddError(ArgInstance instance, List<string> values, ExecutionLog errorLog)
 {
     Type fieldType = instance.Field.FieldType;
     if (fieldType.IsArray)
     {
         instance.Field.SetValue(instance.ParentObject, CreateFieldValueForArray(fieldType, values));
     }
     else
     {
         if (values.Count == 1)
         {
             instance.Field.SetValue(instance.ParentObject, CreateFieldValue(fieldType, values[0]));
         }
         else
         {
             errorLog.Add("Multiple values passed for argument [{0}]. Values are [{1}].",
                 instance.FullName,
                 string.Join(", ", values));
         }
     }
 }