-module(claude@types@message). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/claude/types/message.gleam"). -export([new_user/1, new_user_blocks/1, new_assistant_blocks/1, content_to_params/1]). -export_type([role/0, stop_reason/0, message_param/0, message_content/0, message/0, usage/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -type role() :: user | assistant. -type stop_reason() :: end_turn | tool_use_stop | max_tokens | stop_sequence | pause_turn | refusal. -type message_param() :: {message_param, role(), message_content()}. -type message_content() :: {string_content, binary()} | {block_content, list(claude@types@content:content_block_param())}. -type message() :: {message, binary(), role(), list(claude@types@content:content_block()), binary(), gleam@option:option(stop_reason()), gleam@option:option(binary()), usage()}. -type usage() :: {usage, integer(), integer(), gleam@option:option(integer()), gleam@option:option(integer())}. -file("src/claude/types/message.gleam", 60). ?DOC(" Create a user message with plain text content.\n"). -spec new_user(binary()) -> message_param(). new_user(Text) -> {message_param, user, {string_content, Text}}. -file("src/claude/types/message.gleam", 65). ?DOC(" Create a user message with structured content blocks.\n"). -spec new_user_blocks(list(claude@types@content:content_block_param())) -> message_param(). new_user_blocks(Blocks) -> {message_param, user, {block_content, Blocks}}. -file("src/claude/types/message.gleam", 70). ?DOC(" Create an assistant message with structured content blocks.\n"). -spec new_assistant_blocks(list(claude@types@content:content_block_param())) -> message_param(). new_assistant_blocks(Blocks) -> {message_param, assistant, {block_content, Blocks}}. -file("src/claude/types/message.gleam", 82). -spec block_to_param(claude@types@content:content_block()) -> {ok, claude@types@content:content_block_param()} | {error, nil}. block_to_param(Block) -> case Block of {text, T, _} -> {ok, {text_param, T}}; {tool_use, Id, Name, Input} -> {ok, {tool_use_param, Id, Name, Input}}; {thinking, T@1, S} -> {ok, {thinking_param, T@1, S}}; {redacted_thinking, D} -> {ok, {redacted_thinking_param, D}}; {server_tool_use, Id@1, Name@1, Input@1} -> {ok, {server_tool_use_param, Id@1, Name@1, Input@1}}; {web_search_result, _, _, _, _} -> {error, nil} end. -file("src/claude/types/message.gleam", 78). ?DOC( " Convert API response content blocks to content block params.\n" " Maps Text -> TextParam, ToolUse -> ToolUseParam, Thinking -> ThinkingParam,\n" " RedactedThinking -> RedactedThinkingParam, ServerToolUse -> ServerToolUseParam.\n" " WebSearchResult blocks are filtered out as they have no corresponding param type.\n" ). -spec content_to_params(list(claude@types@content:content_block())) -> list(claude@types@content:content_block_param()). content_to_params(Content) -> gleam@list:filter_map(Content, fun block_to_param/1).