livebook/lib/livebook_web/live/file_system_writer.ex

52 lines
1.4 KiB
Elixir

defmodule LivebookWeb.FileSystemWriter do
# Custom writer for live uploads, uploading directly using the
# `Livebook.FileSystem` abstraction.
#
# ## Options
#
# * `:file` (required) - `%Livebook.FileSystem.File{}` to upload
# the contents to
#
@behaviour Phoenix.LiveView.UploadWriter
alias Livebook.FileSystem
@impl true
def init(opts) do
file = Keyword.fetch!(opts, :file)
with {:ok, file_system} <- FileSystem.File.fetch_file_system(file),
{:ok, write_state} <- FileSystem.write_stream_init(file_system, file.path, []) do
{:ok, %{file: file, file_system: file_system, write_state: write_state}}
end
end
@impl true
def meta(state) do
%{file: state.file}
end
@impl true
def write_chunk(chunk, state) do
case FileSystem.write_stream_chunk(state.file_system, state.write_state, chunk) do
{:ok, write_state} -> {:ok, %{state | write_state: write_state}}
{:error, message} -> {:error, message, state}
end
end
@impl true
def close(state, :done) do
case FileSystem.write_stream_finish(state.file_system, state.write_state) do
:ok -> {:ok, state}
{:error, message} -> {:error, message}
end
end
def close(state, _reason) do
case FileSystem.write_stream_halt(state.file_system, state.write_state) do
:ok -> {:ok, state}
{:error, message} -> {:error, message}
end
end
end