Skip to main content

canvas_lms_api/resources/
progress.rs

1use crate::{error::Result, http::Requester};
2use chrono::{DateTime, Utc};
3use serde::{Deserialize, Serialize};
4use std::sync::Arc;
5
6/// A Canvas background job progress object.
7///
8/// Poll [`Progress::query()`] until `workflow_state` is `"completed"` or `"failed"`.
9#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
10pub struct Progress {
11    pub id: u64,
12    pub context_id: Option<u64>,
13    pub context_type: Option<String>,
14    pub user_id: Option<u64>,
15    pub tag: Option<String>,
16    pub completion: Option<f64>,
17    pub workflow_state: Option<String>,
18    pub created_at: Option<DateTime<Utc>>,
19    pub updated_at: Option<DateTime<Utc>>,
20    pub message: Option<String>,
21    pub results: Option<serde_json::Value>,
22    pub url: Option<String>,
23
24    #[serde(skip)]
25    pub(crate) requester: Option<Arc<Requester>>,
26}
27
28impl Progress {
29    /// Fetch the latest state of this background job.
30    ///
31    /// # Canvas API
32    /// `GET /api/v1/progress/:id`
33    pub async fn query(&self) -> Result<Progress> {
34        let mut p: Progress = self
35            .req()
36            .get(&format!("progress/{}", self.id), &[])
37            .await?;
38        p.requester = self.requester.clone();
39        Ok(p)
40    }
41}