defmodule CoreUtils.ViewHelper do @moduledoc """ Presentation helpers """ def translate_errors(%{causes: causes}) do %{status: :error, code: 1, message: "Validation errors", causes: causes} end def translate_errors(changeset) do %{status: :error, code: 1, message: "Validation errors", causes: Ecto.Changeset.traverse_errors(changeset, &(:erlang.element(1, &1)))} end defimpl Poison.Encoder, for: Tuple do def encode(tuple, _options) do tuple |> Tuple.to_list() |> Poison.encode!() end end defimpl Poison.Encoder, for: Any do def encode(%{__struct__: Core.Models.Task} = struct, options) do struct = if struct.geom do {lon, lat} = struct.geom.coordinates %{struct | lon: lon, lat: lat} else struct end enconde_model(struct, options) end def encode(%{__struct__: _} = struct, options) do enconde_model(struct, options) end def encode({lon, lat}, options) when is_float(lon) and is_float(lat) do %{lon: lon, lat: lat} |> sanitize_map() |> Poison.Encoder.Map.encode(options) end defp enconde_model(model, options) do model |> Map.from_struct() |> sanitize_map() |> Poison.Encoder.Map.encode(options) end defp sanitize_map(map) do map |> Enum.filter( fn({_, %Ecto.Association.NotLoaded{}}) -> false ({:__meta__, _}) -> false ({:__struct__, _}) -> false ({_, _}) -> true end) |> Map.new() end end end