From d5bd79f114655bc7f416bd3ae2c90510b58c9c0b Mon Sep 17 00:00:00 2001 From: Juan Facorro Date: Wed, 10 Jun 2015 01:59:24 -0300 Subject: [PATCH] [#12] Encode protocol implementation for Any, but actually only for structs --- lib/ex_edn/encode.ex | 10 ++++++++++ test/ex_edn_test.exs | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/lib/ex_edn/encode.ex b/lib/ex_edn/encode.ex index 1361423..a3b8fca 100644 --- a/lib/ex_edn/encode.ex +++ b/lib/ex_edn/encode.ex @@ -6,6 +6,7 @@ alias ExEdn.UUID alias ExEdn.Tag defprotocol ExEdn.Encode do + @fallback_to_any true def encode(value) end @@ -101,3 +102,12 @@ defimpl Encode, for: Timex.DateTime do Encode.encode(Tag.new("inst", value)) end end + +defimpl Encode, for: Any do + def encode(struct) when is_map(struct) do + Encode.encode(Map.from_struct(struct)) + end + def encode(_) do + raise Protocol.UndefinedError + end +end diff --git a/test/ex_edn_test.exs b/test/ex_edn_test.exs index b3fc834..25180d7 100644 --- a/test/ex_edn_test.exs +++ b/test/ex_edn_test.exs @@ -132,6 +132,12 @@ defmodule ExEdnTest do assert encode!(some_tag) == "#custom/tag :joni" end + test "Encode Fallback to Any" do + node = %ExEdn.Parser.Node{} + map = Map.from_struct(node) + assert encode!(node) == encode!(map) + end + test "Encode Unknown Type" do e = %Protocol.UndefinedError{} assert encode(self) == {:error, e.__struct__}