use std::fmt::Display;
use std::fmt::Formatter;
use std::iter::FromIterator;
use derive_more::Deref;
use derive_more::IntoIterator;
use serde::Deserialize;
use serde_repr::Deserialize_repr;
use serde_repr::Serialize_repr;
#[derive(IntoIterator, Deref, Default, Debug)]
pub struct Confirmations(#[into_iterator(owned, ref)] pub Vec<Confirmation>);
impl<'a> FromIterator<&'a Confirmation> for Confirmations {
fn from_iter<T>(iter: T) -> Self
where
T: IntoIterator<Item = &'a Confirmation>,
{
let buffer = iter.into_iter().cloned().collect::<Vec<_>>();
Self(buffer)
}
}
#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Confirmation {
pub id: String,
#[serde(rename = "nonce")]
pub key: String,
#[serde(rename = "type")]
pub kind: EConfirmationType,
pub creation_time: i64,
pub creator_id: String,
pub type_name: String,
}
impl Display for Confirmation {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "Confirmation {} of {:?}", self.key, self.kind)
}
}
impl Confirmation {
pub fn has_trade_offer_id(&self, offer_id: u64) -> bool {
self.kind == EConfirmationType::Trade && offer_id == self.creator_id.parse::<u64>().unwrap()
}
pub fn trade_offer_id(&self) -> Option<u64> {
if self.kind == EConfirmationType::Trade {
self.creator_id.parse().ok()
} else {
None
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Copy)]
pub struct ConfirmationDetails {
pub trade_offer_id: Option<i64>,
}
#[derive(Debug, Copy, Clone, Serialize_repr, Deserialize_repr, Eq, PartialEq)]
#[repr(u8)]
#[non_exhaustive]
pub enum EConfirmationType {
Unknown = 0,
Generic = 1,
Trade = 2,
Market = 3,
FeatureOptOut = 4,
PhoneNumberChange = 5,
AccountRecovery = 6,
APIKey = 9,
}
impl From<Vec<Confirmation>> for Confirmations {
fn from(confirmations_vec: Vec<Confirmation>) -> Self {
Self(confirmations_vec)
}
}
#[allow(missing_docs)]
#[derive(Eq, PartialEq, Copy, Clone, Debug)]
pub enum ConfirmationAction {
Retrieve,
Accept,
Deny,
}
impl ConfirmationAction {
pub(crate) const fn as_operation(self) -> Option<&'static str> {
Some(match self {
Self::Accept => "allow",
Self::Deny => "cancel",
_ => return None,
})
}
pub(crate) const fn as_tag(self) -> &'static str {
"conf"
}
}
#[derive(Copy, Clone, Debug)]
enum EInventoryPrivacy {
Unknown,
Private,
FriendsOnly,
Public,
}
#[cfg(test)]
mod tests {
use super::*;
fn get_confirmations() -> Confirmations {
let confirmations = vec![
Confirmation {
id: "7676451136".to_string(),
key: "18064583892738866189".to_string(),
kind: EConfirmationType::Trade,
details: Some(ConfirmationDetails {
trade_offer_id: Some(4009687284),
}),
},
Confirmation {
id: "7652515663".to_string(),
key: "10704556181383316145".to_string(),
kind: EConfirmationType::Trade,
details: Some(ConfirmationDetails {
trade_offer_id: Some(4000980011),
}),
},
Confirmation {
id: "7652555421".to_string(),
key: "10704556181383323456".to_string(),
kind: EConfirmationType::Trade,
details: Some(ConfirmationDetails {
trade_offer_id: Some(4000793103),
}),
},
Confirmation {
id: "7652515663".to_string(),
key: "20845677815483316145".to_string(),
kind: EConfirmationType::Market,
details: None,
},
];
Confirmations::from(confirmations)
}
}