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)]
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 req(&self) -> &Arc<Requester> {
53        self.requester.as_ref().expect("requester not initialized")
54    }
55
56    fn parent_type(&self) -> &'static str {
57        if self.course_id.is_some() {
58            "course"
59        } else {
60            "account"
61        }
62    }
63
64    fn parent_id(&self) -> u64 {
65        self.course_id
66            .or(self.account_id)
67            .expect("ExternalTool missing course_id and account_id")
68    }
69
70    /// Update this external tool.
71    ///
72    /// # Canvas API
73    /// `PUT /api/v1/courses/:course_id/external_tools/:id`
74    /// `PUT /api/v1/accounts/:account_id/external_tools/:id`
75    pub async fn edit(&self, params: ExternalToolParams) -> Result<ExternalTool> {
76        let form = wrap_params("external_tool", &params);
77        let mut tool: ExternalTool = self
78            .req()
79            .put(
80                &format!(
81                    "{}s/{}/external_tools/{}",
82                    self.parent_type(),
83                    self.parent_id(),
84                    self.id
85                ),
86                &form,
87            )
88            .await?;
89        tool.requester = self.requester.clone();
90        Ok(tool)
91    }
92
93    /// Delete this external tool.
94    ///
95    /// # Canvas API
96    /// `DELETE /api/v1/courses/:course_id/external_tools/:id`
97    /// `DELETE /api/v1/accounts/:account_id/external_tools/:id`
98    pub async fn delete(&self) -> Result<ExternalTool> {
99        let mut tool: ExternalTool = self
100            .req()
101            .delete(
102                &format!(
103                    "{}s/{}/external_tools/{}",
104                    self.parent_type(),
105                    self.parent_id(),
106                    self.id
107                ),
108                &[],
109            )
110            .await?;
111        tool.requester = self.requester.clone();
112        Ok(tool)
113    }
114}