use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_with::{VecSkipError, serde_as};
use crate::chain::ChainId;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SupportedPaymentKind {
pub x402_version: u8,
pub scheme: String,
pub network: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub extra: Option<serde_json::Value>,
}
#[serde_as]
#[derive(Clone, Default, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SupportedResponse {
#[serde_as(as = "VecSkipError<_>")]
pub kinds: Vec<SupportedPaymentKind>,
#[serde(default)]
pub extensions: Vec<String>,
#[serde(default)]
pub signers: HashMap<String, Vec<String>>,
}
impl SupportedResponse {
#[must_use]
pub fn signers_for_chain(&self, chain_id: &ChainId) -> Vec<&str> {
let exact_key = chain_id.to_string();
let wildcard_key = format!("{}:*", chain_id.namespace());
let mut result = Vec::new();
if let Some(addrs) = self.signers.get(&exact_key) {
result.extend(addrs.iter().map(String::as_str));
}
if let Some(addrs) = self.signers.get(&wildcard_key) {
result.extend(addrs.iter().map(String::as_str));
}
result
}
}