use serde::{Deserialize, Serialize};
use crate::domain::{CommerceActorRole, ProtocolExtensions};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Ap2Role {
Shopper,
Merchant,
CredentialsProvider,
PaymentProcessor,
}
impl Ap2Role {
#[must_use]
pub fn to_commerce_role(self) -> CommerceActorRole {
match self {
Self::Shopper => CommerceActorRole::Shopper,
Self::Merchant => CommerceActorRole::Merchant,
Self::CredentialsProvider => CommerceActorRole::CredentialsProvider,
Self::PaymentProcessor => CommerceActorRole::PaymentProcessor,
}
}
#[must_use]
pub fn from_commerce_role(role: &CommerceActorRole) -> Option<Self> {
match role {
CommerceActorRole::Shopper => Some(Self::Shopper),
CommerceActorRole::Merchant => Some(Self::Merchant),
CommerceActorRole::CredentialsProvider => Some(Self::CredentialsProvider),
CommerceActorRole::PaymentProcessor => Some(Self::PaymentProcessor),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Ap2RoleMetadata {
pub role: Ap2Role,
pub agent_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub display_name: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub capabilities: Vec<String>,
#[serde(default, skip_serializing_if = "ProtocolExtensions::is_empty")]
pub extensions: ProtocolExtensions,
}