use crate::api::{ApiClient, ApiError, ApiMethod, ApiResponse};
use serde_json::json;
use std::collections::HashMap;
const MAX_PAGES: usize = 1000;
pub async fn thread_get(
client: &ApiClient,
channel: String,
thread_ts: String,
limit: Option<u32>,
inclusive: Option<bool>,
) -> Result<ApiResponse, ApiError> {
let mut all_messages = Vec::new();
let mut cursor: Option<String> = None;
let mut ok = true;
let mut error: Option<String> = None;
let mut page_count = 0;
loop {
page_count += 1;
if page_count > MAX_PAGES {
return Err(ApiError::SlackError(format!(
"Pagination exceeded max pages ({}), possible infinite loop",
MAX_PAGES
)));
}
let mut params = HashMap::new();
params.insert("channel".to_string(), json!(channel));
params.insert("ts".to_string(), json!(thread_ts));
let page_limit = limit.unwrap_or(100);
params.insert("limit".to_string(), json!(page_limit));
if let Some(incl) = inclusive {
params.insert("inclusive".to_string(), json!(incl));
}
if let Some(ref cursor_val) = cursor {
params.insert("cursor".to_string(), json!(cursor_val));
}
let response = client
.call_method(ApiMethod::ConversationsReplies, params)
.await?;
if cursor.is_none() {
ok = response.ok;
error = response.error.clone();
}
if let Some(messages) = response.data.get("messages") {
if let Some(messages_array) = messages.as_array() {
all_messages.extend(messages_array.clone());
}
}
cursor = response
.data
.get("response_metadata")
.and_then(|meta| meta.get("next_cursor"))
.and_then(|c| c.as_str())
.filter(|c| !c.is_empty())
.map(|c| c.to_string());
if cursor.is_none() {
break;
}
}
let mut data = HashMap::new();
data.insert("messages".to_string(), json!(all_messages));
let mut response_metadata = HashMap::new();
response_metadata.insert("next_cursor".to_string(), json!(""));
data.insert("response_metadata".to_string(), json!(response_metadata));
Ok(ApiResponse { ok, data, error })
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_thread_get_basic() {
let client = ApiClient::with_token("test_token".to_string());
let result = thread_get(
&client,
"C123456".to_string(),
"1234567890.123456".to_string(),
None,
None,
)
.await;
assert!(result.is_err());
}
}