richat-shared 8.0.1

Richat Shared code
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
pub struct Version<'a> {
    pub package: &'a str,
    pub version: &'a str,
    pub proto: &'a str,
    pub proto_richat: &'a str,
    pub solana: &'a str,
    pub git: &'a str,
    pub rustc: &'a str,
    pub buildts: &'a str,
}

impl<'a> Version<'a> {
    pub fn create_grpc_version_info(self) -> GrpcVersionInfo<'a> {
        GrpcVersionInfo::new(self)
    }
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct GrpcVersionInfoExtra {
    pub hostname: Option<String>,
}

#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct GrpcVersionInfo<'a> {
    #[serde(borrow)]
    pub version: Version<'a>,
    pub extra: GrpcVersionInfoExtra,
}

impl<'a> GrpcVersionInfo<'a> {
    pub fn new(version: Version<'a>) -> Self {
        Self {
            version,
            extra: GrpcVersionInfoExtra {
                hostname: hostname::get()
                    .ok()
                    .and_then(|name| name.into_string().ok()),
            },
        }
    }

    pub fn json(&self) -> String {
        serde_json::to_string(self).expect("json serialization never fail")
    }

    pub fn value(&self) -> serde_json::Value {
        serde_json::to_value(self).expect("json serialization never fail")
    }
}