use crate::pagination::PaginatedResponse;
use nym_crypto::asymmetric::ed25519;
use nym_crypto::asymmetric::ed25519::bs58_ed25519_pubkey;
use nym_directory_contract_common::DirectoryEntryRecord;
use nym_mixnet_contract_common::NodeId;
use serde::{Deserialize, Serialize};
use serde_with::{DeserializeAs, SerializeAs};
use std::collections::BTreeMap;
use tendermint::block::Height;
use utoipa::ToSchema;
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DirectoryEntriesRecordsResponse {
#[schema(value_type = String)]
pub height: Height,
pub entries: PaginatedResponse<DirectoryEntryRecord>,
}
#[serde_with::serde_as]
#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
pub struct DirectoryEntriesIdentitiesResponse {
#[schema(value_type = String)]
pub height: Height,
#[serde_as(as = "BTreeMap<_, Ed25519PubKeySerde>")]
#[schema(value_type = std::collections::BTreeMap<u32, String>)]
pub node_identities: BTreeMap<NodeId, ed25519::PublicKey>,
}
struct Ed25519PubKeySerde;
impl SerializeAs<ed25519::PublicKey> for Ed25519PubKeySerde {
fn serialize_as<S>(value: &ed25519::PublicKey, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
bs58_ed25519_pubkey::serialize(value, serializer)
}
}
impl<'de> DeserializeAs<'de, ed25519::PublicKey> for Ed25519PubKeySerde {
fn deserialize_as<D>(deserializer: D) -> Result<ed25519::PublicKey, D::Error>
where
D: serde::Deserializer<'de>,
{
bs58_ed25519_pubkey::deserialize(deserializer)
}
}