defmodule FastRSS do @moduledoc """ Parse RSS quickly using a Rust NIF. """ defmodule Native do @moduledoc false mix_config = Mix.Project.config() version = mix_config[:version] github_url = mix_config[:package][:links]["GitHub"] use RustlerPrecompiled, otp_app: :fast_rss, crate: "fastrss", base_url: "#{github_url}/releases/download/v#{version}", force_build: System.get_env("FORCE_BUILD") in ["1", "true"], version: version # When your NIF is loaded, it will override this function. def parse_rss(_a), do: :erlang.nif_error(:nif_not_loaded) def parse_atom(_a), do: :erlang.nif_error(:nif_not_loaded) end @doc """ Parse a RSS string into a map. soft deprecated: "Use FastRSS.parse_rss/1 instead" @doc since: "0.5.0" @deprecated "Use FastRSS.parse_rss/1 instead" """ @spec parse(String.t()) :: {:ok, map()} | {:error, String.t()} def parse(""), do: {:error, "Cannot parse blank string"} def parse(rss_string) when is_binary(rss_string), do: parse_rss(rss_string) def parse(_something_else), do: {:error, "RSS feed must be passed in as a string"} @doc """ Parse a RSS string into a map. """ @spec parse_rss(String.t()) :: {:ok, map()} | {:error, String.t()} @doc since: "0.5.0" def parse_rss(""), do: {:error, "Cannot parse blank string"} def parse_rss(rss_string) when is_binary(rss_string) do rss_string |> Native.parse_rss() |> map_to_tuple() end def parse_rss(_something_else), do: {:error, "RSS feed must be passed in as a string"} @doc """ Parse a Atom string into a map. """ @spec parse_atom(String.t()) :: {:ok, map()} | {:error, String.t()} @doc since: "0.5.0" def parse_atom(""), do: {:error, "Cannot parse blank string"} def parse_atom(atom_string) when is_binary(atom_string) do atom_string |> Native.parse_atom() |> map_to_tuple() end def parse_atom(_something_else), do: {:error, "Atom feed must be passed in as a string"} defp map_to_tuple(%{"Ok" => map}), do: {:ok, map} defp map_to_tuple({:ok, map}), do: {:ok, map} defp map_to_tuple(%{"Err" => msg}), do: {:error, msg} defp map_to_tuple({:error, msg}), do: {:error, msg} end