AnsiColorNameResolver.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using System.Collections.Immutable;
  2. using System.Diagnostics.CodeAnalysis;
  3. namespace Terminal.Gui.Drawing;
  4. /// <summary>
  5. /// Color name resolver for <see cref="ColorName16"/>.
  6. /// </summary>
  7. public class AnsiColorNameResolver : IColorNameResolver
  8. {
  9. private static readonly ImmutableArray<string> _ansiColorNames = ImmutableArray.Create (Enum.GetNames<ColorName16> ());
  10. /// <inheritdoc/>
  11. public IEnumerable<string> GetColorNames ()
  12. {
  13. return _ansiColorNames;
  14. }
  15. /// <inheritdoc/>
  16. public bool TryNameColor (Color color, [NotNullWhen (true)] out string? name)
  17. {
  18. if (Color.TryGetExactNamedColor16 (color, out ColorName16 colorName16))
  19. {
  20. name = Color16Name (colorName16);
  21. return true;
  22. }
  23. name = null;
  24. return false;
  25. }
  26. /// <inheritdoc/>
  27. public bool TryParseColor (ReadOnlySpan<char> name, out Color color)
  28. {
  29. if (Enum.TryParse (name, ignoreCase: true, out ColorName16 colorName16) &&
  30. // Any numerical value converts to undefined enum value.
  31. Enum.IsDefined (colorName16))
  32. {
  33. color = new Color (colorName16);
  34. return true;
  35. }
  36. color = default;
  37. return false;
  38. }
  39. private static string Color16Name (ColorName16 color16)
  40. {
  41. return color16 switch
  42. {
  43. ColorName16.Black => nameof (ColorName16.Black),
  44. ColorName16.Blue => nameof (ColorName16.Blue),
  45. ColorName16.Green => nameof (ColorName16.Green),
  46. ColorName16.Cyan => nameof (ColorName16.Cyan),
  47. ColorName16.Red => nameof (ColorName16.Red),
  48. ColorName16.Magenta => nameof (ColorName16.Magenta),
  49. ColorName16.Yellow => nameof (ColorName16.Yellow),
  50. ColorName16.Gray => nameof (ColorName16.Gray),
  51. ColorName16.DarkGray => nameof (ColorName16.DarkGray),
  52. ColorName16.BrightBlue => nameof (ColorName16.BrightBlue),
  53. ColorName16.BrightGreen => nameof (ColorName16.BrightGreen),
  54. ColorName16.BrightCyan => nameof (ColorName16.BrightCyan),
  55. ColorName16.BrightRed => nameof (ColorName16.BrightRed),
  56. ColorName16.BrightMagenta => nameof (ColorName16.BrightMagenta),
  57. ColorName16.BrightYellow => nameof (ColorName16.BrightYellow),
  58. ColorName16.White => nameof (ColorName16.White),
  59. _ => throw new NotSupportedException ($"ColorName16 '{color16}' is not supported.")
  60. };
  61. }
  62. }