lib/avatarex.ex

defmodule Avatarex do
  @moduledoc """
  `Avatarex` is inspired by Robohash: https://github.com/e1ven/Robohash

  Two Avatar sets are provided `Avatarex.Birdy` and `Avatarex.Kitty`

  """

  alias Avatarex.{Birdy, Kitty}

  @doc """
  Generates an avatar for a given name and Avatar type.
  Defaults to :kitty

  ## Examples

      iex> Avatarex.generate("oscar", :birdy)
      %Avatarex.Birdy{name: oscar}

  """
  def generate(name, set \\ :kitty) when set in [:kitty, :birdy] and is_binary(name) do
    case set do
      :birdy -> birdy(name)
      :kitty -> kitty(name)
    end
  end

  @doc """
  Generates an `AvatarexKitty` avatar constructed
  using the hash of the given name.

  ## Examples

      iex> Avatarex.kitty(name)
      %Avatarex.Kitty{name: name, ...}

  """
  def kitty(string) do
    kitty = string
    |> Kitty.generate()
    Kitty.render(kitty)
    kitty
  end

  @doc """
  Generates a random kitty avatar

  ## Examples

      iex> Avatarex.kitty()
      %Avatarex.Kitty{}

  """
  def kitty() do
    Kitty.random()
  end

  @doc """
  Generates an `AvatarexKitty` avatar constructed
  using the hash of the given name.

  ## Examples

      iex> Avatarex.birdy(name)
      %Avatarex.Birdy{name: name, ...}

  """
  def birdy(string) do
    birdy = string
    |> Birdy.generate()
    Birdy.render(birdy)
    birdy
  end

  @doc """
  Generates a random birdy avatar

  ## Examples

      iex> Avatarex.birdy()
      %Avatarex.Birdy{}

  """
  def birdy() do
    Birdy.random()
  end

  @doc """
  Generates a hash for a given string using sha512 from 
  Erlang's crypto module.

  ## Examples

      iex> Avatarex.hash("avatar_name")
      <<130, 249, 176, 138, 182, 111, 225, 152, 83, 237, ... >>

  """
  def hash(avatar_string) when is_binary(avatar_string) do
    :crypto.hash(:sha512, avatar_string) 
  end
end