Packages
electric_client
0.1.0-dev
0.10.3
0.10.2
0.10.1
0.10.1-beta-1
0.10.0
0.9.5-beta-1
0.9.4
0.9.4-beta-1
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.3-beta-1
0.8.2
0.8.1
0.8.0
0.8.0-beta-1
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.5-beta-5
0.6.5-beta-4
0.6.5-beta-3
0.6.5-beta-2
0.6.5-beta-1
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.5.0-beta-1
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.3.0-beta.4
0.3.0-beta.3
0.3.0-beta.2
0.2.6-pre-1
retired
0.2.6-beta.1
0.2.6-beta.0
0.2.5
0.2.4
0.2.4-pre-8
0.2.4-pre-7
0.2.4-pre-6
0.2.4-pre-5
0.2.4-pre-4
0.2.4-pre-3
0.2.4-pre-2
0.2.4-pre-1
0.2.3
0.2.3-rc-1
0.2.2
0.2.2-rc-1
0.2.1
0.2.1-rc-3
0.2.1-rc-2
0.2.1-rc-1
0.2.0
0.1.2
0.1.1
0.1.0
0.1.0-dev-9
0.1.0-dev-8
0.1.0-dev-7
0.1.0-dev-6
0.1.0-dev-5
0.1.0-dev-4
0.1.0-dev-3
0.1.0-dev-2
0.1.0-dev-17
0.1.0-dev-16
0.1.0-dev-15
0.1.0-dev-14
0.1.0-dev-13
0.1.0-dev-12
0.1.0-dev-11
0.1.0-dev-10
0.1.0-dev
Elixir client for ElectricSQL
Current section
Files
Jump to
Current section
Files
lib/electric/client/shape_definition.ex
defmodule Electric.Client.ShapeDefinition do
@moduledoc """
Struct for defining a shape.
iex> ShapeDefinition.new("items", where: "something = true")
%ShapeDefinition{table: "items", where: "something = true"}
"""
@enforce_keys [:table]
defstruct [:namespace, :table, :where]
@schema NimbleOptions.new!(
where: [
type: {:or, [nil, :string]},
required: false,
default: nil,
doc: "Filter the table according to the where clause."
],
namespace: [
type: {:or, [nil, :string]},
required: false,
default: nil,
doc:
"The namespace the table belongs to. If `nil` then Postgres will use whatever schema is the default (usually `public`)."
]
)
@type t :: %__MODULE__{
namespace: String.t() | nil,
table: String.t(),
where: nil | String.t()
}
@type option :: unquote(NimbleOptions.option_typespec(@schema))
@type options :: [option()]
@quot "%22"
@spec new(String.t(), options()) :: t()
@doc """
Create a `ShapeDefinition` for the given `table_name`.
## Options
#{NimbleOptions.docs(@schema)}
"""
def new(table_name, opts \\ []) do
opts = NimbleOptions.validate!(opts, @schema)
%__MODULE__{
table: table_name,
where: Keyword.get(opts, :where),
namespace: Keyword.get(opts, :namespace)
}
end
@doc """
Return a string representation of the shape's table, quoted for use in API URLs.
iex> ShapeDefinition.url_table_name(ShapeDefinition.new("my_table"))
"my_table"
iex> ShapeDefinition.url_table_name(ShapeDefinition.new("my_table", namespace: "my_app"))
"my_app.my_table"
iex> ShapeDefinition.url_table_name(ShapeDefinition.new("my table", namespace: "my app"))
"%22my app%22.%22my table%22"
"""
@spec url_table_name(t()) :: String.t()
def url_table_name(%__MODULE__{namespace: nil, table: name}) do
safe_url_name(name)
end
def url_table_name(%__MODULE__{namespace: namespace, table: name}) do
IO.iodata_to_binary([safe_url_name(namespace), ".", safe_url_name(name)])
end
defp safe_url_name(name) do
if name =~ ~r/^[a-z0-9_]+$/ do
name
else
quote_table_name(name)
end
end
defp quote_table_name(name) do
IO.iodata_to_binary([
@quot,
:binary.replace(name, ~s["], ~s[#{@quot}#{@quot}], [:global]),
@quot
])
end
end