![defmodule FloatsAsDecimalsJSON do @behaviour Tesla.Middleware # Create a wrapper struct defstruct [:decimal] # and implement Jason.Encoder to output decimal as number defimpl Jason.Encoder do # output string, but without quotes def encode(%{decimal: decimal}, _opts), do: Decimal.to_string(decimal, :normal) end @json_opts [engine: Jason, engine_opts: [floats: :decimals]] def call(env, next, opts) do opts = Keyword.merge(env.opts, opts) # 1. Wrap Decimals into struct with {:ok, env} <- encode(env), # 2. Encode request body with JSON middleware {:ok, env} <- Tesla.Middleware.JSON.encode(env, @json_opts ++ opts), # 3. Perform the request {:ok, env} <- Tesla.run(env, next), # 4. Decode response body with JSON middleware {:ok, env} <- Tesla.Middleware.JSON.decode(env, @json_opts ++ opts) do {:ok, env} end end defp encode(%Tesla.Env{body: body} = env), do: {:ok, %{env | body: encode(bo](https://pbs.twimg.com/media/FukvBRXXwAEo5Mp.jpg?name=small&format=webp)
ALT defmodule FloatsAsDecimalsJSON do @behaviour Tesla.Middleware # Create a wrapper struct defstruct [:decimal] # and implement Jason.Encoder to output decimal as number defimpl Jason.Encoder do # output string, but without quotes def encode(%{decimal: decimal}, _opts), do: Decimal.to_string(decimal, :normal) end @json_opts [engine: Jason, engine_opts: [floats: :decimals]] def call(env, next, opts) do opts = Keyword.merge(env.opts, opts) # 1. Wrap Decimals into struct with {:ok, env} <- encode(env), # 2. Encode request body with JSON middleware {:ok, env} <- Tesla.Middleware.JSON.encode(env, @json_opts ++ opts), # 3. Perform the request {:ok, env} <- Tesla.run(env, next), # 4. Decode response body with JSON middleware {:ok, env} <- Tesla.Middleware.JSON.decode(env, @json_opts ++ opts) do {:ok, env} end end defp encode(%Tesla.Env{body: body} = env), do: {:ok, %{env | body: encode(bo





![defmodule GoodClient3 do use Tesla plug Tesla.Middleware.BaseUrl, "http://example.com" plug Tesla.Middleware.JSON, engine: Jason, engine_opts: [floats: :decimals] def bid(price) do post("/bid", %{price: price}) end end](https://pbs.twimg.com/media/FukuCaeXwAwfqId.jpg?name=small&format=webp)


![defmodule GoodClient2 do use Tesla plug Tesla.Middleware.BaseUrl, "http://example.com" # Configure Jason to parse floats as decimals plug Tesla.Middleware.JSON, engine: Jason, engine_opts: [floats: :decimals] def price() do get("/price") end end](https://pbs.twimg.com/media/FukuBocXwAAsTMX.jpg?name=small&format=webp)





