canvas_lms_api/resources/
feature.rs1use crate::{error::Result, http::Requester};
2use serde::{Deserialize, Serialize};
3use std::sync::Arc;
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct Feature {
8 pub feature: Option<String>,
9 pub display_name: Option<String>,
10 pub applies_to: Option<String>,
11 pub enable_at: Option<String>,
12 pub beta: Option<bool>,
13 pub development: Option<bool>,
14 pub autoexpand: Option<bool>,
15 pub feature_flag: Option<FeatureFlag>,
16}
17
18#[derive(Debug, Clone, Deserialize, Serialize, canvas_lms_api_derive::CanvasResource)]
20pub struct FeatureFlag {
21 pub feature: Option<String>,
22 pub context_type: Option<String>,
23 pub context_id: Option<u64>,
24 pub state: Option<String>,
26 pub locked: Option<bool>,
27 pub transitions: Option<serde_json::Value>,
28
29 #[serde(skip)]
30 pub(crate) requester: Option<Arc<Requester>>,
31}
32
33impl FeatureFlag {
34 fn flag_path(&self) -> String {
35 let ctx = self.context_type.as_deref().unwrap_or("").to_lowercase() + "s";
36 let ctx_id = self.context_id.unwrap_or_default();
37 let feature = self.feature.as_deref().unwrap_or("");
38 format!("{ctx}/{ctx_id}/features/flags/{feature}")
39 }
40
41 pub async fn delete(&self) -> Result<FeatureFlag> {
46 let mut ff: FeatureFlag = self.req().delete(&self.flag_path(), &[]).await?;
47 ff.requester = self.requester.clone();
48 Ok(ff)
49 }
50
51 pub async fn set_feature_flag(&self, state: &str) -> Result<FeatureFlag> {
58 let params = vec![("state".to_string(), state.to_string())];
59 let mut ff: FeatureFlag = self.req().put(&self.flag_path(), ¶ms).await?;
60 ff.requester = self.requester.clone();
61 Ok(ff)
62 }
63}