1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Deserialize, Serialize)]
4pub struct Version<'a> {
5 pub package: &'a str,
6 pub version: &'a str,
7 pub proto: &'a str,
8 pub proto_richat: &'a str,
9 pub solana: &'a str,
10 pub git: &'a str,
11 pub rustc: &'a str,
12 pub buildts: &'a str,
13}
14
15impl<'a> Version<'a> {
16 pub fn create_grpc_version_info(self) -> GrpcVersionInfo<'a> {
17 GrpcVersionInfo::new(self)
18 }
19}
20
21#[derive(Debug, Clone, Deserialize, Serialize)]
22pub struct GrpcVersionInfoExtra {
23 pub hostname: Option<String>,
24}
25
26#[derive(Debug, Clone, Deserialize, Serialize)]
27pub struct GrpcVersionInfo<'a> {
28 #[serde(borrow)]
29 pub version: Version<'a>,
30 pub extra: GrpcVersionInfoExtra,
31}
32
33impl<'a> GrpcVersionInfo<'a> {
34 pub fn new(version: Version<'a>) -> Self {
35 Self {
36 version,
37 extra: GrpcVersionInfoExtra {
38 hostname: hostname::get()
39 .ok()
40 .and_then(|name| name.into_string().ok()),
41 },
42 }
43 }
44
45 pub fn json(&self) -> String {
46 serde_json::to_string(self).expect("json serialization never fail")
47 }
48
49 pub fn value(&self) -> serde_json::Value {
50 serde_json::to_value(self).expect("json serialization never fail")
51 }
52}