cloudiful-docling-convert 0.2.1

Core Rust library for Docling-backed document conversion
Documentation
use reqwest::Client;

use crate::error::{PdfConvertError, Result};
use crate::models::TaskStatusResponse;

use super::client::{extract_error_details, get_request, retry_with_backoff};

pub async fn check_task_status(
    client: &Client,
    docling_base_url: &str,
    task_id: &str,
) -> Result<bool> {
    let operation =
        || async { check_task_status_internal(client, docling_base_url, task_id).await };

    retry_with_backoff(operation, &format!("check_task_status({})", task_id)).await
}

async fn check_task_status_internal(
    client: &Client,
    docling_base_url: &str,
    task_id: &str,
) -> Result<bool> {
    let url = format!("{}/status/poll/{}", docling_base_url, task_id);
    let response = get_request(client, &url, "Polling task status").await?;

    let response_text = response.text().await?;

    match serde_json::from_str::<TaskStatusResponse>(&response_text) {
        Ok(status_response) => {
            let status = status_response.task_status.as_str();
            match status {
                "success" => Ok(true),
                "failure" | "revoked" => {
                    let error_details = extract_error_details(&response_text);
                    Err(PdfConvertError::api_task_failed(status, error_details))
                }
                _ => Ok(false),
            }
        }
        Err(_) => Err(PdfConvertError::parse_error(
            "task status response",
            format!(
                "Task {} returned invalid response: {}",
                task_id, response_text
            ),
        )),
    }
}