Skip to main content

search/
search.rs

1use beeper_desktop_api::BeeperClient;
2use std::env;
3
4#[tokio::main]
5async fn main() -> Result<(), Box<dyn std::error::Error>> {
6    // Get authentication token from environment variable
7    let token = env::var("BEEPER_TOKEN")
8        .unwrap_or_else(|_| {
9            eprintln!("Error: BEEPER_TOKEN environment variable not set");
10            eprintln!("Usage: BEEPER_TOKEN=your_token cargo run --example search");
11            std::process::exit(1);
12        });
13
14    // Get search query from command line arguments or use default
15    let search_query = env::args()
16        .nth(1)
17        .unwrap_or_else(|| "hello".to_string());
18
19    // Get API base URL from environment variable or use default
20    let base_url = env::var("BEEPER_API_URL")
21        .unwrap_or_else(|_| "http://localhost:23373".to_string());
22
23    println!("Connecting to Beeper Desktop API at: {}", base_url);
24    println!("Searching for: \"{}\"", search_query);
25    println!();
26
27    // Create a client with the provided token
28    let client = BeeperClient::new(&token, &base_url);
29
30    // Search for chats
31    println!("🔍 Searching chats...");
32    let chats_search = client.search_chats(&search_query, None, None).await?;
33    
34    println!("✅ Found {} matching chat(s):", chats_search.items.len());
35    println!();
36
37    if chats_search.items.is_empty() {
38        println!("No chats found matching \"{}\"", search_query);
39    } else {
40        for (index, chat) in chats_search.items.iter().enumerate() {
41            println!("  {}. {} ({})", index + 1, chat.title, chat.chat_type);
42            println!("     └─ Network: {}", chat.network);
43            println!("     └─ Participants: {}", chat.participants.total);
44            println!("     └─ Unread: {}", chat.unread_count);
45            if let Some(last_activity) = &chat.last_activity {
46                println!("     └─ Last Activity: {}", last_activity);
47            }
48            println!();
49        }
50    }
51
52    // Search for messages
53    println!("📨 Searching messages...");
54    let messages_search = client.search_messages(&search_query, None, None).await?;
55    
56    println!("✅ Found {} matching message(s):", messages_search.items.len());
57    println!();
58
59    if messages_search.items.is_empty() {
60        println!("No messages found matching \"{}\"", search_query);
61    } else {
62        // Group messages by chat for better display
63        let mut chats_in_results = std::collections::HashMap::new();
64        
65        for message in &messages_search.items {
66            chats_in_results
67                .entry(message.chat_id.clone())
68                .or_insert_with(Vec::new)
69                .push(message);
70        }
71
72        for (chat_id, messages) in &chats_in_results {
73            // Get chat title from search results if available
74            let chat_title = if let Some(chat) = messages_search.chats.as_ref()
75                .and_then(|chats| chats.get(chat_id))
76            {
77                chat.title.clone()
78            } else {
79                chat_id.clone()
80            };
81
82            println!("  Chat: {}", chat_title);
83            println!("  └─ {} message(s) found:", messages.len());
84
85            for (msg_index, message) in messages.iter().enumerate() {
86                let sender = message.sender_name.as_deref().unwrap_or("Unknown");
87                let text = message.text.as_deref().unwrap_or("[No text content]");
88                
89                // Truncate long messages
90                let display_text = if text.len() > 60 {
91                    format!("{}...", &text[..60])
92                } else {
93                    text.to_string()
94                };
95
96                println!("     {}. [{}] {}: {}", 
97                    msg_index + 1,
98                    message.timestamp,
99                    sender,
100                    display_text
101                );
102            }
103            println!();
104        }
105    }
106
107    // Show pagination info if available
108    if messages_search.has_more {
109        println!("â„šī¸  More results available. Use pagination with:");
110        println!("    - oldestCursor: {:?}", messages_search.oldest_cursor);
111        println!("    - newestCursor: {:?}", messages_search.newest_cursor);
112    }
113
114    // Display search summary
115    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
116    println!("📊 Search Summary for \"{}\":", search_query);
117    println!("  â€ĸ Chats: {}", chats_search.items.len());
118    println!("  â€ĸ Messages: {}", messages_search.items.len());
119    println!("  â€ĸ Total Results: {}", chats_search.items.len() + messages_search.items.len());
120    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
121
122    Ok(())
123}