canvas_lms_api/resources/
tab.rs1use crate::{
2 error::{CanvasError, Result},
3 http::Requester,
4 params::flatten_params,
5};
6use serde::{Deserialize, Serialize};
7use std::sync::Arc;
8
9#[derive(Debug, Default, Clone, Serialize)]
11pub struct UpdateTabParams {
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub hidden: Option<bool>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub position: Option<u64>,
16}
17
18#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
20pub struct Tab {
21 pub id: Option<String>,
22 pub html_url: Option<String>,
23 pub full_url: Option<String>,
24 pub label: Option<String>,
25 #[serde(rename = "type")]
26 pub tab_type: Option<String>,
27 pub hidden: Option<bool>,
28 pub visibility: Option<String>,
29 pub position: Option<u64>,
30
31 #[serde(skip)]
32 pub(crate) requester: Option<Arc<Requester>>,
33 #[serde(skip)]
35 pub course_id: Option<u64>,
36}
37
38impl Tab {
39 pub async fn update(&self, params: UpdateTabParams) -> Result<Tab> {
46 let course_id = self.course_id.ok_or_else(|| CanvasError::BadRequest {
47 message: "Can only update tabs from a Course.".to_string(),
48 errors: vec![],
49 })?;
50 let tab_id = self.id.as_deref().unwrap_or("");
51 let form = flatten_params(&serde_json::to_value(¶ms).unwrap());
52 let mut tab: Tab = self
53 .req()
54 .put(&format!("courses/{course_id}/tabs/{tab_id}"), &form)
55 .await?;
56 tab.requester = self.requester.clone();
57 tab.course_id = self.course_id;
58 Ok(tab)
59 }
60}