J'essaie de convertir une structure en carte pour pouvoir nettoyer toutes les valeurs nulles
J'utilise actuellement ce code
case Nadia.get_updates do
{:ok, results} ->
Map.from_struct(results)
|> Enum.filter(fn {_, v} -> v != nil end)
|> Enum.into(%{})
Remarque: Nadia.get_updates renvoie la structure suivante: https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/
Pourtant, je reçois toujours l'erreur suivante: aucune clause de fonction ne correspond dans Map.from_struct/1
Depuis v0.15 nous avons Map.from_struct/1
qui fait exactement cela.
defmodule User do
defstruct [:name]
end
Map.from_struct(%User{name: "valim"})
#=> %{name: "valim"}
Il y a une autre astuce
my_struct = %MyStruct{}
my_map = Map.delete my_struct, :__struct__
get_updates([{atom, any}]) ::
{:ok, [Nadia.Model.Update.t]} |
{:error, Nadia.Model.Error.t}
En cas de succès, il renvoie une liste de Nadia.Model.Update.t. C'est pourquoi vous obtenez cette erreur.
FWIW, j'ai écrit une bibliothèque qui fera ce genre de chose pour vous sans avoir à séparer la structure de données.
https://github.com/philosophers-stone/transform
Cela vient du code de test:
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
Remarque, si les données étaient une liste de cartes, cela fonctionnerait toujours très bien. La bibliothèque PhStTransform continuera simplement à séparer les données jusqu'à ce qu'elle trouve une carte. Dans votre cas, vous utiliseriez une fonction replace_nil qui a fonctionné sur les types de structures qui vous intéressent.