use composio_sdk::{ComposioClient, ComposioError};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Composio Rust SDK - Basic Usage Example ===\n");
println!("Step 1: Initializing Composio client...");
let client = ComposioClient::builder()
.api_key(std::env::var("COMPOSIO_API_KEY")?)
.build()?;
println!("✓ Client initialized successfully\n");
println!("Step 2: Creating a session for user 'demo_user_123'...");
let session = client
.create_session("demo_user_123")
.toolkits(vec!["github", "gmail"]) .manage_connections(true) .send()
.await?;
println!("✓ Session created successfully");
println!(" Session ID: {}", session.session_id());
println!(" MCP URL: {}", session.mcp_url());
println!(" Available tools: {} meta tools", session.tools().len());
println!();
println!("Step 3: Creating a session with specific toolkits enabled...");
let github_session = client
.create_session("demo_user_123")
.toolkits(vec!["github"]) .send()
.await?;
println!("✓ GitHub-only session created: {}", github_session.session_id());
println!();
println!("Step 4: Creating a session with specific toolkits disabled...");
let filtered_session = client
.create_session("demo_user_123")
.disable_toolkits(vec!["exa", "firecrawl"]) .send()
.await?;
println!("✓ Filtered session created: {}", filtered_session.session_id());
println!();
println!("Step 5: Executing a tool (GITHUB_GET_REPOS)...");
match github_session
.execute_tool(
"GITHUB_GET_REPOS",
json!({
"owner": "composio",
"type": "public"
}),
)
.await
{
Ok(result) => {
println!("✓ Tool executed successfully");
println!(" Log ID: {}", result.log_id);
if let Some(error) = result.error {
println!(" Tool Error: {}", error);
} else {
println!(" Result:");
println!("{}", serde_json::to_string_pretty(&result.data)?);
}
}
Err(e) => {
eprintln!("✗ Tool execution failed: {}", e);
handle_error(&e);
}
}
println!();
println!("Step 6: Demonstrating error handling...");
match github_session
.execute_tool("INVALID_TOOL_SLUG", json!({}))
.await
{
Ok(_) => {
println!(" Unexpected success");
}
Err(e) => {
println!("✓ Error caught as expected");
handle_error(&e);
}
}
println!();
match github_session
.execute_tool(
"GITHUB_CREATE_ISSUE",
json!({
}),
)
.await
{
Ok(_) => {
println!(" Unexpected success");
}
Err(e) => {
println!("✓ Error caught as expected");
handle_error(&e);
}
}
println!();
println!("Step 7: Listing available toolkits...");
match session.list_toolkits().send().await {
Ok(toolkits) => {
println!("✓ Found {} toolkits", toolkits.items.len());
for toolkit in toolkits.items.iter().take(5) {
let status = if toolkit.connected_account.is_some() {
"✓ Connected"
} else {
"○ Not connected"
};
println!(" {} - {} ({})", toolkit.slug, toolkit.name, status);
}
if toolkits.items.len() > 5 {
println!(" ... and {} more", toolkits.items.len() - 5);
}
}
Err(e) => {
eprintln!("✗ Failed to list toolkits: {}", e);
}
}
println!();
println!("=== Example completed successfully! ===\n");
println!("Next steps:");
println!("- Check out examples/meta_tools.rs for meta tool usage");
println!("- Check out examples/auth_link_creation.rs for authentication flows");
println!("- Check out examples/toolkit_listing.rs for advanced filtering");
println!("- Read the documentation: cargo doc --open");
Ok(())
}
fn handle_error(error: &ComposioError) {
match error {
ComposioError::ApiError {
status,
message,
code,
slug,
request_id,
suggested_fix,
errors,
} => {
println!(" Error Type: API Error");
println!(" Status Code: {}", status);
println!(" Message: {}", message);
if let Some(code) = code {
println!(" Error Code: {}", code);
}
if let Some(slug) = slug {
println!(" Error Slug: {}", slug);
}
if let Some(request_id) = request_id {
println!(" Request ID: {} (use this when contacting support)", request_id);
}
if let Some(fix) = suggested_fix {
println!(" 💡 Suggested Fix: {}", fix);
}
if let Some(errors) = errors {
if !errors.is_empty() {
println!(" Detailed Errors:");
for err in errors {
if let Some(field) = &err.field {
println!(" - {}: {}", field, err.message);
} else {
println!(" - {}", err.message);
}
}
}
}
match *status {
400 => println!(" ℹ️ This is a client error - check your request parameters"),
401 => println!(" ℹ️ Authentication failed - check your API key"),
403 => println!(" ℹ️ Access forbidden - check your permissions"),
404 => println!(" ℹ️ Resource not found - check the tool slug or session ID"),
429 => println!(" ℹ️ Rate limited - the SDK will automatically retry"),
500..=599 => println!(" ℹ️ Server error - the SDK will automatically retry"),
_ => {}
}
}
ComposioError::NetworkError(e) => {
println!(" Error Type: Network Error");
println!(" Message: {}", e);
println!(" ℹ️ Check your internet connection - the SDK will automatically retry");
}
ComposioError::SerializationError(e) => {
println!(" Error Type: Serialization Error");
println!(" Message: {}", e);
println!(" ℹ️ This indicates a JSON parsing issue - check your arguments");
}
ComposioError::InvalidInput(msg) => {
println!(" Error Type: Invalid Input");
println!(" Message: {}", msg);
println!(" ℹ️ Fix the input validation error and try again");
}
ComposioError::ConfigError(msg) => {
println!(" Error Type: Configuration Error");
println!(" Message: {}", msg);
println!(" ℹ️ Check your SDK configuration (API key, base URL, etc.)");
}
}
}