/// Cast a JSON encoded string into a hsl(a) color
/// @access private
/// @param {String} $string - JSON string
/// @return {Color | String} - string or hsl(a) color, depending on the match
/// @require {function} _get-color-value
@function _from-hsl($string) {
  $frags: ();
  $string-lower: to-lower-case($string);
  $is-alpha: str-slice($string-lower, 4, 4) == 'a';
  $length: str-length($string);
  $start: str-index($string, "(");

  @for $i from $start through $length {
    $token: str-slice($string-lower, $i, $i);
    @if $token == ' ' or $token == "	" {
      // @continue;
    } @else if $token == '(' or $token == ',' {
      $frags: append($frags, "");
    } @else if $token == ')' {
      @if length($frags) != if($is-alpha, 4, 3) { @return $string; } // Parsing error
      $hue: _get-color-value(nth($frags, 1));
      $saturation: _get-color-value(nth($frags, 2));
      $lightness: _get-color-value(nth($frags, 3));

      @if not $hue or not $saturation or not $lightness {
        @return $string;
      }

      @if $is-alpha {
        @if length($frags) != 4 { @return $string; } // No alpha channel found
        $alpha: _get-color-value(nth($frags, 4));
        @if not $alpha { @return $string; } // Error parsing alpha channel
        @return hsla($hue, $saturation, $lightness, $alpha);
      }

      @return hsl($hue, $saturation, $lightness);
    } @else {
      $frags: set-nth($frags, length($frags), nth($frags, length($frags)) + $token);
    }
  }

  @return $string;
}
