Packages
timber
2.3.0
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/timber/contextable.ex
defprotocol Timber.Contextable do
@moduledoc """
Converts a data structure into a `Timber.Context.t`. This is called on any data structure passed
in the `Timber.add_context/1` function.
For example, this protocol is how we're able to support `Keyword.t` types:
```elixir
Timber.add_context(build: %{version: "1.0"})
```
This is achieved by:
```elixir
defimpl Timber.Contextable, for: Map do
def to_context(map) when map_size(map) == 1 do
[type] = Map.keys(map)
[data] = Map.values(map)
%Timber.Contexts.CustomContext{
type: type,
data: data
}
end
end
```
## What about custom contexts and structs?
We recommend defining a struct and calling `use Timber.Contexts.CustomContext` in that module.
This takes care of everything automatically. See `Timber.Contexts.CustomContext` for examples.
"""
@doc """
Converts the data structure into a `Timber.Event.t`.
"""
@spec to_context(any) :: Timber.Context.t
def to_context(data)
end
defimpl Timber.Contextable, for: Timber.Contexts.CustomContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.HTTPContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.JobContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.OrganizationContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.RuntimeContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.SessionContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.SystemContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: Timber.Contexts.UserContext do
def to_context(context), do: context
end
defimpl Timber.Contextable, for: List do
def to_context(list) do
if Keyword.keyword?(list) do
list
|> Enum.into(%{})
|> Timber.Contextable.to_context()
else
raise "The provided list is not a Keyword.t and therefore cannot be converted " <>
"to a Timber context"
end
end
end
defimpl Timber.Contextable, for: Map do
def to_context(%{type: type, data: data}) do
%Timber.Contexts.CustomContext{
type: type,
data: data
}
end
def to_context(map) when map_size(map) == 1 do
[type] = Map.keys(map)
[data] = Map.values(map)
%Timber.Contexts.CustomContext{
type: type,
data: data
}
end
end