Elixir предоставляет (через erlang) некоторые функции, которые могут отражать структуры данных для проверки их типа, например is_map/1, is_list/1, is_number/1, is_boolean/1, is_binary/1, is_nil/1
и т. Д. Из документов
Попробуйте использовать общие типы данных, которые вы будете иметь в своем ответе. Это могут быть примитивы, карты или списки примитивов, в которых примитивы похожи на логические, числовые или строковые.
Напишите функцию, которая пытается рекурсивно пройти через полученную структуру данных, пока не достигнет примитива, а затем вернуть примитив со строковым значением
Ex. для карт просмотрите каждое значение (ключ игнорирования) и, если значение не является примитивом, рекурсивно вызывайте функцию с этим узлом, пока не достигнете примитива и не сможете вернуть строковое значение. Аналогично для списков
Примерно так должно работать:
defmodule Test do
def stringify(data) do
cond do
# <> is concatenation operator
# -- call stringify() for every value in map and return concatenated string
is_map(data) -> data |> Map.values |> Enum.reduce("", fn x, acc -> acc <> stringify(x) end)
# -- call stringify() for every element in list and return concatenated string
is_list(data) -> data |> Enum.reduce("", fn x, acc -> acc <> stringify(x) end)
is_boolean(data) -> to_string(data)
is_number(data) -> to_string(data)
is_binary(data) -> data # elixir strings are binaries
true -> ""
end
end
end
# For testing...
{:ok, %HTTPoison.Response{body: sbody}} = HTTPoison.get("https://pokemon.fandom.com/api/v1/Articles/AsSimpleJson?id=2409")
{:ok, body} = Poison.decode(sbody)
Test.stringify(body)
# returns
"Cyndaquil (Japanese: ヒノアラシ Hinoarashi) is the Fire-type Starter..."