lib/exiffer/binary/rewrite.ex

defmodule Exiffer.Binary.Rewrite do
  @moduledoc """
  Rewrite an image file, adding and removing arbitrary metadata
  """

  alias Exiffer.Binary.Buffer
  alias Exiffer.{GPS, JPEG, Rewrite}

  def set_gps(source, %{longitude: longitude, latitude: latitude, altitude: altitude}) when is_binary(source) do
    input = Buffer.new(source)

    gps = %GPS{longitude: longitude, latitude: latitude, altitude: altitude}

    {:ok, metadata, input} = Rewrite.set_gps(input, gps)

    header_binary = Exiffer.Serialize.binary(metadata)
    remainder = input.size - input.position
    <<_before::binary-size(input.position), rest::binary-size(remainder)>> = input.original

    <<
      JPEG.magic()::binary(),
      header_binary::binary(),
      rest::binary()
    >>
  end
end