lib/geo/wkt.ex

defmodule Geo.WKT do
  @moduledoc """
  Converts to and from WKT and EWKT

  ## Examples

      iex> {:ok, point} = Geo.WKT.decode("POINT(30 -90)")
      Geo.Point[coordinates: {30, -90}, srid: nil]

      iex> Geo.WKT.encode!(point)
      "POINT(30 -90)"

      iex> point = Geo.WKT.decode!("SRID=4326;POINT(30 -90)")
      Geo.Point[coordinates: {30, -90}, srid: 4326]

  """

  alias Geo.WKT.{Encoder, Decoder}

  @doc """
  Takes a Geometry and returns a WKT string.
  """
  @spec encode(Geo.geometry()) :: {:ok, binary} | {:error, Exception.t()}
  defdelegate encode(geom), to: Encoder

  @doc """
  Takes a Geometry and returns a WKT string.
  """
  @spec encode!(Geo.geometry()) :: binary
  defdelegate encode!(geom), to: Encoder

  @doc """
  Takes a WKT string and returns a Geo.geometry struct or list of Geo.geometry.
  """
  @spec decode(binary) :: {:ok, Geo.geometry()} | {:error, Exception.t()}
  defdelegate decode(wkt), to: Decoder

  @doc """
  Takes a WKT string and returns a Geo.geometry struct or list of Geo.geometry.
  """
  @spec decode!(binary) :: Geo.geometry()
  defdelegate decode!(wkt), to: Decoder
end