docs/tutorials/getting_started.md

# Getting Started with ErrorMessage

This tutorial will guide you through the basics of using ErrorMessage in your Elixir application. By the end, you'll understand how to create, handle, and serialize error messages.

## Prerequisites

- Basic knowledge of Elixir
- An Elixir project set up with Mix

## Step 1: Add ErrorMessage to Your Project

First, add ErrorMessage to your dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:error_message, "~> 0.3.2"}
  ]
end
```

Then run:

```bash
mix deps.get
```

## Step 2: Creating Your First Error Message

Let's start by creating a simple error message:

```elixir
# Create a basic not_found error
error = ErrorMessage.not_found("Resource not found")
```

This creates an `%ErrorMessage{}` struct with the code `:not_found` and the message "Resource not found".

## Step 3: Adding Details to Your Error

Error messages can include additional details to provide more context:

```elixir
# Create an error with details
error = ErrorMessage.not_found("User not found", %{user_id: 123})
```

The details can be any Elixir term, but keep in mind that if you plan to convert the error to JSON, you should use data structures that can be serialized.

## Step 4: Using Error Messages in Function Returns

A common pattern is to return `{:ok, result}` or `{:error, error_message}` from functions:

```elixir
defmodule UserRepository do
  def find_user(id) do
    case Database.get_user(id) do
      nil -> {:error, ErrorMessage.not_found("User not found", %{user_id: id})}
      user -> {:ok, user}
    end
  end
end
```

## Step 5: Pattern Matching on Error Codes

One of the benefits of ErrorMessage is the ability to pattern match on error codes:

```elixir
case UserRepository.find_user(123) do
  {:ok, user} -> 
    # Process the user
    IO.puts("Found user: #{user.name}")
    
  {:error, %ErrorMessage{code: :not_found}} ->
    # Handle not found specifically
    IO.puts("User not found, creating a new one")
    create_new_user(123)
    
  {:error, error} ->
    # Handle other errors
    IO.puts("Error: #{error.message}")
end
```

## Step 6: Converting Errors to Strings for Logging

ErrorMessage implements the `String.Chars` protocol, making it easy to convert errors to strings for logging:

```elixir
require Logger

def process_user(id) do
  case UserRepository.find_user(id) do
    {:ok, user} -> 
      {:ok, process(user)}
      
    {:error, error} = result ->
      Logger.error("Failed to find user: #{error}")
      result
  end
end
```

## Step 7: Converting Errors to JSON for API Responses

When building web APIs, you can easily convert error messages to JSON:

```elixir
defmodule MyAPI.ErrorView do
  def render("error.json", %{error: error}) do
    ErrorMessage.to_jsonable_map(error)
  end
end
```

## Next Steps

Now that you understand the basics of ErrorMessage, you can:

- Check out the [How-To Guides](https://hexdocs.pm/error_message/how-to-guides.html) for practical examples
- Explore the [Explanation](https://hexdocs.pm/error_message/explanation.html) section to understand the design principles
- Refer to the [API Reference](https://hexdocs.pm/error_message/api-reference.html) for detailed function documentation

Congratulations! You've completed the getting started tutorial for ErrorMessage.