From 3bdc9c8400493845bce8cf6e6a2c3366b004ef0d Mon Sep 17 00:00:00 2001 From: Justin Baker Date: Mon, 22 Jan 2018 14:33:02 -0600 Subject: [PATCH] Add child_spec to using macro --- lib/websockex.ex | 24 +++++++++++++++++++++++- test/websockex_test.exs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/websockex.ex b/lib/websockex.ex index c23617a..e2833b4 100644 --- a/lib/websockex.ex +++ b/lib/websockex.ex @@ -214,10 +214,32 @@ defmodule WebSockex do @optional_callbacks format_status: 2 - defmacro __using__(_) do + defmacro __using__(opts) do quote location: :keep do @behaviour WebSockex + if Kernel.function_exported?(Supervisor, :child_spec, 2) do + @doc false + def child_spec(conn_info, state) do + %{ + id: __MODULE__, + start: {__MODULE__, :start_link, [conn_info, state]} + } + |> Supervisor.child_spec(unquote(Macro.escape(opts))) + end + + @doc false + def child_spec(state) do + %{ + id: __MODULE__, + start: {__MODULE__, :start_link, [state]} + } + |> Supervisor.child_spec(unquote(Macro.escape(opts))) + end + + defoverridable child_spec: 2, child_spec: 1 + end + @doc false def handle_connect(_conn, state) do {:ok, state} diff --git a/test/websockex_test.exs b/test/websockex_test.exs index dbdccd0..cb4d550 100644 --- a/test/websockex_test.exs +++ b/test/websockex_test.exs @@ -1405,4 +1405,35 @@ defmodule WebSockexTest do # A second data tuple means pretty output for `:observer`. Who knew? assert {:data, _data} = List.keyfind(rest, :data, 0) end + + if Kernel.function_exported?(Supervisor, :child_spec, 2) do + describe "child_spec" do + test "child_spec/2" do + assert %{id: TestClient, start: {TestClient, :start_link, ["url", :state]}} = + TestClient.child_spec("url", :state) + end + + test "child_spec/1" do + assert %{id: TestClient, start: {TestClient, :start_link, [:state]}} = + TestClient.child_spec(:state) + end + end + + test "child_spec is overridable" do + defmodule ChildSpecTest do + use WebSockex + + def child_spec(_state) do + "hippo" + end + + def child_spec(_conn, _state) do + "llama" + end + end + + assert ChildSpecTest.child_spec(1, 2) == "llama" + assert ChildSpecTest.child_spec(1) == "hippo" + end + end end