Skip to content

Commit bcd071e

Browse files
committed
fix compilation warnings when electric not installed
1 parent 4f8d9e1 commit bcd071e

File tree

1 file changed

+118
-88
lines changed

1 file changed

+118
-88
lines changed

lib/phoenix/sync/electric.ex

Lines changed: 118 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ defmodule Phoenix.Sync.Electric do
140140
@doc false
141141
@impl Phoenix.Sync.Adapter
142142
def children(env, opts) do
143-
{mode, electric_opts} = electric_opts(opts)
143+
{mode, electric_opts} = electric_opts(env, opts)
144144

145145
case mode do
146146
:disabled ->
@@ -158,7 +158,7 @@ defmodule Phoenix.Sync.Electric do
158158
@doc false
159159
@impl Phoenix.Sync.Adapter
160160
def plug_opts(env, opts) do
161-
{mode, electric_opts} = electric_opts(opts)
161+
{mode, electric_opts} = electric_opts(env, opts)
162162
# don't need to validate the mode here -- it will have already been
163163
# validated by children/0 which is run at phoenix_sync startup before the
164164
# plug opts call even comes through
@@ -179,7 +179,7 @@ defmodule Phoenix.Sync.Electric do
179179
@doc false
180180
@impl Phoenix.Sync.Adapter
181181
def client(env, opts) do
182-
{mode, electric_opts} = electric_opts(opts)
182+
{mode, electric_opts} = electric_opts(env, opts)
183183

184184
case mode do
185185
mode when mode in @client_valid_modes ->
@@ -197,35 +197,29 @@ defmodule Phoenix.Sync.Electric do
197197
@electric_available?
198198
end
199199

200-
defp electric_opts(opts) do
200+
defp electric_opts(env, opts) do
201201
Keyword.pop_lazy(opts, :mode, fn ->
202-
if electric_available?() do
203-
Logger.warning([
204-
"missing mode configuration for :phoenix_sync. Electric is installed so assuming `embedded` mode"
205-
])
206-
207-
:embedded
208-
else
209-
Logger.warning("No `:mode` configuration for :phoenix_sync, assuming `:disabled`")
210-
211-
:disabled
212-
end
202+
default_mode(env)
213203
end)
214204
end
215205

216-
defp electric_api_server(opts) do
217-
config = electric_http_config(opts)
206+
defp default_mode(:test) do
207+
:disabled
208+
end
218209

219-
cond do
220-
Code.ensure_loaded?(Bandit) ->
221-
Electric.Application.api_server(Bandit, config)
210+
if @electric_available? do
211+
defp default_mode(_env) do
212+
Logger.warning([
213+
"missing mode configuration for :phoenix_sync. Electric is installed so assuming `embedded` mode"
214+
])
222215

223-
Code.ensure_loaded?(Plug.Cowboy) ->
224-
Electric.Application.api_server(Plug.Cowboy, config)
216+
:embedded
217+
end
218+
else
219+
defp default_mode(_env) do
220+
Logger.warning("No `:mode` configuration for :phoenix_sync, assuming `:disabled`")
225221

226-
true ->
227-
raise RuntimeError,
228-
message: "No HTTP server found. Please install either Bandit or Plug.Cowboy"
222+
:disabled
229223
end
230224
end
231225

@@ -236,15 +230,23 @@ defmodule Phoenix.Sync.Electric do
236230
end
237231
end
238232

239-
defp plug_opts(env, :embedded, electric_opts) do
240-
if electric_available?() do
241-
env
242-
|> core_configuration(electric_opts)
243-
|> Electric.Application.api_plug_opts()
244-
|> Keyword.fetch!(:api)
245-
else
246-
raise RuntimeError,
247-
message: "Configured for embedded mode but `:electric` dependency not installed"
233+
if @electric_available? do
234+
defp plug_opts(env, :embedded, electric_opts) do
235+
if electric_available?() do
236+
env
237+
|> core_configuration(electric_opts)
238+
|> Electric.Application.api_plug_opts()
239+
|> Keyword.fetch!(:api)
240+
else
241+
raise RuntimeError,
242+
message: "Configured for embedded mode but `:electric` dependency not installed"
243+
end
244+
end
245+
else
246+
defp plug_opts(_env, :embedded, _electric_opts) do
247+
raise ArgumentError,
248+
message:
249+
"phoenix_sync configured in `mode: :embedded` but electric not installed. Please add `:electric` to your dependencies or use `:http` mode."
248250
end
249251
end
250252

@@ -259,36 +261,71 @@ defmodule Phoenix.Sync.Electric do
259261
defp electric_children(env, mode, opts) do
260262
case validate_database_config(env, mode, opts) do
261263
{:start, db_config_fun, message} ->
262-
if electric_available?() do
263-
db_config =
264-
db_config_fun.()
265-
|> Keyword.update!(:connection_opts, &Electric.Utils.obfuscate_password/1)
264+
start_embedded(env, mode, db_config_fun, message)
266265

