lib/lower_level/barcode.ex

defmodule Passbook.LowerLevel.Barcode do
  @moduledoc """
  Information about a location beacon.

  Available in iOS 7.0.
  """

  defstruct [:format, :message, message_encoding: "iso-8859-1", alt_text: nil]

  @type barcode_format :: :qr | :pdf_417 | :aztec | :code_128

  @type t() :: %__MODULE__{
          format: barcode_format,
          message: String.t(),
          message_encoding: String.t(),
          alt_text: String.t() | nil
        }

  defimpl Jason.Encoder do
    @format_mapping [
      qr: "PKBarcodeFormatQR",
      pdf_417: "PKBarcodeFormatPDF417",
      aztec: "PKBarcodeFormatAztec",
      code_128: "PKBarcodeFormatCode128"
    ]
    def encode(struct, opts) do
      Jason.Encode.map(
        %{
          struct
          | format: @format_mapping[struct.format]
        },
        opts
      )
    end
  end
end