use tracing::{debug, trace, warn};
use super::{request::*, response::*};
use crate::{
ZaiResult,
client::{ZaiClient, error::codes},
};
pub struct FileParserResultRequest {
pub task_id: String,
}
impl FileParserResultRequest {
pub fn new(task_id: impl Into<String>) -> Self {
Self {
task_id: task_id.into(),
}
}
pub async fn get_result_via(
&self,
client: &ZaiClient,
format_type: FormatType,
) -> ZaiResult<FileParserResultResponse> {
let route = crate::client::routes::FILES_PARSE_RESULT;
let format_type = format_type.to_string();
let url = client
.endpoints()
.resolve_route(route, &[&self.task_id, &format_type])?;
trace!(url = %url, "Fetching file parser result");
client
.send_empty::<FileParserResultResponse>(route.method(), url)
.await
}
pub async fn wait_for_result_via(
&self,
client: &ZaiClient,
format_type: FormatType,
timeout_seconds: u64,
poll_interval_seconds: u64,
) -> ZaiResult<FileParserResultResponse> {
debug!(
timeout_seconds,
poll_interval_seconds, "Polling file parser result"
);
let start_time = std::time::Instant::now();
loop {
trace!("Checking file parser result status");
let result = self.get_result_via(client, format_type.clone()).await?;
match result.status {
ParserStatus::Succeeded => {
debug!("File parsing completed successfully");
return Ok(result);
},
ParserStatus::Failed => {
warn!(
task_id = %self.task_id,
message = %result.message,
"File parsing task reported failure"
);
return Err(crate::client::error::ZaiError::ApiError {
code: codes::SDK_EXTERNAL_TOOL,
message: format!("Parsing failed: {}", result.message),
});
},
ParserStatus::Processing => {
let elapsed = start_time.elapsed().as_secs();
trace!(elapsed, "File parser result still processing");
if elapsed > timeout_seconds {
warn!(
task_id = %self.task_id,
elapsed,
timeout_seconds,
"Polling timed out waiting for parsing result"
);
return Err(crate::client::error::ZaiError::ApiError {
code: codes::SDK_TIMEOUT,
message: "Timeout waiting for parsing result".to_string(),
});
}
tokio::time::sleep(tokio::time::Duration::from_secs(poll_interval_seconds))
.await;
},
}
}
}
pub async fn get_all_results_via(
&self,
client: &ZaiClient,
) -> ZaiResult<(FileParserResultResponse, FileParserResultResponse)> {
let text_result = self.get_result_via(client, FormatType::Text).await?;
let download_result = self
.get_result_via(client, FormatType::DownloadLink)
.await?;
Ok((text_result, download_result))
}
}