1use beeper_desktop_api::BeeperClient;
2use std::env;
3
4#[tokio::main]
5async fn main() -> Result<(), Box<dyn std::error::Error>> {
6 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 let search_query = env::args()
16 .nth(1)
17 .unwrap_or_else(|| "hello".to_string());
18
19 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 let client = BeeperClient::new(&token, &base_url);
29
30 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 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 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 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 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 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 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}