From ea788b401ca0145993b92634d31bc9dccfbf373a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Ferreira?= Date: Thu, 28 Nov 2019 17:04:06 +0000 Subject: [PATCH] Adds `to_event` support for arbitrary structs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Ferreira --- lib/timber/eventable.ex | 17 +++++++++++++++++ test/lib/timber/eventable_test.exs | 11 ++++++++++- test/support/test_struct.ex | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/support/test_struct.ex diff --git a/lib/timber/eventable.ex b/lib/timber/eventable.ex index 736c29c..b928fa8 100644 --- a/lib/timber/eventable.ex +++ b/lib/timber/eventable.ex @@ -49,6 +49,8 @@ defimpl Timber.Eventable, for: Map do end defimpl Timber.Eventable, for: Any do + @upper_word_regex ~r/(^[A-Z]+$)|[A-Z][a-z0-9]*/ + def to_event(%{__exception__: true} = error) do message = Exception.message(error) module_name = Timber.Utils.Module.name(error.__struct__) @@ -60,4 +62,19 @@ defimpl Timber.Eventable, for: Any do } } end + + def to_event(%{__struct__: module} = struct) do + event_data = struct |> Map.from_struct() + + event_namespace = + module + |> Module.split() + |> List.last() + |> String.split(@upper_word_regex, trim: true, include_captures: true) + |> Stream.map(&String.downcase/1) + |> Enum.join("_") + |> String.to_atom() + + Map.new([{event_namespace, event_data}]) + end end diff --git a/test/lib/timber/eventable_test.exs b/test/lib/timber/eventable_test.exs index 5994321..363188a 100644 --- a/test/lib/timber/eventable_test.exs +++ b/test/lib/timber/eventable_test.exs @@ -1,7 +1,7 @@ defmodule Timber.EventableTest do use Timber.TestCase - alias Timber.Eventable + alias Timber.{Eventable, TestStruct} describe "Timber.Eventable.to_event/1" do test "map with a single root key" do @@ -31,5 +31,14 @@ defmodule Timber.EventableTest do } } end + + test "struct" do + struct = %TestStruct{} + event = Eventable.to_event(struct) + + assert event == %{ + test_struct: %{life: 42} + } + end end end diff --git a/test/support/test_struct.ex b/test/support/test_struct.ex new file mode 100644 index 0000000..252ef6f --- /dev/null +++ b/test/support/test_struct.ex @@ -0,0 +1,4 @@ +defmodule Timber.TestStruct do + @moduledoc false + defstruct life: 42 +end