public static String RequireEnvironmentVariableSelection(EnvironmentVariableMemory Memory, String Name, bool Quiet, HashSet <String> Selections, String DefaultValue = "", Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) { var InputDisplay = String.Join("|", Selections.Select(c => c.Equals(DefaultValue) ? "[" + c + "]" : c)); var Options = new EnvironmentVariableReadOptions { Quiet = Quiet, Suggester = GetCaseInsensitiveSelectionSuggester(Selections), Validator = v => new KeyValuePair <bool, String>(Selections.Contains(v), ""), PostMapper = v => Selections.First(Selection => Selections.Comparer.Equals(v, Selection)), DefaultValue = DefaultValue.ToString(), InputDisplay = InputDisplay }; if (OnOptionCustomization != null) { OnOptionCustomization(Options); } var s = RequireEnvironmentVariable(Memory, Name, Options); if (Memory.VariableSelections.ContainsKey(Name)) { Memory.VariableSelections[Name] = Selections.ToList(); } else { Memory.VariableSelections.Add(Name, Selections.ToList()); } return(s); }
public static List <String> RequireEnvironmentVariableMultipleSelection(EnvironmentVariableMemory Memory, String Name, bool Quiet, HashSet <String> Selections, HashSet <String> DefaultSelections = null, Func <List <String>, KeyValuePair <bool, String> > Validator = null, Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) { var InputDisplay = String.Join(" ", Selections.Select(v => (DefaultSelections != null) && DefaultSelections.Contains(v) ? "[" + v + "]" : v)); var Options = new EnvironmentVariableReadOptions { Quiet = Quiet, Suggester = GetCaseInsensitiveMultipleSelectionSuggester(Selections), Validator = v => { var Parts = v.Split(' ').Where(Part => Part != "").ToList(); var UnknownSelections = Parts.Where(Part => !Selections.Contains(Part)).ToList(); if (UnknownSelections.Count > 0) { return(new KeyValuePair <bool, String>(false, $"Unknown selection: {String.Join(" ", UnknownSelections)}.")); } var DuplicateSelections = Parts.GroupBy(Part => Part).Where(g => g.Count() > 1).Select(g => g.Key).ToList(); if (DuplicateSelections.Count > 0) { return(new KeyValuePair <bool, String>(false, $"Duplicate selection: {String.Join(" ", DuplicateSelections)}.")); } var Selected = new HashSet <String>(Parts, Selections.Comparer); if (Validator != null) { return(Validator(Selections.Where(Selection => Selected.Contains(Selection)).ToList())); } return(new KeyValuePair <bool, String>(true, "")); }, PostMapper = v => { var Selected = new HashSet <String>(v.Split(' ').Where(Part => Part != ""), Selections.Comparer); var Result = Selections.Where(Selection => Selected.Contains(Selection)).ToList(); return(String.Join(" ", Result)); }, DefaultValue = DefaultSelections != null?String.Join(" ", Selections.Intersect(DefaultSelections)) : "", InputDisplay = InputDisplay }; if (OnOptionCustomization != null) { OnOptionCustomization(Options); } var s = RequireEnvironmentVariable(Memory, Name, Options); if (Memory.VariableMultipleSelections.ContainsKey(Name)) { Memory.VariableMultipleSelections[Name] = Selections.ToList(); } else { Memory.VariableMultipleSelections.Add(Name, Selections.ToList()); } return(s.Split(' ').Where(Part => Part != "").ToList()); }
public static bool RequireEnvironmentVariableBoolean(EnvironmentVariableMemory Memory, String Name, bool Quiet, bool DefaultValue = false, Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) { var Selections = new List <bool> { false, true }; var InputDisplay = String.Join("|", Selections.Select(c => c.Equals(DefaultValue) ? "[" + c.ToString() + "]" : c.ToString())); bool Output = false; var Options = new EnvironmentVariableReadOptions { Quiet = Quiet, Suggester = GetCaseInsensitiveSelectionSuggester(new List <String> { "False", "True" }), Validator = v => { if (String.Equals(v, "False", StringComparison.OrdinalIgnoreCase)) { Output = false; return(new KeyValuePair <bool, String>(true, "")); } else if (String.Equals(v, "True", StringComparison.OrdinalIgnoreCase)) { Output = true; return(new KeyValuePair <bool, String>(true, "")); } else { return(new KeyValuePair <bool, String>(false, "")); } }, PostMapper = v => Output.ToString(), DefaultValue = DefaultValue.ToString(), InputDisplay = InputDisplay }; if (OnOptionCustomization != null) { OnOptionCustomization(Options); } var s = RequireEnvironmentVariable(Memory, Name, Options); return(Output); }
public static PathString RequireEnvironmentVariableDirectoryPath(EnvironmentVariableMemory Memory, String Name, bool Quiet, PathString DefaultValue = null, Func <PathString, KeyValuePair <bool, String> > Validator = null, Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) { Func <String, KeyValuePair <bool, String> > ValidatorWrapper = p => Validator(p); var Options = new EnvironmentVariableReadOptions { Quiet = Quiet, Suggester = GetPathSuggester(false, true, DefaultValue), Validator = Validator != null ? ValidatorWrapper : (p => Directory.Exists(p) ? new KeyValuePair <bool, String>(true, "") : new KeyValuePair <bool, String>(false, "Directory not found.")), PostMapper = p => p.AsPath().FullPath, DefaultValue = DefaultValue }; if (OnOptionCustomization != null) { OnOptionCustomization(Options); } var s = RequireEnvironmentVariable(Memory, Name, Options); return(s); }
public static T RequireEnvironmentVariableEnum <T>(EnvironmentVariableMemory Memory, String Name, bool Quiet, HashSet <T> Selections, T DefaultValue = default(T), Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) where T : struct { var InputDisplay = String.Join("|", Selections.Select(e => e.Equals(DefaultValue) ? "[" + e.ToString() + "]" : e.ToString())); T Output = default(T); var Options = new EnvironmentVariableReadOptions { Quiet = Quiet, Suggester = GetCaseInsensitiveSelectionSuggester(Selections.Select(e => e.ToString())), Validator = v => { T o; var b = Enum.TryParse <T>(v, true, out o); if (!Selections.Contains(o)) { return(new KeyValuePair <bool, String>(false, "")); } Output = o; return(new KeyValuePair <bool, String>(b, "")); }, PostMapper = v => Output.ToString(), DefaultValue = DefaultValue.ToString(), InputDisplay = InputDisplay }; if (OnOptionCustomization != null) { OnOptionCustomization(Options); } var s = RequireEnvironmentVariable(Memory, Name, Options); if (Memory.VariableSelections.ContainsKey(Name)) { Memory.VariableSelections[Name] = Selections.Select(v => v.ToString()).ToList(); } else { Memory.VariableSelections.Add(Name, Selections.Select(v => v.ToString()).ToList()); } return(Output); }
public static T RequireEnvironmentVariableEnum <T>(EnvironmentVariableMemory Memory, String Name, bool Quiet, T DefaultValue = default(T), Action <EnvironmentVariableReadOptions> OnOptionCustomization = null) where T : struct { return(RequireEnvironmentVariableEnum <T>(Memory, Name, Quiet, new HashSet <T>(Enum.GetValues(typeof(T)).Cast <T>()), DefaultValue, OnOptionCustomization)); }
public static String RequireEnvironmentVariable(EnvironmentVariableMemory Memory, String Name, EnvironmentVariableReadOptions Options) { var d = Options.InputDisplay ?? (!String.IsNullOrEmpty(Options.DefaultValue) ? "[" + Options.DefaultValue + "]" : ""); String v = null; if (Memory.Variables.ContainsKey(Name)) { v = Memory.Variables[Name]; } else { if (Memory.UseSystemEnvironmentVariable) { v = Environment.GetEnvironmentVariable(Name); if (v == "_EMPTY_") { v = ""; } } } if ((v == null) && Options.Quiet) { v = Options.DefaultValue; } if (v == null) { if (Options.Quiet) { throw new InvalidOperationException("Variable '" + Name + "' not exist."); } if (Options.OnInteraction != null) { Options.OnInteraction(); } var PromptText = "'" + Name + "' not exist. Input" + (d == "" ? "" : " " + d) + ": "; v = Options.IsPassword ? Terminal.ReadLinePassword(Options.ForegroundColor, PromptText, Options.EnableCancellation) : Terminal.ReadLineWithSuggestion(Options.ForegroundColor, PromptText, Options.Suggester, Options.EnableCancellation); if (v == "") { v = Options.DefaultValue ?? ""; } } while (true) { if (Options.Validator == null) { break; } var ValidationResult = Options.Validator(v); if (ValidationResult.Key) { break; } var ValidationMessage = ValidationResult.Value == "" ? "Variable '" + Name + "' invalid." : "Variable '" + Name + "' invalid. " + ValidationResult.Value; if (Options.Quiet) { throw new InvalidOperationException(ValidationMessage); } if (Options.OnInteraction != null) { Options.OnInteraction(); } var PromptText = ValidationMessage + " Input" + (d == "" ? "" : " " + d) + ": "; v = Options.IsPassword ? Terminal.ReadLinePassword(Options.ForegroundColor, PromptText, Options.EnableCancellation) : Terminal.ReadLineWithSuggestion(Options.ForegroundColor, PromptText, Options.Suggester, Options.EnableCancellation); if (v == "") { v = Options.DefaultValue ?? ""; } } if (Options.PostMapper != null) { v = Options.PostMapper(v); } if (Options.IsPassword) { Terminal.WriteLine(Options.ForegroundColor, Name + "=[***]"); } else { Terminal.WriteLine(Options.ForegroundColor, Name + "=" + v); } Memory.Variables[Name] = v == "" ? "_EMPTY_" : v; return(v); }