lib/exiffer/jpeg/header/APP1.ex

defmodule Exiffer.JPEG.Header.APP1 do
  @moduledoc """
  Documentation for `Exiffer.JPEG.Header.APP1`.
  """

  require Logger

  alias Exiffer.JPEG.Header.APP1.{EXIF, XMP, XMPExtension}
  import Exiffer.Logging, only: [integer: 1]

  @exif_header "Exif\0\0"
  @adobe_xmp_header "http://ns.adobe.com/xap/1.0/\0"
  @adobe_extended_xmp_header "http://ns.adobe.com/xmp/extension/\0"

  def new(%{data: <<0xff, 0xe1, _rest::binary>>} = buffer) do
    buffer = Exiffer.Buffer.skip(buffer, 2)
    case buffer.data do
      <<_length_bytes::binary-size(2), @exif_header::binary, _rest::binary>> ->
        Logger.debug("APP1 - found EXIF header")
        EXIF.new(buffer)
      <<_length_bytes::binary-size(2), @adobe_xmp_header::binary, _rest::binary>> ->
        XMP.new(buffer)
      <<_length_bytes::binary-size(2), @adobe_extended_xmp_header::binary, _rest::binary>> ->
        XMPExtension.new(buffer)
      _ ->
        chunk = Exiffer.Buffer.random(buffer, buffer.position + 2, 32)
        {:error, "Unknown APP1 segment at #{integer(buffer.position)}. Header: #{inspect(chunk, hex: true)}"}
    end
  end
end