flipt 1.4.0

Flipt Server SDK
Documentation
use serde::Deserialize;
use std::{
    error::Error,
    fmt::{Display, Formatter, Result},
};

#[derive(Debug, Clone, Deserialize)]
#[non_exhaustive]
pub struct UpstreamError {
    pub code: i32,
    pub message: String,
    pub details: Option<Vec<serde_json::Value>>,
}

impl Default for UpstreamError {
    fn default() -> Self {
        Self {
            code: 0,
            message: "internal error".into(),
            details: Some(Vec::new()),
        }
    }
}

impl UpstreamError {
    pub fn default_with_message(message: String) -> Self {
        Self {
            code: 0,
            message,
            details: Some(Vec::new()),
        }
    }
}

impl Error for UpstreamError {}

impl Display for UpstreamError {
    fn fmt(&self, f: &mut Formatter) -> Result {
        write!(f, "{}", self.message)?;
        if let Some(details) = &self.details.as_ref().filter(|d| !d.is_empty()) {
            write!(f, "\nDetails:")?;
            for error in details.iter() {
                write!(f, "\n- {error}")?;
            }
        }
        Ok(())
    }
}

#[derive(Debug, Clone)]
pub struct ClientError {
    pub message: String,
}

impl ClientError {
    pub fn new(message: String) -> Self {
        Self { message }
    }
}

impl Error for ClientError {}

impl Display for ClientError {
    fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
        write!(f, "Client error: {}", self.message)
    }
}