lib/sptfy/object/full_track.ex

defmodule Sptfy.Object.FullTrack do
  @moduledoc """
  Module for track (full) struct.
  """

  use Sptfy.Object

  alias Sptfy.Object.{SimplifiedAlbum, SimplifiedArtist, TrackLink, TrackRestriction}

  defstruct ~w[
    album
    artists
    available_markets
    disc_number
    duration_ms
    explicit
    external_ids
    external_urls
    href
    id
    is_playable
    linked_from
    restrictions
    name
    popularity
    preview_url
    track_number
    type
    uri
    is_local
  ]a

  def new(fields) do
    fields =
      fields
      |> Helpers.atomize_keys()
      |> Map.update(:album, nil, &SimplifiedAlbum.new/1)
      |> Map.update(:artists, [], fn artists -> Enum.map(artists, &SimplifiedArtist.new/1) end)
      |> Map.update(:linked_from, nil, &TrackLink.new/1)
      |> Map.update(:restrictions, nil, &TrackRestriction.new/1)

    struct(__MODULE__, fields)
  end
end