Packages

Supplemental storages and uploads for use with Capsule

Current section

Files

Jump to
capsule_supplement lib supplement storages ram.ex
Raw

lib/supplement/storages/ram.ex

defmodule Capsule.Storages.RAM do
alias Capsule.{Storage, Upload}
@behaviour Storage
@impl Storage
def put(upload, _opts \\ []) do
with {:ok, contents} <- Upload.contents(upload),
{:ok, pid} <- StringIO.open(contents) do
serialized_pid =
pid
|> :erlang.term_to_binary()
|> Base.url_encode64()
{:ok, Path.join(serialized_pid, Upload.name(upload))}
end
end
@impl Storage
def delete(id, _opts \\ []) when is_binary(id) do
pid = decode_pid!(id)
case StringIO.close(pid) do
{:ok, _} -> :ok
error -> error
end
end
@impl Storage
def read(id, _opts \\ []),
do: {:ok, id |> decode_pid! |> StringIO.contents() |> elem(0)}
@impl Storage
def stream!(id, _opts \\ []) do
id
|> decode_pid!
|> IO.stream(:line)
end
defp decompose_id(id), do: String.split(id, "/", parts: 2)
defp decode_pid!(id) do
id
|> decompose_id
|> List.first()
|> Base.url_decode64!()
|> :erlang.binary_to_term()
end
end