use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum StarTransaction {
Incoming(crate::types::StarTransactionIncoming),
Outgoing(crate::types::StarTransactionOutgoing),
Unknown(crate::types::StarTransactionUnknown),
}
impl StarTransaction {
#[must_use]
pub fn amount(&self) -> i64 {
match self {
Self::Incoming(val) => val.amount,
Self::Outgoing(val) => val.amount,
Self::Unknown(val) => val.amount,
}
}
#[must_use]
pub fn date(&self) -> i64 {
match self {
Self::Incoming(val) => val.date,
Self::Outgoing(val) => val.date,
Self::Unknown(val) => val.date,
}
}
#[must_use]
pub fn id(&self) -> &str {
match self {
Self::Incoming(val) => val.id.as_ref(),
Self::Outgoing(val) => val.id.as_ref(),
Self::Unknown(val) => val.id.as_ref(),
}
}
#[must_use]
pub fn nanostar_amount(&self) -> Option<u32> {
match self {
Self::Incoming(val) => val.nanostar_amount,
Self::Outgoing(val) => val.nanostar_amount,
Self::Unknown(val) => val.nanostar_amount,
}
}
#[must_use]
pub fn receiver(&self) -> Option<&crate::types::TransactionPartner> {
match self {
Self::Outgoing(val) => Some(&val.receiver),
_ => None,
}
}
#[must_use]
pub fn source(&self) -> Option<&crate::types::TransactionPartner> {
match self {
Self::Incoming(val) => Some(&val.source),
_ => None,
}
}
#[must_use]
pub fn chat(&self) -> Option<&crate::types::Chat> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::chat(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::chat(inner)
}
Self::Unknown(_) => None,
}
}
#[must_use]
pub fn commission_per_mille(&self) -> Option<i64> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::commission_per_mille(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::commission_per_mille(inner)
}
Self::Unknown(_) => None,
}
}
#[must_use]
pub fn gift(&self) -> Option<&crate::types::Gift> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::gift(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::gift(inner)
}
Self::Unknown(_) => None,
}
}
#[must_use]
pub fn request_count(&self) -> Option<i64> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::request_count(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::request_count(inner)
}
Self::Unknown(_) => None,
}
}
#[must_use]
pub fn sponsor_user(&self) -> Option<&crate::types::User> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::sponsor_user(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::sponsor_user(inner)
}
Self::Unknown(_) => None,
}
}
#[must_use]
pub fn withdrawal_state(&self) -> Option<&crate::types::RevenueWithdrawalState> {
match self {
Self::Outgoing(val) => {
let inner = &val.receiver;
crate::types::TransactionPartner::withdrawal_state(inner)
}
Self::Incoming(val) => {
let inner = &val.source;
crate::types::TransactionPartner::withdrawal_state(inner)
}
Self::Unknown(_) => None,
}
}
}
impl From<crate::types::StarTransactionIncoming> for StarTransaction {
fn from(val: crate::types::StarTransactionIncoming) -> Self {
Self::Incoming(val)
}
}
impl TryFrom<StarTransaction> for crate::types::StarTransactionIncoming {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: StarTransaction) -> Result<Self, Self::Error> {
if let StarTransaction::Incoming(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(
stringify!(StarTransaction),
stringify!(StarTransactionIncoming),
))
}
}
}
impl From<crate::types::StarTransactionOutgoing> for StarTransaction {
fn from(val: crate::types::StarTransactionOutgoing) -> Self {
Self::Outgoing(val)
}
}
impl TryFrom<StarTransaction> for crate::types::StarTransactionOutgoing {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: StarTransaction) -> Result<Self, Self::Error> {
if let StarTransaction::Outgoing(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(
stringify!(StarTransaction),
stringify!(StarTransactionOutgoing),
))
}
}
}
impl From<crate::types::StarTransactionUnknown> for StarTransaction {
fn from(val: crate::types::StarTransactionUnknown) -> Self {
Self::Unknown(val)
}
}
impl TryFrom<StarTransaction> for crate::types::StarTransactionUnknown {
type Error = crate::errors::ConvertToTypeError;
fn try_from(val: StarTransaction) -> Result<Self, Self::Error> {
if let StarTransaction::Unknown(inner) = val {
Ok(inner)
} else {
Err(Self::Error::new(
stringify!(StarTransaction),
stringify!(StarTransactionUnknown),
))
}
}
}