Skip to main content

canvas_lms_api/resources/
feature.rs

1use crate::{error::Result, http::Requester};
2use serde::{Deserialize, Serialize};
3use std::sync::Arc;
4
5/// Metadata about a Canvas feature flag option.
6#[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/// The state of a feature flag for a particular context (account, course, or user).
19#[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    /// One of: `"on"`, `"off"`, `"allowed"`, `"allowed_on"`, `"hidden"`
25    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    /// Remove this feature flag, reverting to the inherited value.
42    ///
43    /// # Canvas API
44    /// `DELETE /api/v1/:context_type/:context_id/features/flags/:feature`
45    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    /// Set this feature flag to the given state.
52    ///
53    /// `state` must be one of: `"on"`, `"off"`, `"allowed"`, `"allowed_on"`, `"hidden"`.
54    ///
55    /// # Canvas API
56    /// `PUT /api/v1/:context_type/:context_id/features/flags/:feature`
57    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(), &params).await?;
60        ff.requester = self.requester.clone();
61        Ok(ff)
62    }
63}