11
votes

I've to parse an xml document, extracting an integer from an xml node.

Currently I have:

try do
  Floki.find(node, "stat[type='jersey_num']")
    |> Floki.text
    |> Integer.parse
    |> elem(0)
rescue
  e -> nil
end

which works fine but I don't like having to rescue everything, I would like to do something like:

Floki.find(node, "stat[type='jersey_num']")
  |> Floki.text
  |> case Integer.parse do
    { int, _binary } -> int
    _                -> nil
  end

but I get unhandled operator -> in the fourth line, is there a way to do this?

1

1 Answers

28
votes

You need to pipe into Integer.parse first and then into case:

defmodule MyInteger do
  def parse(string) do
    string
    |> Integer.parse
    |> case do
         {int, _} -> int
         _ -> nil
       end
  end
end

Demo:

iex(1)> MyInteger.parse "123"
123
iex(2)> MyInteger.parse "abc"
nil

Note that MyInteger.parse "123abc" #=> 123, so you might want to change your pattern match to be {int, ""} -> int, if you want the same behavior as Integer.parse/1.