livebook/lib/livebook/file_systems.ex

64 lines
1.8 KiB
Elixir

defmodule Livebook.FileSystems do
alias Livebook.FileSystem
@doc """
Returns the type identifier for the given file system.
"""
@spec type(FileSystem.t()) :: String.t()
def type(%module{}), do: module_to_type(module)
@doc """
Updates file system with the given changes.
"""
@spec update_file_system(FileSystem.t(), map()) ::
{:ok, FileSystem.t()} | {:error, Ecto.Changeset.t()}
def update_file_system(file_system, attrs) do
file_system
|> change_file_system(attrs)
|> Ecto.Changeset.apply_action(:update)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking file system changes.
"""
@spec change_file_system(FileSystem.t()) :: Ecto.Changeset.t()
def change_file_system(file_system) do
change_file_system(file_system, %{})
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking file system changes.
"""
@spec change_file_system(FileSystem.t(), map()) :: Ecto.Changeset.t()
def change_file_system(%FileSystem.S3{} = file_system, attrs) do
FileSystem.S3.change_file_system(file_system, attrs)
end
@doc """
Loads the file system from given type and dumped data.
"""
@spec load(String.t(), map()) :: FileSystem.t()
def load(type, dumped_data) do
type
|> type_to_module()
|> struct!()
|> FileSystem.load(dumped_data)
end
@doc """
Returns file system module corresponding to the given type.
"""
@spec type_to_module(String.t()) :: module()
def type_to_module(type)
def type_to_module("local"), do: FileSystem.Local
def type_to_module("s3"), do: FileSystem.S3
@doc """
Returns a serializable type for corresponding to the given file
system module.
"""
@spec module_to_type(module()) :: String.t()
def module_to_type(module)
def module_to_type(FileSystem.Local), do: "local"
def module_to_type(FileSystem.S3), do: "s3"
end