canvas_lms_api/resources/
external_tool.rs1use crate::{error::Result, http::Requester, params::wrap_params};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4use std::sync::Arc;
5
6#[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#[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 pub async fn edit(&self, params: ExternalToolParams) -> Result<ExternalTool> {
72 let form = wrap_params("external_tool", ¶ms);
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 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}