whisky_pallas/wrapper/transaction_body/
relay.rs1use 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}