Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/logfmt/encoder.ex
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ defmodule Logfmt.Encoder do
:unquoted ->
deduce_string_style(rest, :unquoted)

:quoted ->
acc when acc in [:quoted, :quoted_and_escaped] ->
deduce_string_style(rest, :quoted_and_escaped)
end
end
Expand Down
41 changes: 41 additions & 0 deletions lib/logfmt/value_encoder.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
defprotocol Logfmt.ValueEncoder do
@fallback_to_any true

@spec encode(value :: term) :: String.t()
def encode(value)
end
Expand Down Expand Up @@ -26,3 +28,42 @@ end
defimpl Logfmt.ValueEncoder, for: Reference do
def encode(ref), do: inspect(ref)
end

defimpl Logfmt.ValueEncoder, for: NaiveDateTime do
def encode(naive_date_time), do: NaiveDateTime.to_iso8601(naive_date_time)
end

defimpl Logfmt.ValueEncoder, for: DateTime do
def encode(date_time), do: DateTime.to_iso8601(date_time)
end

defimpl Logfmt.ValueEncoder, for: Function do
def encode(value) when is_function(value, 0) do
value.() |> Logfmt.ValueEncoder.encode()
rescue
e -> Exception.format(:error, e, __STACKTRACE__)
end

def encode(value), do: inspect(value)
end

defimpl Logfmt.ValueEncoder, for: List do
def encode([]), do: ""
def encode([value]), do: Logfmt.ValueEncoder.encode(value)

def encode([a | b] = list) when is_list(b) do
IO.iodata_to_binary(list)
rescue
_ -> Logfmt.ValueEncoder.encode(a) <> Logfmt.ValueEncoder.encode(b)
end
end

defimpl Logfmt.ValueEncoder, for: Tuple do
def encode({}), do: ""
def encode({value}), do: Logfmt.ValueEncoder.encode(value)
def encode(tuple), do: tuple |> Tuple.to_list() |> Logfmt.ValueEncoder.encode()
end

defimpl Logfmt.ValueEncoder, for: Any do
def encode(term), do: inspect(term)
end
4 changes: 4 additions & 0 deletions test/encode_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ defmodule LogfmtEncodeTest do
assert encode(foo: "bar baz") == ~s(foo="bar baz")
end

test "encodes an quoted and escaped value" do
assert encode(foo: "/\\\\\\\\\\\\/windows%2fwin.ini%23vt/test") == ~s(foo=/\\\\\\\\\\\\/windows%2fwin.ini%23vt/test)
end

test "encode an empty string" do
assert encode(empty: "") == ~s(empty="")
end
Expand Down