Keyword.get (or fetch) not working

Im very new to Functional Programmin and Elixir, I think it must be something very silly that I’m missing here but I cant seem to get a value from keyword list.
I have following code

defmodule Home4 do

    def taskOne() do

        colors = [{:black, "#000000"}, {:aqua, "#00FFFF"}, {:brown, "#A52A2A"}, {:green, "#008000"}, {:navy, "#000080"}, {:olive, "#808000"}, {:pink, "#FFC0CB"}, {:purple, "#800080"}, {:red, "#FF0000"}, {:yellow, "#FFFF00"}]
        Home4.test(colors)
    end


    def test(keywordlist) do
        input = IO.gets("Enter color name or code: ") |> String.trim()
        if String.starts_with?(input, "#") do
            keywordlist 
            |> Enum.find( fn {key, val} -> val == input end)
            |> elem(0) |> IO.puts()                      
        else            
            Keyword.get(keywordlist, input)
        end
    end

end
Home4.taskOne()

So if I enter “red” id like to get corresponding value, but I get following error instead. What is wrong ?

Enter color name or code: red
** (FunctionClauseError) no function clause matching in Keyword.get/3    

    The following arguments were given to Keyword.get/3:

        # 1
        [black: "#000000", aqua: "#00FFFF", brown: "#A52A2A", green: "#008000", navy: "#000080", olive: "#808000", pink: "#FFC0CB", purple: "#800080", red: "#FF0000", yellow: "#FFFF00"]

        # 2
        "red"

        # 3
        nil

    Attempted function clauses (showing 1 out of 1):

        def get(+keywords+, +key+, +default+) when +is_list(keywords)+ and -is_atom(key)-

    (elixir 1.10.4) lib/keyword.ex:201: Keyword.get/3
    (elixir 1.10.4) lib/code.ex:926: Code.require_file/2

The key must be an atom and you’re passing a string.

2 Likes

Thank you!
As I thought, it was something quite silly. Got it working

I suggest you look at using List.keyfind/3

iex(33)> colors = [{"black", "#000000"}, {"aqua", "#00FFFF"}, {"brown", "#A52A2A"}, {"green", "#008000"}, {"navy", "#000080"}, {"olive", "#808000"}, {"pink", "#FFC0CB"}, {"purple", "#800080"}, {"red", "#FF0000"}, {"yellow", "#FFFF00"}]
[
  {"black", "#000000"},
  {"aqua", "#00FFFF"},
  {"brown", "#A52A2A"},
  {"green", "#008000"},
  {"navy", "#000080"},
  {"olive", "#808000"},
  {"pink", "#FFC0CB"},
  {"purple", "#800080"},
  {"red", "#FF0000"},
  {"yellow", "#FFFF00"}
]
iex(34)> test = fn -> case "Enter color name or code: " |> IO.gets() |> String.trim() do
...(34)>   "#" <> _ = code -> List.keyfind(colors, code, 1)
...(34)>   name -> List.keyfind(colors, name, 0)
...(34)> end
...(34)> end
#Function<21.126501267/0 in :erl_eval.expr/5>
iex(35)> test.()
Enter color name or code: red
{"red", "#FF0000"}
iex(36)> test.()
Enter color name or code: #00FFFF
{"aqua", "#00FFFF"}
2 Likes