diff --git a/Sharprompt/Forms/ListForm.cs b/Sharprompt/Forms/ListForm.cs index 80c40a3..acf46f6 100644 --- a/Sharprompt/Forms/ListForm.cs +++ b/Sharprompt/Forms/ListForm.cs @@ -12,6 +12,16 @@ internal class ListForm : FormBase> { public ListForm(ListOptions options) { + if (options.Minimum < 0) + { + throw new ArgumentOutOfRangeException(nameof(options.Minimum), $"The minimum ({options.Minimum}) is not valid"); + } + + if (options.Maximum < options.Minimum) + { + throw new ArgumentException($"The maximum ({options.Maximum}) is not valid when minimum is set to ({options.Minimum})", nameof(options.Maximum)); + } + _options = options; _inputItems.AddRange(options.DefaultValues ?? Enumerable.Empty()); diff --git a/Sharprompt/Forms/MultiSelectForm.cs b/Sharprompt/Forms/MultiSelectForm.cs index 3976c85..73bf84a 100644 --- a/Sharprompt/Forms/MultiSelectForm.cs +++ b/Sharprompt/Forms/MultiSelectForm.cs @@ -13,7 +13,6 @@ internal class MultiSelectForm : FormBase> public MultiSelectForm(MultiSelectOptions options) : base(false) { - // throw early when invalid options are passed if (options.Minimum < 0) { throw new ArgumentOutOfRangeException(nameof(options.Minimum), $"The minimum ({options.Minimum}) is not valid"); @@ -62,7 +61,14 @@ protected override bool TryGetResult(out IEnumerable result) } else { - _selectedItems.Add(currentItem); + if (_selectedItems.Count >= _options.Maximum) + { + Renderer.SetValidationResult(new ValidationResult($"A maximum selection of {_options.Maximum} items is required")); + } + else + { + _selectedItems.Add(currentItem); + } } break; diff --git a/Sharprompt/Internal/EastAsianWidth.cs b/Sharprompt/Internal/EastAsianWidth.cs index 39f29ca..db419c2 100644 --- a/Sharprompt/Internal/EastAsianWidth.cs +++ b/Sharprompt/Internal/EastAsianWidth.cs @@ -34,9 +34,7 @@ private static bool IsFullWidth(int codePoint) continue; } - var end = range.Start + range.Count; - - if (codePoint > end) + if (codePoint > range.Start + range.Count) { left = middle + 1; diff --git a/Sharprompt/MultiSelectOptions.cs b/Sharprompt/MultiSelectOptions.cs index 00544c1..e68cff3 100644 --- a/Sharprompt/MultiSelectOptions.cs +++ b/Sharprompt/MultiSelectOptions.cs @@ -13,7 +13,7 @@ public class MultiSelectOptions public int? PageSize { get; set; } - public int Minimum { get; set; } = 0; + public int Minimum { get; set; } = 1; public int Maximum { get; set; } = int.MaxValue; diff --git a/Sharprompt/Prompt.Basic.cs b/Sharprompt/Prompt.Basic.cs index f6edc86..e42946e 100644 --- a/Sharprompt/Prompt.Basic.cs +++ b/Sharprompt/Prompt.Basic.cs @@ -178,6 +178,8 @@ public static IEnumerable MultiSelect(string message, int? pageSize = null Items = items, DefaultValues = defaultValues?.Select(x => (EnumValue)x), PageSize = pageSize, + Minimum = minimum, + Maximum = maximum, TextSelector = x => x.DisplayName }; @@ -192,6 +194,8 @@ public static IEnumerable MultiSelect(string message, IEnumerable items Items = items, DefaultValues = defaultValues, PageSize = pageSize, + Minimum = minimum, + Maximum = maximum, TextSelector = x => x.ToString() };