scouter-settings 0.25.0

Client and server contract for scouter
Documentation
use pyo3::prelude::*;
use scouter_types::PyHelperFuncs;
use scouter_types::TransportType;
use serde::{Serialize, Serializer};

fn redact<S: Serializer>(_: &str, s: S) -> Result<S::Ok, S::Error> {
    s.serialize_str("***")
}

#[pyclass]
#[derive(Clone, Serialize)]
pub struct GrpcConfig {
    #[pyo3(get, set)]
    pub server_uri: String,

    #[pyo3(get, set)]
    pub username: String,

    #[pyo3(set)]
    #[serde(serialize_with = "redact")]
    pub password: String,

    #[pyo3(get, set)]
    pub timeout_secs: Option<u64>,

    #[pyo3(get, set)]
    pub connect_timeout_secs: Option<u64>,

    #[pyo3(get, set)]
    pub keep_alive_interval_secs: Option<u64>,

    #[pyo3(get, set)]
    pub keep_alive_timeout_secs: Option<u64>,

    #[pyo3(get, set)]
    pub keep_alive_while_idle: Option<bool>,

    #[pyo3(get)]
    pub transport_type: TransportType,
}

impl std::fmt::Debug for GrpcConfig {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("GrpcConfig")
            .field("server_uri", &self.server_uri)
            .field("username", &self.username)
            .field("password", &"***")
            .field("timeout_secs", &self.timeout_secs)
            .field("connect_timeout_secs", &self.connect_timeout_secs)
            .field("keep_alive_interval_secs", &self.keep_alive_interval_secs)
            .field("keep_alive_timeout_secs", &self.keep_alive_timeout_secs)
            .field("keep_alive_while_idle", &self.keep_alive_while_idle)
            .field("transport_type", &self.transport_type)
            .finish()
    }
}

#[pymethods]
impl GrpcConfig {
    #[new]
    #[pyo3(signature = (
        server_uri=None,
        username=None,
        password=None,
        timeout_secs=None,
        connect_timeout_secs=None,
        keep_alive_interval_secs=None,
        keep_alive_timeout_secs=None,
        keep_alive_while_idle=None,
    ))]
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        server_uri: Option<String>,
        username: Option<String>,
        password: Option<String>,
        timeout_secs: Option<u64>,
        connect_timeout_secs: Option<u64>,
        keep_alive_interval_secs: Option<u64>,
        keep_alive_timeout_secs: Option<u64>,
        keep_alive_while_idle: Option<bool>,
    ) -> Self {
        let server_uri = server_uri.unwrap_or_else(|| {
            std::env::var("SCOUTER_GRPC_URI")
                .unwrap_or_else(|_| "http://localhost:50051".to_string())
        });

        let username = username.unwrap_or_else(|| {
            std::env::var("SCOUTER_USERNAME").unwrap_or_else(|_| "guest".to_string())
        });

        let password = password.unwrap_or_else(|| {
            std::env::var("SCOUTER_PASSWORD").unwrap_or_else(|_| "guest".to_string())
        });

        GrpcConfig {
            server_uri,
            username,
            password,
            timeout_secs,
            connect_timeout_secs,
            keep_alive_interval_secs,
            keep_alive_timeout_secs,
            keep_alive_while_idle,
            transport_type: TransportType::Grpc,
        }
    }

    pub fn __str__(&self) -> String {
        PyHelperFuncs::__str__(self)
    }
}

impl Default for GrpcConfig {
    fn default() -> Self {
        Self::new(None, None, None, None, None, None, None, None)
    }
}