Skip to content

Commit 19ca6b4

Browse files
committed
Provide a default implementation for Sender.client/1
1 parent 3cb49a4 commit 19ca6b4

4 files changed

Lines changed: 50 additions & 25 deletions

File tree

lib/telegram_logger_backend.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ defmodule LoggerTelegramBackend do
77
@behaviour :gen_event
88

99
defmodule State do
10+
@moduledoc false
1011
defstruct [:name, :level, :metadata, :metadata_filter, :send_message]
1112
end
1213

13-
alias LoggerTelegramBackend.{Formatter, Telegram}
14+
alias LoggerTelegramBackend.{Formatter, Sender}
1415

1516
@default_name :telegram
16-
@default_sender {Telegram, [:token, :chat_id, :proxy]}
17+
@default_sender {Sender.Telegram, [:token, :chat_id, :proxy]}
1718
@default_metadata [:line, :function, :module, :application, :file]
1819

1920
@impl :gen_event
Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
11
defmodule LoggerTelegramBackend.Sender do
2-
@callback client(Keyword.t()) :: Tesla.Client.t()
2+
@moduledoc """
3+
Specifies the API for using a custom Sender.
4+
"""
35

4-
@callback send_message(Tesla.Client.t(), String.t(), Keyword.t()) :: :ok | {:error, any}
6+
@doc """
7+
Creates a custom Tesla.Client
8+
"""
9+
@callback client(opts :: Keyword.t()) :: Tesla.Client.t()
10+
11+
@doc """
12+
Sends a message
13+
"""
14+
@callback send_message(
15+
tesla_client :: Tesla.Client.t(),
16+
message :: String.t(),
17+
opts :: Keyword.t()
18+
) :: :ok | {:error, any}
19+
20+
defmacro __using__(opts) do
21+
quote do
22+
@behaviour LoggerTelegramBackend.Sender
23+
24+
@base_url unquote(Keyword.fetch!(opts, :base_url))
25+
@adapter unquote(Keyword.fetch!(opts, :adapter))
26+
27+
@impl true
28+
def client(opts \\ []) do
29+
{adapter, opts} = Keyword.pop(opts, :adapter, @adapter)
30+
{base_url, opts} = Keyword.pop(opts, :base_url, @base_url)
31+
32+
middlewares = [
33+
{Tesla.Middleware.BaseUrl, base_url},
34+
{Tesla.Middleware.Headers, [{"user-agent", ""}]},
35+
Tesla.Middleware.FormUrlencoded,
36+
{Tesla.Middleware.Opts, opts}
37+
]
38+
39+
Tesla.client(middlewares, adapter)
40+
end
41+
42+
defoverridable client: 1
43+
end
44+
end
545
end

lib/telegram_logger_backend/telegram.ex renamed to lib/telegram_logger_backend/sender/telegram.ex

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,9 @@
1-
defmodule LoggerTelegramBackend.Telegram do
2-
@behaviour LoggerTelegramBackend.Sender
3-
1+
defmodule LoggerTelegramBackend.Sender.Telegram do
42
@moduledoc false
53

6-
@base_url "https://api.telegram.org"
7-
@adapter {Tesla.Adapter.Hackney, pool: :logger_telegram_backend}
8-
9-
@impl true
10-
def client(opts \\ []) do
11-
{adapter, opts} = Keyword.pop(opts, :adapter, @adapter)
12-
{base_url, opts} = Keyword.pop(opts, :base_url, @base_url)
13-
14-
middlewares = [
15-
{Tesla.Middleware.BaseUrl, base_url},
16-
{Tesla.Middleware.Headers, [{"user-agent", ""}]},
17-
Tesla.Middleware.FormUrlencoded,
18-
{Tesla.Middleware.Opts, opts}
19-
]
20-
21-
Tesla.client(middlewares, adapter)
22-
end
4+
use LoggerTelegramBackend.Sender,
5+
base_url: "https://api.telegram.org",
6+
adapter: {Tesla.Adapter.Hackney, pool: :logger_telegram_backend}
237

248
@impl true
259
def send_message(client, text, opts) when is_binary(text) do

test/logger_telegram_backend/sender_telegram_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ defmodule SenderTelegramTest do
22
use ExUnit.Case
33
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
44

5-
alias LoggerTelegramBackend.Telegram
5+
alias LoggerTelegramBackend.Sender.Telegram
66

77
setup do
88
ExVCR.Config.cassette_library_dir("test/fixture/vcr_cassettes")

0 commit comments

Comments
 (0)