lib/lti_1p3/claims/platform_instance.ex

defmodule Lti_1p3.Claims.PlatformInstance do
  @moduledoc """
  A struct representing the platform instance claim in an LTI 1.3 request.

  https://www.imsglobal.org/spec/lti/v1p3#platform-instance-claim
  """
  @enforce_keys [:guid]

  defstruct [
    :guid,
    :contact_email,
    :description,
    :name,
    :url,
    :product_family_code,
    :version
  ]

  @type t() :: %__MODULE__{
          guid: String.t(),
          contact_email: String.t(),
          description: String.t(),
          name: String.t(),
          url: String.t(),
          product_family_code: String.t(),
          version: String.t()
        }

  def key, do: "https://purl.imsglobal.org/spec/lti/claim/tool_platform"

  @doc """
  Create a new platform instance claim.
  """
  def platform_instance(guid, opts \\ []) do
    %__MODULE__{
      guid: guid,
      contact_email: Keyword.get(opts, :contact_email),
      description: Keyword.get(opts, :description),
      name: Keyword.get(opts, :name),
      url: Keyword.get(opts, :url),
      product_family_code: Keyword.get(opts, :product_family_code),
      version: Keyword.get(opts, :version)
    }
  end
end

defimpl Lti_1p3.Claims.Claim, for: Lti_1p3.Claims.PlatformInstance do
  def get_key(_), do: Lti_1p3.Claims.PlatformInstance.key()

  def get_value(%Lti_1p3.Claims.PlatformInstance{
        guid: guid,
        contact_email: contact_email,
        description: description,
        name: name,
        url: url,
        product_family_code: product_family_code,
        version: version
      }) do
    %{
      "guid" => guid,
      "contact_email" => contact_email,
      "description" => description,
      "name" => name,
      "url" => url,
      "product_family_code" => product_family_code,
      "version" => version
    }
  end
end