Packages
livebook
0.5.2
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook/users/user.ex
defmodule Livebook.Users.User do
@moduledoc false
# Represents a Livebook user.
#
# Livebook users are not regular web app accounts,
# but rather ephemeral data about the clients
# using the app. Every person using Livebook
# can provide data like name and cursor color
# to improve visibility during collaboration.
defstruct [:id, :name, :hex_color]
alias Livebook.Utils
@type t :: %__MODULE__{
id: id(),
name: String.t() | nil,
hex_color: hex_color()
}
@type id :: Utils.id()
@type hex_color :: String.t()
@doc """
Generates a new user.
"""
@spec new() :: t()
def new() do
%__MODULE__{
id: Utils.random_id(),
name: nil,
hex_color: random_hex_color()
}
end
@doc """
Validates `attrs` and returns an updated user.
In case of validation errors `{:error, errors, user}` tuple
is returned, where `user` is partially updated by using
only the valid attributes.
"""
@spec change(t(), %{binary() => any()}) ::
{:ok, t()} | {:error, list({atom(), String.t()}), t()}
def change(user, attrs \\ %{}) do
{user, []}
|> change_name(attrs)
|> change_hex_color(attrs)
|> case do
{user, []} -> {:ok, user}
{user, errors} -> {:error, errors, user}
end
end
defp change_name({user, errors}, %{"name" => ""}) do
{%{user | name: nil}, errors}
end
defp change_name({user, errors}, %{"name" => name}) do
{%{user | name: name}, errors}
end
defp change_name({user, errors}, _attrs), do: {user, errors}
defp change_hex_color({user, errors}, %{"hex_color" => hex_color}) do
if Utils.valid_hex_color?(hex_color) do
{%{user | hex_color: hex_color}, errors}
else
{user, [{:hex_color, "not a valid color"} | errors]}
end
end
defp change_hex_color({user, errors}, _attrs), do: {user, errors}
@doc """
Returns a random hex color for a user.
## Options
* `:except` - a list of colors to omit
"""
def random_hex_color(opts \\ []) do
colors = [
# red
"#F87171",
# yellow
"#FBBF24",
# green
"#6EE7B7",
# blue
"#60A5FA",
# purple
"#A78BFA",
# pink
"#F472B6",
# salmon
"#FA8072",
# mat green
"#9ED9CC"
]
except = opts[:except] || []
colors = colors -- except
Enum.random(colors)
end
end