Skip to content
This repository was archived by the owner on Dec 8, 2020. It is now read-only.

Commit ea788b4

Browse files
committed
Adds to_event support for arbitrary structs
Signed-off-by: João Ferreira <[email protected]>
1 parent ca9831b commit ea788b4

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

lib/timber/eventable.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ defimpl Timber.Eventable, for: Map do
4949
end
5050

5151
defimpl Timber.Eventable, for: Any do
52+
@upper_word_regex ~r/(^[A-Z]+$)|[A-Z][a-z0-9]*/
53+
5254
def to_event(%{__exception__: true} = error) do
5355
message = Exception.message(error)
5456
module_name = Timber.Utils.Module.name(error.__struct__)
@@ -60,4 +62,19 @@ defimpl Timber.Eventable, for: Any do
6062
}
6163
}
6264
end
65+
66+
def to_event(%{__struct__: module} = struct) do
67+
event_data = struct |> Map.from_struct()
68+
69+
event_namespace =
70+
module
71+
|> Module.split()
72+
|> List.last()
73+
|> String.split(@upper_word_regex, trim: true, include_captures: true)
74+
|> Stream.map(&String.downcase/1)
75+
|> Enum.join("_")
76+
|> String.to_atom()
77+
78+
Map.new([{event_namespace, event_data}])
79+
end
6380
end

test/lib/timber/eventable_test.exs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule Timber.EventableTest do
22
use Timber.TestCase
33

4-
alias Timber.Eventable
4+
alias Timber.{Eventable, TestStruct}
55

66
describe "Timber.Eventable.to_event/1" do
77
test "map with a single root key" do
@@ -31,5 +31,14 @@ defmodule Timber.EventableTest do
3131
}
3232
}
3333
end
34+
35+
test "struct" do
36+
struct = %TestStruct{}
37+
event = Eventable.to_event(struct)
38+
39+
assert event == %{
40+
test_struct: %{life: 42}
41+
}
42+
end
3443
end
3544
end

test/support/test_struct.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
defmodule Timber.TestStruct do
2+
@moduledoc false
3+
defstruct life: 42
4+
end

0 commit comments

Comments
 (0)