// std // crates use libsecp256k1::SecretKey; use multiaddr::Multiaddr; use serde::{Deserialize, Serialize}; // internal #[derive(Clone, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NodeConfig { host: Option, port: Option, advertise_addr: Option, #[serde(with = "secret_key_serde")] node_key: Option, keep_alive_interval: Option, relay: Option, min_peers_to_publish: Option, filter: Option, } mod secret_key_serde { use libsecp256k1::SecretKey; use serde::de::Error; use serde::{Deserialize, Deserializer, Serialize, Serializer}; pub fn serialize(key: &Option, serializer: S) -> Result where S: Serializer, { let as_string: Option = key.as_ref().map(|key| hex::encode(key.serialize())); as_string.serialize(serializer) } pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let as_string: Option = Option::::deserialize(deserializer)?; match as_string { None => Ok(None), Some(s) => { let key_bytes = hex::decode(s).map_err(|e| D::Error::custom(format!("{e}")))?; Ok(Some( SecretKey::parse_slice(&key_bytes) .map_err(|e| D::Error::custom(format!("{e}")))?, )) } } } }