lib/api2pdf/model/api_success_response.ex

defmodule Api2pdf.Model.ApiSuccessResponse do
  @moduledoc """
  https://app.swaggerhub.com/apis-docs/api2pdf/api2pdf/2.0.0#/ApiResponseSuccess
  """
  defstruct [
    :FileUrl,
    :MbOut,
    :Cost,
    :Success,
    :ResponseId,
    :Seconds,
    :Error
  ]

  @type t :: %__MODULE__{
          FileUrl: String.t(),
          MbOut: number,
          Cost: number,
          Success: boolean,
          ResponseId: String.t(),
          Seconds: number,
          Error: String.t()
        }

  @doc """
  Convert body from map to `Api2pdf.Model.ApiSuccessResponse` struct.
  """
  @spec from_body(map) :: __MODULE__.t()
  def from_body(body) do
    # remove atom :__struct__ from keys
    keys = Map.keys(%__MODULE__{}) |> Enum.reject(fn i -> i == :__struct__ end)
    # read values from map and assign it to the struct
    Enum.reduce(keys, %__MODULE__{}, fn field, acc ->
      case Map.fetch(body, Atom.to_string(field)) do
        {:ok, value} -> Map.put(acc, field, value)
        _ -> acc
      end
    end)
  end
end