lib/exiffer/cli.ex

# bakeware is declared as an optional dependency in `mix.exs`.
# This allows use of exiffer **without** including bakeware.
# Here, we skip any use of Bakeware if it is not present.
if Code.ensure_loaded?(Bakeware.Script) do
  defmodule Exiffer.CLI do
    use Bakeware.Script

    alias Exiffer.CLI.{Read, SetGPS}

    @impl Bakeware.Script
    @spec main([String.t()]) :: 0 | 1
    def main([]) do
      IO.puts(:stderr, "Please supply a command")
      list_top_level_commands()
      1
    end

    @set_gps_switches [
      source: %{type: :string, required: true, short: :s, description: "Source image"},
      destination: %{type: :string, required: true, short: :d, description: "Destination image"},
      latitude: %{type: :float, required: true, short: :t, description: "Latitude"},
      longitude: %{type: :float, required: true, short: :n, description: "Longitude"},
      altitude: %{type: :float, short: :a, description: "Altitude"}
    ]
    def main(["set-gps" | rest]) do
      case HelpfulOptions.parse(rest, switches: @set_gps_switches) do
        {:ok, args, []} ->
          SetGPS.run(args)
          0

        {:error, error} ->
          IO.puts(:stderr, error)
          list_top_level_commands()
          1
      end
    end

    def main(["help", "set-gps"]) do
      switches = HelpfulOptions.help!(switches: @set_gps_switches)
      IO.puts(
        """
        NAME
          exiffer set-gps - set GPS coordinates in image metadata

        OPTIONS
        #{switches}
        """
      )
    end

    @read_switches [
      filename: %{type: :string, required: true, short: "f", description: "Image filename"},
      format: %{type: :string, short: :o, default: "text", description: "Output format ('text' or 'json')"},
      quiet: %{type: :boolean, short: :q, default: true, description: "Suppress output"}
    ]
    def main(["read" | rest]) do
      case HelpfulOptions.parse(rest, switches: @read_switches) do
        {:ok, args, []} ->
          Read.run(args)
          0

        {:error, error} ->
          IO.puts(:stderr, error)
          list_top_level_commands()
          1
      end
    end

    def main(["help", "read"]) do
      switches = HelpfulOptions.help!(switches: @read_switches)
      IO.puts(
        """
        NAME
          exiffer read - read image metadata

        OPTIONS
        #{switches}

        By default `--quiet` is set to `true` in order to not create confusing output.
        If you want logging output, pass the `--no-quiet` flag.
        """
      )
    end

    def main(["help" | _args]) do
      list_top_level_commands()
      0
    end

    def main(args) do
      IO.puts(:stderr, "Unrecognised subcommand: '#{Enum.join(args, " ")}'")
      1
    end

    defp list_top_level_commands do
      IO.puts("exiffer read|set-gps")
    end
  end
end