defmodule Exbitly do
@moduledoc """
Exbitly's main module. You can find all the functions you can use in Exbitly in this module.
"""
@doc """
Takes a domain and a long URL and returns the shortened URL. If an error occurs, returns the error body.
## Parameters
- `domain`: The domain of the shortened URL.
- `long_url`: The long URL to be shortened.
## Examples
```elixir
Exbitly.shorten("bit.ly", "http://www.example.com")
# {:ok, "http://bit.ly/short_url"}
Exbitly.shorten("random", "http://www.example.com")
# {:error, %{
# "description" => "The value provided is invalid.",
# "errors" => [%{"error_code" => "invalid", "field" => "domain"}],
# "message" => "INVALID_ARG_DOMAIN",
# "resource" => "bitlinks"
# }}
```
"""
@spec shorten(String.t(), String.t()) ::
{:ok, String.t()} | {:error, map()}
def shorten(domain, long_url) when is_binary(domain) and is_binary(long_url) do
body = Poison.encode!(%{domain: domain, long_url: long_url})
{:ok, response} = Exbitly.Base.post("https://api-ssl.bitly.com/v4/shorten", body)
response = Poison.decode!(response.body)
if response["link"] != nil do
{:ok, response["link"]}
else
{:error, response}
end
end
@doc """
Takes a domain and a long URL and returns the shortened URL. If an error occurs, raises an exception.
## Parameters
- `domain`: The domain of the shortened URL.
- `long_url`: The long URL to be shortened.
## Examples
```elixir
Exbitly.shorten!("bit.ly", "http://www.example.com")
# {:ok, "http://bit.ly/short_url"}
Exbitly.shorten!("random", "http://www.example.com")
# ** (Exbitly.Error) An error occured while shortening the URL. Message: INVALID_ARG_DOMAIN - Description: The value provided is invalid.
```
"""
@spec shorten!(String.t(), String.t()) ::
{:ok, String.t()} | no_return()
def shorten!(domain, long_url) when is_binary(domain) and is_binary(long_url) do
body = Poison.encode!(%{domain: domain, long_url: long_url})
{:ok, response} = Exbitly.Base.post("https://api-ssl.bitly.com/v4/shorten", body)
response = Poison.decode!(response.body)
message = response_or_empty(response["message"], "No Message")
description = response_or_empty(response["description"], "No Description")
if response["link"] != nil do
{:ok, response["link"]}
else
raise(Exbitly.Error,
message:
"An error occured while shortening the URL. Message: #{message} - Description: #{description}"
)
end
end
@spec response_or_empty(any(), String.t()) :: any() | String.t()
defp response_or_empty(response, empty) do
if response != nil do
response
else
empty
end
end
end