defmodule Matcher do alias Matcher.Context def matches?(expected, actual) do case match(expected, actual) do {:ok, _} -> true _ -> false end end def match(expected, actual, context \\ %Context{}) do Matcher.Protocol.match(expected, actual, context) end def equals(expected) do cond do is_map(expected) -> %Matcher.MapEquals{expected: expected} is_list(expected) -> %Matcher.ListEquals{expected: expected} :else -> %Matcher.Value{expected: expected} end end def embeds(expected) when is_map(expected) do %Matcher.MapEmbeds{expected: expected} end def in_any_order(expected) when is_list(expected) do %Matcher.ListInAnyOrder{expected: expected} end def one_of(expecteds) when is_list(expecteds) do %Matcher.OneOf{expecteds: expecteds} end end