defmodule CalDAVEx.Error do @moduledoc """ Error types and utilities for CalDAV operations. All CalDAVEx functions return errors as `{:error, %CalDAVEx.Error{}}`. """ @typedoc """ Error struct. ## Fields - `type` - The error type (`:transport`, `:http`, `:xml`, `:protocol`, `:not_found`, `:unauthorized`, `:conflict`) - `message` - Human-readable error message - `details` - Additional error details (optional) """ @type t :: %__MODULE__{ type: atom(), message: String.t() | nil, details: String.t() | nil } defstruct [:type, :message, :details] @doc "Creates a transport error (network/connection issues)" def transport(msg), do: %__MODULE__{type: :transport, message: msg} @doc "Creates an HTTP error with status code and response body" def http(status, body), do: %__MODULE__{type: :http, message: "HTTP #{status}", details: body} @doc "Creates an XML parsing error" def xml(msg), do: %__MODULE__{type: :xml, message: msg} @doc "Creates a CalDAV protocol error" def protocol(msg), do: %__MODULE__{type: :protocol, message: msg} @doc "Creates a not found error (HTTP 404)" def not_found, do: %__MODULE__{type: :not_found} @doc "Creates an unauthorized error (HTTP 401)" def unauthorized, do: %__MODULE__{type: :unauthorized} @doc "Creates a conflict error (HTTP 409)" def conflict, do: %__MODULE__{type: :conflict} @doc """ Converts an error to a human-readable string. ## Examples error = CalDAVEx.Error.http(404, "Not found") CalDAVEx.Error.to_string(error) # => "[caldav_ex] HTTP error: HTTP 404 - Not found" """ def to_string(%__MODULE__{} = e) do "[caldav_ex] " <> case e.type do :transport -> "Transport error: #{e.message}" :http -> "HTTP error: #{e.message} - #{e.details}" :xml -> "XML error: #{e.message}" :protocol -> "Protocol error: #{e.message}" :not_found -> "Not found" :unauthorized -> "Unauthorized" :conflict -> "Conflict" _ -> "Unknown error" end end end