use crate::{
error::{CanvasError, Result},
http::Requester,
params::flatten_params,
};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Default, Clone, Serialize)]
pub struct UpdateTabParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub hidden: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub position: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
pub struct Tab {
pub id: Option<String>,
pub html_url: Option<String>,
pub full_url: Option<String>,
pub label: Option<String>,
#[serde(rename = "type")]
pub tab_type: Option<String>,
pub hidden: Option<bool>,
pub visibility: Option<String>,
pub position: Option<u64>,
#[serde(skip)]
pub(crate) requester: Option<Arc<Requester>>,
#[serde(skip)]
pub course_id: Option<u64>,
}
impl Tab {
pub async fn update(&self, params: UpdateTabParams) -> Result<Tab> {
let course_id = self.course_id.ok_or_else(|| CanvasError::BadRequest {
message: "Can only update tabs from a Course.".to_string(),
errors: vec![],
})?;
let tab_id = self.id.as_deref().unwrap_or("");
let form = flatten_params(&serde_json::to_value(¶ms).unwrap());
let mut tab: Tab = self
.req()
.put(&format!("courses/{course_id}/tabs/{tab_id}"), &form)
.await?;
tab.requester = self.requester.clone();
tab.course_id = self.course_id;
Ok(tab)
}
}