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)]
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 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 pub async fn edit(&self, params: ExternalToolParams) -> Result<ExternalTool> {
76 let form = wrap_params("external_tool", ¶ms);
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 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}