AcceptableValueList.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Linq;
  3. namespace BepInEx.Configuration
  4. {
  5. /// <summary>
  6. /// Specify the list of acceptable values for a setting.
  7. /// </summary>
  8. public sealed class AcceptableValueList<T> : AcceptableValueBase where T : IEquatable<T>
  9. {
  10. /// <summary>
  11. /// List of values that a setting can take.
  12. /// </summary>
  13. public T[] AcceptableValues { get; }
  14. /// <summary>
  15. /// Specify the list of acceptable values for a setting.
  16. /// If the setting does not equal any of the values, it will be set to the first one.
  17. /// </summary>
  18. public AcceptableValueList(params T[] acceptableValues) : base(typeof(T))
  19. {
  20. if (acceptableValues == null) throw new ArgumentNullException(nameof(acceptableValues));
  21. if (acceptableValues.Length == 0) throw new ArgumentException("At least one acceptable value is needed", nameof(acceptableValues));
  22. AcceptableValues = acceptableValues;
  23. }
  24. /// <inheritdoc />
  25. public override object Clamp(object value)
  26. {
  27. if (IsValid(value))
  28. return value;
  29. return AcceptableValues[0];
  30. }
  31. /// <inheritdoc />
  32. public override bool IsValid(object value)
  33. {
  34. return value is T v && AcceptableValues.Any(x => x.Equals(v));
  35. }
  36. /// <inheritdoc />
  37. public override string ToSerializedString()
  38. {
  39. return "# Acceptable values: " + string.Join(", ", AcceptableValues.Select(x => x.ToString()).ToArray());
  40. }
  41. }
  42. }