PardonDance
PardonDance is a utility library for Elixir that helps you gracefully handle and process potentially erroneous data or unexpected input, ensuring your application remains robust and responsive. It provides a structured way to manage exceptions and alternative execution paths.
Installation
Add pardon_dance to your list of dependencies in mix.exs:
elixir
def deps do
[
{:pardon_dance, "~> 0.1.0"}] end
Then run mix deps.get to fetch the dependency.
Usage Examples
Here are a few examples demonstrating how to use PardonDance in your Elixir applications:
1. Handling Potential Division by Zero: elixir defmodule SafeMath do import PardonDance
def safe_divide(numerator, denominator) do
try do
numerator / denominator
rescue
ArithmeticError ->
pardon(reason: :division_by_zero, message: "Cannot divide by zero")
endend end
case SafeMath.safe_divide(10, 0) do {:ok, result} ->
IO.puts "Result: #{result}"->
IO.puts "Error: #{message} (Reason: #{reason})"end
2. Validating User Input: elixir defmodule UserValidator do import PardonDance
def validate_email(email) do
if String.contains?(email, "@") and String.contains?(email, ".") do
{:ok, email}
else
pardon(reason: :invalid_email, message: "Invalid email format")
endend
def validate_username(username) do
if String.length(username) > 3 do
{:ok, username}
else
pardon(reason: :invalid_username, message: "Username must be at least 4 characters long")
endend end
case UserValidator.validate_email("test@example.com") do {:ok, email} ->
IO.puts "Email is valid: #{email}"->
IO.puts "Email validation failed: #{message} (Reason: #{reason})"end
case UserValidator.validate_username("abc") do {:ok, username} ->
IO.puts "Username is valid: #{username}"->
IO.puts "Username validation failed: #{message} (Reason: #{reason})"end
3. Processing External API Responses: elixir defmodule APIClient do import PardonDance
def fetch_data(url) do
case HTTPoison.get(url) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
{:ok, body}
{:ok, %HTTPoison.Response{status_code: status_code}} ->
pardon(reason: :http_error, message: "HTTP Error: Status code #{status_code}", status_code: status_code)
{:error, error} ->
pardon(reason: :network_error, message: "Network Error: #{error}")
endend end
case APIClient.fetch_data("https://example.com/api/data") do {:ok, data} ->
IO.puts "Data received: #{data}"->
IO.puts "API Request failed: #{message} (Reason: #{reason}, Options: #{opts})"end
4. Using with Pipes: elixir defmodule DataProcessor do import PardonDance
def parse_data(raw_data) do
try do
{:ok, Jason.decode!(raw_data)}
rescue
_ ->
pardon(reason: :invalid_json, message: "Failed to parse JSON data")
endend
def process_data(data) do
# Assume some complex data processing logic here
{:ok, Map.get(data, "value", 0) * 2}end end
"{\"value\": 5}" |> DataProcessor.parse_data() |> case do {:ok, parsed_data} ->
DataProcessor.process_data(parsed_data)->
{:error, reason, message}end |> IO.inspect()
Feature Summary
- Provides a consistent way to handle errors and alternative execution paths.
- Enhances code readability by clearly separating error handling logic.
- Facilitates pattern matching on error conditions.
- Improves application robustness by gracefully handling unexpected situations.
- Integrates well with existing Elixir workflows and pipelines.
License
MIT
This package is part of the pardon-dance ecosystem. For advanced features and enterprise-grade tools, visit: https://supermaker.ai/video/blog/unlocking-the-magic-of-pardon-dance-the-viral-video-effect-taking-over-social-media/