use serde::{Deserialize, Serialize};
use crate::{
api::{Method, Payload, PayloadError},
types::{Chat, Gift, Integer, PaidMedia, User},
};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct StarTransactions {
pub transactions: Vec<StarTransaction>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct StarTransaction {
pub amount: Integer,
pub date: Integer,
pub id: String,
pub nanostar_amount: Option<Integer>,
pub source: Option<TransactionPartner>,
pub receiver: Option<TransactionPartner>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct TransactionPartnerAffiliateProgramParameters {
pub commission_per_mille: Integer,
pub sponsor_user: Option<User>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct AffiliateInfo {
pub amount: Integer,
pub commission_per_mille: Integer,
pub affiliate_chat: Option<Chat>,
pub affiliate_user: Option<User>,
pub nanostar_amount: Option<Integer>,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct TransactionPartnerChatParameters {
pub chat: Chat,
pub gift: Option<Gift>,
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TransactionPartnerUserType {
BusinessAccountTransfer,
GiftPurchase,
InvoicePayment,
PaidMediaPayment,
PremiumPurchase,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct TransactionPartnerUserParameters {
pub transaction_type: TransactionPartnerUserType,
pub user: User,
pub affiliate: Option<AffiliateInfo>,
pub gift: Option<String>,
pub invoice_payload: Option<String>,
pub paid_media: Option<Vec<PaidMedia>>,
pub paid_media_payload: Option<String>,
pub premium_subscription_duration: Option<Integer>,
pub subscription_period: Option<Integer>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(from = "RawTransactionPartner", into = "RawTransactionPartner")]
pub enum TransactionPartner {
AffiliateProgram(TransactionPartnerAffiliateProgramParameters),
Chat(TransactionPartnerChatParameters),
Fragment(Option<RevenueWithdrawalState>),
Other,
TelegramAds,
TelegramApi {
request_count: Integer,
},
User(TransactionPartnerUserParameters),
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
enum RawTransactionPartner {
AffiliateProgram(TransactionPartnerAffiliateProgramParameters),
Chat(TransactionPartnerChatParameters),
Fragment {
withdrawal_state: Option<RevenueWithdrawalState>,
},
Other {},
TelegramAds {},
TelegramApi {
request_count: Integer,
},
User(TransactionPartnerUserParameters),
}
impl From<RawTransactionPartner> for TransactionPartner {
fn from(value: RawTransactionPartner) -> Self {
match value {
RawTransactionPartner::AffiliateProgram(parameters) => Self::AffiliateProgram(parameters),
RawTransactionPartner::Chat(parameters) => Self::Chat(parameters),
RawTransactionPartner::Fragment { withdrawal_state } => Self::Fragment(withdrawal_state),
RawTransactionPartner::Other {} => Self::Other,
RawTransactionPartner::TelegramAds {} => Self::TelegramAds,
RawTransactionPartner::TelegramApi { request_count } => Self::TelegramApi { request_count },
RawTransactionPartner::User(parameters) => Self::User(parameters),
}
}
}
impl From<TransactionPartner> for RawTransactionPartner {
fn from(value: TransactionPartner) -> Self {
match value {
TransactionPartner::AffiliateProgram(parameters) => Self::AffiliateProgram(parameters),
TransactionPartner::Chat(parameters) => Self::Chat(parameters),
TransactionPartner::Fragment(withdrawal_state) => Self::Fragment { withdrawal_state },
TransactionPartner::Other => Self::Other {},
TransactionPartner::TelegramAds => Self::TelegramAds {},
TransactionPartner::TelegramApi { request_count } => Self::TelegramApi { request_count },
TransactionPartner::User(parameters) => Self::User(parameters),
}
}
}
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
#[serde(from = "RawRevenueWithdrawalState", into = "RawRevenueWithdrawalState")]
pub enum RevenueWithdrawalState {
Failed,
Pending,
Succeeded {
date: Integer,
url: String,
},
}
#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
enum RawRevenueWithdrawalState {
Failed {},
Pending {},
Succeeded { date: Integer, url: String },
}
impl From<RawRevenueWithdrawalState> for RevenueWithdrawalState {
fn from(value: RawRevenueWithdrawalState) -> Self {
use self::RawRevenueWithdrawalState::*;
match value {
Failed {} => Self::Failed,
Pending {} => Self::Pending,
Succeeded { date, url } => Self::Succeeded { date, url },
}
}
}
impl From<RevenueWithdrawalState> for RawRevenueWithdrawalState {
fn from(value: RevenueWithdrawalState) -> Self {
use self::RevenueWithdrawalState::*;
match value {
Failed => Self::Failed {},
Pending => Self::Pending {},
Succeeded { date, url } => Self::Succeeded { date, url },
}
}
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Copy, Debug, Default, Serialize)]
pub struct GetStarTransactions {
offset: Option<Integer>,
limit: Option<Integer>,
}
impl GetStarTransactions {
pub fn with_offset(mut self, value: Integer) -> Self {
self.offset = Some(value);
self
}
pub fn with_limit(mut self, value: Integer) -> Self {
self.limit = Some(value);
self
}
}
impl Method for GetStarTransactions {
type Response = StarTransactions;
fn into_payload(self) -> Result<Payload, PayloadError> {
Payload::json("getStarTransactions", self)
}
}