dictionary struct elixir telegram-bot

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.