Skip to main content

canvas_lms_api/resources/
external_tool.rs

1use crate::{error::Result, http::Requester, params::wrap_params};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use std::sync::Arc;
5
6/// A Canvas external (LTI) tool.
7#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
8pub struct ExternalTool {
9    pub id: u64,
10    pub name: Option<String>,
11    pub description: Option<String>,
12    pub url: Option<String>,
13    pub domain: Option<String>,
14    pub consumer_key: Option<String>,
15    pub course_id: Option<u64>,
16    pub account_id: Option<u64>,
17    pub workflow_state: Option<String>,
18    pub privacy_level: Option<String>,
19    pub custom_fields: Option<Value>,
20    pub course_navigation: Option<Value>,
21    pub account_navigation: Option<Value>,
22    pub user_navigation: Option<Value>,
23    pub editor_button: Option<Value>,
24    pub resource_selection: Option<Value>,
25    pub homework_submission: Option<Value>,
26    pub selection_width: Option<u64>,
27    pub selection_height: Option<u64>,
28    pub icon_url: Option<String>,
29    pub is_rce_favorite: Option<bool>,
30    pub is_top_nav_favorite: Option<bool>,
31
32    #[serde(skip)]
33    pub(crate) requester: Option<Arc<Requester>>,
34}
35
36/// Parameters for creating or updating an external tool.
37#[derive(Debug, Default, Clone, Serialize)]
38pub struct ExternalToolParams {
39    pub name: Option<String>,
40    pub privacy_level: Option<String>,
41    pub consumer_key: Option<String>,
42    pub shared_secret: Option<String>,
43    pub description: Option<String>,
44    pub url: Option<String>,
45    pub domain: Option<String>,
46    pub icon_url: Option<String>,
47    pub text: Option<String>,
48    pub is_rce_favorite: Option<bool>,
49}
50
51impl ExternalTool {
52    fn parent_type(&self) -> &'static str {
53        if self.course_id.is_some() {
54            "course"
55        } else {
56            "account"
57        }
58    }
59
60    fn parent_id(&self) -> u64 {
61        self.course_id
62            .or(self.account_id)
63            .expect("ExternalTool missing course_id and account_id")
64    }
65
66    /// Update this external tool.
67    ///
68    /// # Canvas API
69    /// `PUT /api/v1/courses/:course_id/external_tools/:id`
70    /// `PUT /api/v1/accounts/:account_id/external_tools/:id`
71    pub async fn edit(&self, params: ExternalToolParams) -> Result<ExternalTool> {
72        let form = wrap_params("external_tool", &params);
73        let mut tool: ExternalTool = self
74            .req()
75            .put(
76                &format!(
77                    "{}s/{}/external_tools/{}",
78                    self.parent_type(),
79                    self.parent_id(),
80                    self.id
81                ),
82                &form,
83            )
84            .await?;
85        tool.requester = self.requester.clone();
86        Ok(tool)
87    }
88
89    /// Delete this external tool.
90    ///
91    /// # Canvas API
92    /// `DELETE /api/v1/courses/:course_id/external_tools/:id`
93    /// `DELETE /api/v1/accounts/:account_id/external_tools/:id`
94    pub async fn delete(&self) -> Result<ExternalTool> {
95        let mut tool: ExternalTool = self
96            .req()
97            .delete(
98                &format!(
99                    "{}s/{}/external_tools/{}",
100                    self.parent_type(),
101                    self.parent_id(),
102                    self.id
103                ),
104                &[],
105            )
106            .await?;
107        tool.requester = self.requester.clone();
108        Ok(tool)
109    }
110}