penumbra_sdk_stake/validator/
info.rs

1use penumbra_sdk_proto::{
2    core::component::stake::v1::ValidatorInfoResponse, penumbra::core::component::stake::v1 as pb,
3    DomainType,
4};
5use serde::{Deserialize, Serialize};
6
7use super::{Status, Validator};
8use crate::rate::RateData;
9
10#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
11#[serde(try_from = "pb::ValidatorInfo", into = "pb::ValidatorInfo")]
12pub struct Info {
13    pub validator: Validator,
14    pub status: Status,
15    pub rate_data: RateData,
16}
17
18impl DomainType for Info {
19    type Proto = pb::ValidatorInfo;
20}
21
22impl From<Info> for pb::ValidatorInfo {
23    fn from(v: Info) -> Self {
24        pb::ValidatorInfo {
25            validator: Some(v.validator.into()),
26            status: Some(v.status.into()),
27            rate_data: Some(v.rate_data.into()),
28        }
29    }
30}
31
32impl From<Info> for ValidatorInfoResponse {
33    fn from(v: Info) -> Self {
34        ValidatorInfoResponse {
35            validator_info: Some(v.into()),
36        }
37    }
38}
39
40impl TryFrom<pb::ValidatorInfo> for Info {
41    type Error = anyhow::Error;
42    fn try_from(v: pb::ValidatorInfo) -> Result<Self, Self::Error> {
43        Ok(Info {
44            validator: v
45                .validator
46                .ok_or_else(|| anyhow::anyhow!("missing validator field in proto"))?
47                .try_into()?,
48            status: v
49                .status
50                .ok_or_else(|| anyhow::anyhow!("missing status field in proto"))?
51                .try_into()?,
52            rate_data: v
53                .rate_data
54                .ok_or_else(|| anyhow::anyhow!("missing rate_data field in proto"))?
55                .try_into()?,
56        })
57    }
58}
59
60impl TryFrom<ValidatorInfoResponse> for Info {
61    type Error = anyhow::Error;
62
63    fn try_from(info_resp: ValidatorInfoResponse) -> Result<Self, Self::Error> {
64        info_resp
65            .validator_info
66            .ok_or_else(|| anyhow::anyhow!("empty ValidatorInfoResponse message"))?
67            .try_into()
68    }
69}