flipt 0.5.0

Official Rust SDK for Flipt
Documentation
use crate::api::{ApiClient, Result, DEFAULT_NAMESPACE};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

pub struct ConstraintClient<'client> {
    client: &'client ApiClient,
}

impl<'client> ConstraintClient<'client> {
    pub fn new(client: &'client ApiClient) -> Self {
        Self { client }
    }

    pub async fn create(&self, create: &ConstraintCreateRequest) -> Result<Constraint> {
        let path = format!(
            "/api/v1/namespaces/{namespace_key}/segments/{segment_key}/constraints",
            namespace_key = create
                .namespace_key
                .as_ref()
                .unwrap_or(&DEFAULT_NAMESPACE.to_string()),
            segment_key = create.segment_key
        );
        self.client.post(&path, Some(create)).await
    }

    pub async fn delete(&self, delete: &ConstraintDeleteRequest) -> Result<ConstraintDeletion> {
        let path = format!(
            "/api/v1/namespaces/{namespace_key}/segments/{segment_key}/constraints/{id}",
            namespace_key = delete
                .namespace_key
                .as_ref()
                .unwrap_or(&DEFAULT_NAMESPACE.to_string()),
            segment_key = delete.segment_key,
            id = delete.id
        );
        self.client.delete(&path, None::<&()>).await
    }

    pub async fn update(&self, update: &ConstraintUpdateRequest) -> Result<Constraint> {
        let path = format!(
            "/api/v1/namespaces/{namespace_key}/segments/{segment_key}/constraints/{id}",
            namespace_key = update
                .namespace_key
                .as_ref()
                .unwrap_or(&DEFAULT_NAMESPACE.to_string()),
            segment_key = update.segment_key,
            id = update.id
        );
        self.client.put(&path, Some(update)).await
    }
}

#[derive(Debug, Default, Serialize)]
pub struct ConstraintCreateRequest {
    #[serde(skip_serializing)]
    pub namespace_key: Option<String>,
    #[serde(skip_serializing)]
    pub segment_key: String,
    pub operator: Operator,
    pub property: String,
    #[serde(rename = "type")]
    pub comparison_type: ComparisonType,
    pub value: String,
    pub description: String,
}

#[derive(Debug, Default, Serialize)]
pub struct ConstraintUpdateRequest {
    #[serde(skip_serializing)]
    pub namespace_key: Option<String>,
    #[serde(skip_serializing)]
    pub segment_key: String,
    #[serde(skip_serializing)]
    pub id: String,
    pub operator: Operator,
    pub property: String,
    #[serde(rename = "type")]
    pub comparison_type: ComparisonType,
    pub value: String,
    pub description: String,
}

#[derive(Debug, Default)]
pub struct ConstraintDeleteRequest {
    pub namespace_key: Option<String>,
    pub segment_key: String,
    pub id: String,
}

#[derive(Debug, Clone, Deserialize)]
pub struct ConstraintDeletion {}

#[derive(Debug, Default, Deserialize, Serialize, Clone, Eq, PartialEq)]
pub enum ComparisonType {
    #[default]
    #[serde(rename = "UNKNOWN_COMPARISON_TYPE")]
    Unknown,
    #[serde(rename = "STRING_COMPARISON_TYPE")]
    String,
    #[serde(rename = "NUMBER_COMPARISON_TYPE")]
    Number,
    #[serde(rename = "BOOLEAN_COMPARISON_TYPE")]
    Boolean,
    #[serde(rename = "DATETIME_COMPARISON_TYPE")]
    DateTime,
}

#[derive(Debug, Default, Deserialize, Serialize, Clone, Eq, PartialEq)]
pub enum Operator {
    #[default]
    #[serde(rename = "eq")]
    Eq,
    #[serde(rename = "neq")]
    NotEq,
    #[serde(rename = "lt")]
    Lt,
    #[serde(rename = "lte")]
    Lte,
    #[serde(rename = "gt")]
    Gt,
    #[serde(rename = "gte")]
    Gte,
    #[serde(rename = "empty")]
    Empty,
    #[serde(rename = "notempty")]
    NotEmpty,
    #[serde(rename = "true")]
    True,
    #[serde(rename = "false")]
    False,
    #[serde(rename = "present")]
    Present,
    #[serde(rename = "notpresent")]
    NotPresent,
    #[serde(rename = "prefix")]
    Prefix,
    #[serde(rename = "suffix")]
    Suffix,
}

#[derive(Debug, Clone, Eq, PartialEq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Constraint {
    pub id: String,
    pub operator: Operator,
    pub property: String,
    #[serde(rename = "type")]
    pub comparison_type: ComparisonType,
    pub value: String,
    pub description: String,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
}