package gs.std.v0.core

import java.nio.charset.Charset
import java.nio.charset.StandardCharsets

/** Interface for byte encoding to String formats.
  */
trait Encoder[+A <: EncodedString]:
  /** Encode an array of bytes as a string.
    *
    * @param input
    *   The bytes to encode.
    * @return
    *   The encoded string.
    */
  def encode(input: Array[Byte]): A

  /** Encode an immutable array of bytes as a string.
    *
    * @param input
    *   The bytes to encode.
    * @return
    *   The encoded string.
    */
  def encode(input: Vector[Byte]): A

  /** Encode a string as a string.
    *
    * @param input
    *   The string to encode.
    * @param charset
    *   The character set of the input string.
    * @return
    *   The encoded string.
    */
  def encode(
    input: String,
    charset: Charset = StandardCharsets.UTF_8
  ): A = encode(input.getBytes(charset))

object Encoder:

  /** @return
    *   The [[Base64Encoder]], typed to `Encoder[Encoded]`.
    */
  def base64(): Encoder[EncodedString] = Base64Encoder

  /** @return
    *   The [[HexEncoder]], typed to `Encoder[Encoded]`.
    */
  def hex(): Encoder[EncodedString] = HexEncoder

end Encoder
