whisky_pallas/wrapper/transaction_body/
relay.rs

1use std::str::FromStr;
2
3use pallas::{codec::utils::Bytes, ledger::primitives::Relay as PallasRelay};
4use whisky_common::WError;
5
6pub enum RelayKind {
7    SingleHostAddr(Option<u32>, Option<String>, Option<String>),
8    SingleHostName(Option<u32>, String),
9    MultiHostName(String),
10}
11
12#[derive(Debug, PartialEq, Eq, Clone)]
13pub struct Relay {
14    pub inner: PallasRelay,
15}
16
17impl Relay {
18    pub fn new(relay: RelayKind) -> Result<Self, WError> {
19        let pallas_relay = match relay {
20            RelayKind::SingleHostAddr(port, ipv4, ipv6) => {
21                let ipv4_bytes: Option<Bytes> = match &ipv4 {
22                    Some(ip) => Some(Bytes::from_str(ip).map_err(|_| {
23                        WError::new(
24                            "WhiskyPallas - encoding ipv4",
25                            "failed to parse ipv4 address",
26                        )
27                    })?),
28                    None => None,
29                };
30                let ipv6_bytes: Option<Bytes> = match &ipv6 {
31                    Some(ip) => Some(Bytes::from_str(ip).map_err(|_| {
32                        WError::new(
33                            "WhiskyPallas - encoding ipv6",
34                            "failed to parse ipv6 address",
35                        )
36                    })?),
37                    None => None,
38                };
39                PallasRelay::SingleHostAddr(port, ipv4_bytes, ipv6_bytes)
40            }
41            RelayKind::SingleHostName(port, dns_name) => {
42                PallasRelay::SingleHostName(port, dns_name)
43            }
44            RelayKind::MultiHostName(dns_name) => PallasRelay::MultiHostName(dns_name),
45        };
46        Ok(Relay {
47            inner: pallas_relay,
48        })
49    }
50}