/* This file is part of DarkFi (https://dark.fi)
*
* Copyright (C) 2020-2023 Dyne.org foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
use std::{io, str::FromStr};
use darkfi_serial::{Decodable, Encodable};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)]
pub enum NetworkName {
DarkFi,
Solana,
Bitcoin,
Ethereum,
}
impl core::fmt::Display for NetworkName {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::DarkFi => {
write!(f, "DarkFi")
}
Self::Solana => {
write!(f, "Solana")
}
Self::Bitcoin => {
write!(f, "Bitcoin")
}
Self::Ethereum => {
write!(f, "Ethereum")
}
}
}
}
impl FromStr for NetworkName {
type Err = crate::Error;
fn from_str(s: &str) -> core::result::Result {
match s.to_lowercase().as_str() {
"drk" | "darkfi" => Ok(NetworkName::DarkFi),
"sol" | "solana" => Ok(NetworkName::Solana),
"btc" | "bitcoin" => Ok(NetworkName::Bitcoin),
"eth" | "ethereum" => Ok(NetworkName::Ethereum),
_ => Err(crate::Error::UnsupportedCoinNetwork),
}
}
}
impl Encodable for NetworkName {
fn encode(&self, s: S) -> core::result::Result {
let name = self.to_string();
let len = name.encode(s)?;
Ok(len)
}
}
impl Decodable for NetworkName {
fn decode(mut d: D) -> core::result::Result {
let name: String = Decodable::decode(&mut d)?;
match NetworkName::from_str(&name) {
Ok(v) => Ok(v),
Err(e) => Err(io::Error::new(io::ErrorKind::Other, e)),
}
}
}