private/ConvertTo-GlyAnsiStyle.ps1

function ConvertTo-GlyAnsiStyle {
  param(
    [GlyStyle] $Style
  )

  if ($null -eq $Style) {
    return ''
  }

  if ($null -eq $script:GlyAnsiStyleCache) {
    $script:GlyAnsiStyleCache = @{}
  }

  $bold = $Style.Bold
  $italic = $Style.Italic
  $underline = $Style.Underline
  $foreground = $Style.Foreground
  $background = $Style.Background
  $cacheKey = "$bold|$italic|$underline|$foreground|$background"

  if ($script:GlyAnsiStyleCache.ContainsKey($cacheKey)) {
    return $script:GlyAnsiStyleCache[$cacheKey]
  }

  $codes = @()
  if ($bold) { $codes += '1' }
  if ($italic) { $codes += '3' }
  if ($underline) { $codes += '4' }

  foreach ($entry in @(
      @{ Color = $foreground; Prefix = '38' },
      @{ Color = $background; Prefix = '48' }
    )) {
    $color = $entry.Color
    if ($color -match '^#(?<r>[0-9a-fA-F]{2})(?<g>[0-9a-fA-F]{2})(?<b>[0-9a-fA-F]{2})$') {
      $r = [Convert]::ToInt32($Matches.r, 16)
      $g = [Convert]::ToInt32($Matches.g, 16)
      $b = [Convert]::ToInt32($Matches.b, 16)
      $codes += "$($entry.Prefix);2;$r;$g;$b"
    }
  }

  if ($codes.Count -eq 0) {
    $script:GlyAnsiStyleCache[$cacheKey] = ''
    return ''
  }

  $ansiStyle = "$([char]27)[$($codes -join ';')m"
  $script:GlyAnsiStyleCache[$cacheKey] = $ansiStyle
  return $ansiStyle
}