Packages
claude_code
0.36.2
0.36.5
0.36.4
0.36.3
0.36.2
0.36.1
0.36.0
0.35.0
0.34.0
0.33.1
0.32.2
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Claude Agent SDK for Elixir – Build AI agents with Claude Code
Current section
Files
Jump to
Current section
Files
lib/claude_code/json_encoder.ex
defmodule ClaudeCode.JSONEncoder do
@moduledoc """
Shared JSON encoding logic for ClaudeCode structs.
Converts structs to maps with nil values removed for clean JSON output.
## Usage
Add `use ClaudeCode.JSONEncoder` inside any struct module to automatically
derive both `Jason.Encoder` and `JSON.Encoder` protocol implementations:
defmodule MyStruct do
use ClaudeCode.JSONEncoder
defstruct [:field]
end
"""
@doc false
defmacro __using__(_opts) do
quote do
defimpl Jason.Encoder, for: __MODULE__ do
def encode(struct, opts) do
struct
|> ClaudeCode.JSONEncoder.to_encodable()
|> Jason.Encoder.Map.encode(opts)
end
end
defimpl JSON.Encoder, for: __MODULE__ do
def encode(struct, encoder) do
struct
|> ClaudeCode.JSONEncoder.to_encodable()
|> JSON.Encoder.Map.encode(encoder)
end
end
end
end
@doc """
Converts a struct to an encodable map, excluding nil values.
Handles nested structs, maps, and lists recursively.
## Examples
iex> block = %ClaudeCode.Content.TextBlock{type: :text, text: "hello"}
iex> ClaudeCode.JSONEncoder.to_encodable(block)
%{type: :text, text: "hello"}
iex> msg = %ClaudeCode.Message.ResultMessage{result: nil, is_error: false, ...}
iex> ClaudeCode.JSONEncoder.to_encodable(msg)
%{is_error: false, ...} # result key excluded
"""
@spec to_encodable(struct()) :: map()
def to_encodable(%{__struct__: _} = struct) do
struct
|> Map.from_struct()
|> drop_nils()
end
defp drop_nils(map) when is_map(map) do
map
|> Enum.reject(fn {_k, v} -> is_nil(v) end)
|> Map.new(fn {k, v} -> {k, process_value(v)} end)
end
defp process_value(%{__struct__: _} = struct), do: to_encodable(struct)
defp process_value(map) when is_map(map), do: drop_nils(map)
defp process_value(list) when is_list(list), do: Enum.map(list, &process_value/1)
defp process_value(other), do: other
end