コード例 #1
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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);
        }
コード例 #2
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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());
        }
コード例 #3
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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);
        }
コード例 #4
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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);
        }
コード例 #5
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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);
        }
コード例 #6
0
ファイル: Shell.cs プロジェクト: IanusInferus/typemake
        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);
        }