claude_codes/lib.rs
1//! A tightly typed Rust interface for the Claude Code JSON protocol
2//!
3//! This crate provides type-safe bindings for interacting with the Claude CLI
4//! through its JSON Lines protocol. It handles the complexity of message serialization,
5//! deserialization, and streaming communication with Claude.
6//!
7//! # Quick Start
8//!
9//! Add this crate to your project:
10//! ```bash
11//! cargo add claude-codes
12//! ```
13//!
14//! ## Using the Async Client (Recommended)
15//!
16//! ```ignore
17//! use claude_codes::AsyncClient;
18//!
19//! #[tokio::main]
20//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
21//! // Create a client with automatic version checking
22//! let mut client = AsyncClient::with_defaults().await?;
23//!
24//! // Send a query and stream responses
25//! let mut stream = client.query_stream("What is 2 + 2?").await?;
26//!
27//! while let Some(response) = stream.next().await {
28//! match response {
29//! Ok(output) => {
30//! println!("Received: {}", output.message_type());
31//! // Handle different message types
32//! }
33//! Err(e) => eprintln!("Error: {}", e),
34//! }
35//! }
36//!
37//! Ok(())
38//! }
39//! ```
40//!
41//! ## Using the Sync Client
42//!
43//! ```ignore
44//! use claude_codes::{SyncClient, ClaudeInput};
45//!
46//! fn main() -> Result<(), Box<dyn std::error::Error>> {
47//! // Create a synchronous client
48//! let mut client = SyncClient::with_defaults()?;
49//!
50//! // Build a structured input message
51//! let input = ClaudeInput::user_message("What is 2 + 2?", uuid::Uuid::new_v4());
52//!
53//! // Send and collect all responses
54//! let responses = client.query(input)?;
55//!
56//! for response in responses {
57//! println!("Received: {}", response.message_type());
58//! }
59//!
60//! Ok(())
61//! }
62//! ```
63//!
64//! # Architecture
65//!
66//! The crate is organized into several key modules:
67//!
68//! - [`client`] - High-level async and sync clients for easy interaction
69//! - [`protocol`] - Core JSON Lines protocol implementation
70//! - [`io`] - Top-level message types (`ClaudeInput`, `ClaudeOutput`)
71//! - [`messages`] - Detailed message structures for requests and responses
72//! - [`cli`] - Builder for configuring Claude CLI invocation
73//! - [`error`] - Error types and result aliases
74//! - [`version`] - Version compatibility checking
75//!
76//! # Version Compatibility
77//!
78//! ⚠️ **Important**: The Claude CLI protocol is unstable and evolving. This crate
79//! automatically checks your Claude CLI version and warns if it's newer than tested.
80//!
81//! Current tested version: **2.1.3**
82//!
83//! Report compatibility issues at: <https://github.com/meawoppl/rust-claude-codes/pulls>
84//!
85//! # Message Types
86//!
87//! The protocol uses several message types:
88//!
89//! - **System** - Initialization and metadata messages
90//! - **User** - Input messages from the user
91//! - **Assistant** - Claude's responses
92//! - **Result** - Session completion with timing and cost info
93//!
94//! # Examples
95//!
96//! See the `examples/` directory for complete working examples:
97//! - `async_client.rs` - Simple async client usage
98//! - `sync_client.rs` - Synchronous client usage
99//! - `basic_repl.rs` - Interactive REPL implementation
100
101// Core modules always available
102pub mod error;
103pub mod io;
104pub mod messages;
105pub mod protocol;
106pub mod tool_inputs;
107pub mod types;
108
109// Client modules
110#[cfg(feature = "async-client")]
111pub mod client_async;
112#[cfg(feature = "sync-client")]
113pub mod client_sync;
114
115// Client-related modules
116#[cfg(any(feature = "sync-client", feature = "async-client"))]
117pub mod cli;
118#[cfg(any(feature = "sync-client", feature = "async-client"))]
119pub mod version;
120
121// Core exports always available
122pub use error::{Error, Result};
123pub use io::{
124 AnthropicError, AnthropicErrorDetails, AssistantMessageContent, ClaudeInput, ClaudeOutput,
125 ParseError,
126};
127pub use messages::*;
128pub use protocol::{MessageEnvelope, Protocol};
129pub use types::*;
130
131// Content block types for message parsing
132pub use io::{
133 ContentBlock, ImageBlock, ImageSource, TextBlock, ThinkingBlock, ToolResultBlock,
134 ToolResultContent,
135};
136
137// Control protocol types for tool permission handling
138pub use io::{
139 ControlRequest, ControlRequestMessage, ControlRequestPayload, ControlResponse,
140 ControlResponseMessage, ControlResponsePayload, HookCallbackRequest, InitializeRequest,
141 McpMessageRequest, Permission, PermissionDenial, PermissionResult, PermissionRule,
142 PermissionSuggestion, ToolPermissionRequest, ToolUseBlock,
143};
144
145// System message subtype types
146pub use io::{
147 CompactBoundaryMessage, CompactMetadata, InitMessage, PluginInfo, StatusMessage, SystemMessage,
148};
149
150// Rate limit types
151pub use io::{RateLimitEvent, RateLimitInfo};
152
153// Usage types
154pub use io::{AssistantUsage, CacheCreationDetails};
155
156// Typed tool input types
157pub use tool_inputs::{
158 AllowedPrompt, AskUserQuestionInput, BashInput, EditInput, EnterPlanModeInput,
159 ExitPlanModeInput, GlobInput, GrepInput, KillShellInput, NotebookEditInput, Question,
160 QuestionMetadata, QuestionOption, ReadInput, SkillInput, TaskInput, TaskOutputInput, TodoItem,
161 TodoWriteInput, ToolInput, WebFetchInput, WebSearchInput, WriteInput,
162};
163
164// Client exports
165#[cfg(feature = "async-client")]
166pub use client_async::{AsyncClient, AsyncStreamProcessor};
167#[cfg(feature = "sync-client")]
168pub use client_sync::{StreamProcessor, SyncClient};
169
170// Client-related exports
171#[cfg(any(feature = "sync-client", feature = "async-client"))]
172pub use cli::{ClaudeCliBuilder, CliFlag, InputFormat, OutputFormat, PermissionMode};
173
174#[cfg(test)]
175mod tests {
176 #[test]
177 fn it_works() {
178 assert_eq!(2 + 2, 4);
179 }
180}