Add Asset.Transform module

Allows building URLs with embedded transformation options
This commit is contained in:
Claudio Ortolina
2025-09-17 09:33:13 +03:00
parent d932498c11
commit dc9c8fca8e
2 changed files with 44 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
defmodule MusicLibrary.Assets.Transform do
@derive JSON.Encoder
defstruct [:hash, :width]
@type t :: %__MODULE__{}
@type payload :: String.t()
@doc """
iex> alias MusicLibrary.Assets.Transform
iex> transform = %Transform{hash: "abc123", width: 300}
iex> Transform.encode!(transform)
"eyJoYXNoIjoiYWJjMTIzIiwid2lkdGgiOjMwMH0"
"""
@spec encode!(t()) :: payload()
def encode!(transform) do
transform
|> JSON.encode!()
|> Base.url_encode64(padding: false)
end
@doc """
iex> alias MusicLibrary.Assets.Transform
iex> payload = "eyJoYXNoIjoiYWJjMTIzIiwid2lkdGgiOjMwMH0"
iex> Transform.decode!(payload)
%Transform{hash: "abc123", width: 300}
"""
@spec decode!(payload()) :: t()
def decode!(payload) do
params =
payload
|> Base.url_decode64!(padding: false)
|> JSON.decode!()
struct!(__MODULE__, %{
hash: params["hash"],
width: params["width"]
})
end
end
@@ -0,0 +1,5 @@
defmodule MusicLibrary.Assets.TransformTest do
use ExUnit.Case, async: true
doctest MusicLibrary.Assets.Transform
end