penumbra_sdk_stake/validator/
info.rs1use 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}