Skip to main content

canvas_lms_api/resources/
tab.rs

1use crate::{
2    error::{CanvasError, Result},
3    http::Requester,
4    params::flatten_params,
5};
6use serde::{Deserialize, Serialize};
7use std::sync::Arc;
8
9/// Parameters for updating a course tab.
10#[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/// A navigation tab in a Canvas course or account.
19#[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    /// Set when the tab was retrieved from a course. `None` for group tabs.
34    #[serde(skip)]
35    pub course_id: Option<u64>,
36}
37
38impl Tab {
39    /// Update this tab's position or visibility.
40    ///
41    /// Only course tabs can be updated; group tabs raise an error.
42    ///
43    /// # Canvas API
44    /// `PUT /api/v1/courses/:course_id/tabs/:tab_id`
45    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(&params).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}