dictionary - Elixir convierte la estructura al mapa
telegram-bot (4)
Estoy intentando convertir una estructura en un mapa para poder limpiar todos los valores nulos
Actualmente estoy usando este código
case Nadia.get_updates do
{:ok, results} ->
Map.from_struct(results)
|> Enum.filter(fn {_, v} -> v != nil end)
|> Enum.into(%{})
Nota: Nadia.get_updates devuelve la siguiente estructura: https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/0
Sin embargo, siempre recibo el siguiente error: no hay una cláusula de función que coincida en Map.from_struct / 1
Desde v0.15 tenemos Map.from_struct/1
que hace exactamente esto.
defmodule User do
defstruct [:name]
end
Map.from_struct(%User{name: "valim"})
#=> %{name: "valim"}
FWIW, escribí una biblioteca que hará este tipo de cosas automáticamente sin tener que separar la estructura de datos.
https://github.com/philosophers-stone/transform
Esto es del código de prueba:
test "implement scrub of empty values from map" do
data = %{ :a => nil, :b => "", :c => "a"}
replace_empty = fn(string, _d) -> if( string == "", do: nil , else: string) end
replace_nil = fn(map, _depth) -> for {k, v} <- map, v != nil , into: %{}, do: {k, v} end
potion = %{ BitString => replace_empty, Map => replace_nil}
assert PhStTransform.transform(data, potion) == %{:c => "a"}
end
Tenga en cuenta que si los datos fueran una lista de mapas, esto aún funcionaría bien. La biblioteca PhStTransform solo seguirá separando los datos hasta que encuentre un mapa. En su caso, usaría una función replace_nil que funcionó en los tipos de estructuras que le interesan.
Hay otro truco
my_struct = %MyStruct{}
my_map = Map.delete my_struct, :__struct__
get_updates([{atom, any}]) ::
{:ok, [Nadia.Model.Update.t]} |
{:error, Nadia.Model.Error.t}
Si tiene éxito, devuelve una lista de Nadia.Model.Update.t. Es por eso que obtienes ese error.