267-
electric_config = core_configuration(env, db_config)
266+
:ignore ->
267+
{:ok, []}
268268

269-
Logger.info(message)
269+
{:error, _} = error ->
270+
error
271+
end
272+
end
270273

271-
http_server =
272-
case mode do
273-
:http -> electric_api_server(electric_config)
274-
:embedded -> []
275-
end
274+
if @electric_available? do
275+
defp start_embedded(env, mode, db_config_fun, message) do
276+
db_config =
277+
db_config_fun.()
278+
|> Keyword.update!(:connection_opts, &Electric.Utils.obfuscate_password/1)
276279

277-
{:ok,
278-
[
279-
{Electric.StackSupervisor, Electric.Application.configuration(electric_config)}
280-
| http_server
281-
]}
282-
else
283-
{:error,
284-
"Electric configured to start in embedded mode but :electric dependency not available"}
280+
electric_config = core_configuration(env, db_config)
281+
282+
Logger.info(message)
283+
284+
http_server =
285+
case mode do
286+
:http -> electric_api_server(electric_config)
287+
:embedded -> []
285288
end
286289

287-
:ignore ->
288-
{:ok, []}
290+
{:ok,
291+
[
292+
{Electric.StackSupervisor, Electric.Application.configuration(electric_config)}
293+
| http_server
294+
]}
295+
end
289296

290-
{:error, _} = error ->
291-
error
297+
defp electric_api_server(opts) do
298+
config = electric_http_config(opts)
299+
300+
cond do
301+
Code.ensure_loaded?(Bandit) ->
302+
Electric.Application.api_server(Bandit, config)
303+
304+
Code.ensure_loaded?(Plug.Cowboy) ->
305+
Electric.Application.api_server(Plug.Cowboy, config)
306+
307+
true ->
308+
raise RuntimeError,
309+
message: "No HTTP server found. Please install either Bandit or Plug.Cowboy"
310+
end
311+
end
312+
313+
defp electric_http_config(opts) do
314+
case Keyword.fetch(opts, :http) do
315+
{:ok, http_opts} ->
316+
opts
317+
|> then(fn o ->
318+
if(port = http_opts[:port], do: Keyword.put(o, :service_port, port), else: o)
319+
end)
320+
321+
:error ->
322+
opts
323+
end
324+
end
325+
else
326+
defp start_embedded(_env, _mode, _db_config_fun, _message) do
327+
{:error,
328+
"Electric configured to start in embedded mode but :electric dependency not available"}
292329
end
293330
end
294331

@@ -389,26 +426,32 @@ defmodule Phoenix.Sync.Electric do
389426
end
390427
end
391428

392-
defp convert_repo_config(repo_config) do
393-
expected_keys = Electric.connection_opts_schema() |> Keyword.keys()
394-
395-
ssl_opts =
396-
case Keyword.get(repo_config, :ssl, nil) do
397-
off when off in [nil, false] -> [sslmode: :disable]
398-
true -> [sslmode: :require]
399-
_opts -> []
400-
end
429+
if @electric_available? do
430+
defp convert_repo_config(repo_config) do
431+
expected_keys = Electric.connection_opts_schema() |> Keyword.keys()
432+
433+
ssl_opts =
434+
case Keyword.get(repo_config, :ssl, nil) do
435+
off when off in [nil, false] -> [sslmode: :disable]
436+
true -> [sslmode: :require]
437+
_opts -> []
438+
end
401439

402-
tcp_opts =
403-
if :inet6 in Keyword.get(repo_config, :socket_options, []),
404-
do: [ipv6: true],
405-
else: []
440+
tcp_opts =
441+
if :inet6 in Keyword.get(repo_config, :socket_options, []),
442+
do: [ipv6: true],
443+
else: []
406444

407-
repo_config
408-
|> Keyword.take(expected_keys)
409-
|> Keyword.merge(ssl_opts)
410-
|> Keyword.merge(tcp_opts)
411-
|> Keyword.put_new(:port, 5432)
445+
repo_config
446+
|> Keyword.take(expected_keys)
447+
|> Keyword.merge(ssl_opts)
448+
|> Keyword.merge(tcp_opts)
449+
|> Keyword.put_new(:port, 5432)
450+
end
451+
else
452+
defp convert_repo_config(_repo_config) do
453+
[]
454+
end
412455
end
413456

414457
defp http_mode_plug_opts(electric_config) do
@@ -426,19 +469,6 @@ defmodule Phoenix.Sync.Electric do
426469
end
427470
end
428471

429-
defp electric_http_config(opts) do
430-
case Keyword.fetch(opts, :http) do
431-
{:ok, http_opts} ->
432-
opts
433-
|> then(fn o ->
434-
if(port = http_opts[:port], do: Keyword.put(o, :service_port, port), else: o)
435-
end)
436-
437-
:error ->
438-
opts
439-
end
440-
end
441-
442472
if @electric_available? do
443473
defp configure_client(opts, :embedded) do
444474
Electric.Client.embedded(opts)

0 commit comments

Comments
 (0)