private static void TryInjectValueInteractive(MemberInfo member, NukeBuild build) { if (!member.HasCustomAttribute <ParameterAttribute>()) { return; } if (member is PropertyInfo property && !property.CanWrite) { return; } var memberType = member.GetMemberType(); var nameOrDescription = ParameterService.GetParameterDescription(member) ?? ParameterService.GetParameterMemberName(member); var text = $"{nameOrDescription.TrimEnd('.')}:"; while (member.GetValue(build) == null) { var valueSet = ParameterService.GetParameterValueSet(member, build); var value = valueSet == null ? ConsoleUtility.PromptForInput(text, defaultValue : null) : ConsoleUtility.PromptForChoice(text, valueSet.Select(x => (x.Object, x.Text)).ToArray()); member.SetValue(build, ReflectionService.Convert(value, memberType)); } }
public static string GetParametersText(NukeBuild build) { var defaultTarget = build.ExecutableTargets.SingleOrDefault(x => x.IsDefault); var builder = new StringBuilder(); var parameters = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: false) .OrderBy(x => x.Name).ToList(); var padRightParameter = Math.Max(parameters.Max(x => x.Name.Length), val2: 16); void PrintParameter(MemberInfo parameter) { var description = SplitLines( // TODO: remove ParameterService.GetParameterDescription(parameter) ?.Replace("{default_target}", defaultTarget?.Name).Append(".") ?? "<no description>"); var parameterName = ParameterService.GetParameterDashedName(parameter); builder.AppendLine($" --{parameterName.PadRight(padRightParameter)} {description.First()}"); foreach (var line in description.Skip(count: 1)) { builder.AppendLine($"{new string(c: ' ', count: padRightParameter + 6)}{line}"); } } builder.AppendLine("Parameters:"); var customParameters = parameters.Where(x => x.DeclaringType != typeof(NukeBuild)).ToList(); if (customParameters.Count > 0) { builder.AppendLine(); } foreach (var parameter in customParameters) { PrintParameter(parameter); } builder.AppendLine(); var inheritedParameters = parameters.Where(x => x.DeclaringType == typeof(NukeBuild)); foreach (var parameter in inheritedParameters) { PrintParameter(parameter); } return(builder.ToString()); }
private static void InjectValueInteractive(NukeBuild build, MemberInfo member) { var memberType = member.GetMemberType(); var nameOrDescription = ParameterService.GetParameterDescription(member) ?? ParameterService.GetParameterMemberName(member); var text = $"{nameOrDescription.TrimEnd('.')}:"; while (member.GetValue(build) == null) { var valueSet = ParameterService.GetParameterValueSet(member, build); var value = valueSet == null ? ConsoleUtility.PromptForInput(text, defaultValue : null) : ConsoleUtility.PromptForChoice(text, valueSet.Select(x => (x.Object, x.Text)).ToArray()); member.SetValue(build, ReflectionService.Convert(value, memberType)); } }
// ReSharper disable once CognitiveComplexity public static JObject GetBuildSchema(NukeBuild build) { var parameters = ValueInjectionUtility .GetParameterMembers(build.GetType(), includeUnlisted: true) // .Where(x => x.DeclaringType != typeof(NukeBuild)) .Select(x => new { Name = ParameterService.GetParameterMemberName(x), Description = ParameterService.GetParameterDescription(x), MemberType = x.GetMemberType(), ScalarType = x.GetMemberType().GetScalarType(), EnumValues = ParameterService.GetParameterValueSet(x, build)?.Select(x => x.Text), IsRequired = x.HasCustomAttribute <RequiredAttribute>(), IsSecret = x.HasCustomAttribute <SecretAttribute>() }).ToList(); string GetJsonType(Type type) => type.IsCollectionLike() ? "array" : type.GetScalarType() == typeof(int) ? "integer" : type.GetScalarType() == typeof(bool) ? "boolean" : "string"; var schema = JObject.Parse(@" { ""$schema"": ""http://json-schema.org/draft-04/schema#"", ""title"": ""Build Schema"", ""$ref"": ""#/definitions/build"", ""definitions"": { ""build"": { ""type"": ""object"", ""properties"": { } } } } "); var properties = schema["definitions"].NotNull()["build"].NotNull()["properties"].NotNull(); foreach (var parameter in parameters) { var property = properties[parameter.Name] = new JObject(); property["type"] = GetJsonType(parameter.MemberType); if (parameter.Description != null) { property["description"] = parameter.Description; } if (parameter.IsSecret) { property["default"] = "Secrets must be entered via 'nuke :secrets [profile]'"; } if (parameter.EnumValues != null && !parameter.MemberType.IsCollectionLike()) { property["enum"] = new JArray(parameter.EnumValues); } if (parameter.MemberType.IsCollectionLike()) { property["items"] = new JObject(); property["items"].NotNull()["type"] = GetJsonType(parameter.ScalarType); if (parameter.EnumValues != null) { property["items"].NotNull()["enum"] = new JArray(parameter.EnumValues); } } } return(schema); }
public static string GetParametersText(NukeBuild build) { var defaultTargets = build.ExecutableTargets.Where(x => x.IsDefault).Select(x => x.Name).ToList(); var builder = new StringBuilder(); var parameters = ValueInjectionUtility.GetParameterMembers(build.GetType(), includeUnlisted: false); var padRightParameter = Math.Max(parameters.Max(x => ParameterService.GetParameterDashedName(x).Length), val2: 16); List <string> SplitLines(string text) { var words = new Queue <string>(text.Split(' ').ToList()); var lines = new List <string> { string.Empty }; foreach (var word in words) { var nextLength = padRightParameter + 6 + lines.Last().Length + word.Length; if (nextLength >= Console.BufferWidth || nextLength > 90) { lines.Add(string.Empty); } lines[lines.Count - 1] = $"{lines.Last()} {word}"; } return(lines); } void PrintParameter(MemberInfo parameter) { var description = SplitLines( // TODO: remove ParameterService.GetParameterDescription(parameter) ?.Replace("{default_target}", defaultTargets.Count > 0 ? defaultTargets.JoinCommaSpace() : "<none>") .TrimEnd(".").Append(".") ?? "<no description>"); var parameterName = ParameterService.GetParameterDashedName(parameter); builder.AppendLine($" --{parameterName.PadRight(padRightParameter)} {description.First()}"); foreach (var line in description.Skip(count: 1)) { builder.AppendLine($"{new string(c: ' ', count: padRightParameter + 6)}{line}"); } } builder.AppendLine("Parameters:"); var customParameters = parameters.Where(x => x.DeclaringType != typeof(NukeBuild)).ToList(); if (customParameters.Count > 0) { builder.AppendLine(); } foreach (var parameter in customParameters) { PrintParameter(parameter); } builder.AppendLine(); var inheritedParameters = parameters.Where(x => x.DeclaringType == typeof(NukeBuild)); foreach (var parameter in inheritedParameters) { PrintParameter(parameter); } return(builder.ToString()); }