gmsol_model/action/decrease_position/
claimable.rs

1use num_traits::{CheckedAdd, Zero};
2
3/// Claimable collateral amounts.
4#[derive(Debug, Clone, Copy)]
5#[cfg_attr(
6    feature = "anchor-lang",
7    derive(anchor_lang::AnchorDeserialize, anchor_lang::AnchorSerialize)
8)]
9pub struct ClaimableCollateral<T> {
10    output_token_amount: T,
11    secondary_output_token_amount: T,
12}
13
14#[cfg(feature = "gmsol-utils")]
15impl<T: gmsol_utils::InitSpace> gmsol_utils::InitSpace for ClaimableCollateral<T> {
16    const INIT_SPACE: usize = 2 * T::INIT_SPACE;
17}
18
19impl<T> ClaimableCollateral<T> {
20    /// Get output token amount.
21    pub fn output_token_amount(&self) -> &T {
22        &self.output_token_amount
23    }
24
25    /// Get secondary output token amount.
26    pub fn secondary_output_token_amount(&self) -> &T {
27        &self.secondary_output_token_amount
28    }
29
30    /// Try to add amount.
31    pub fn try_add_amount(&mut self, amount: &T, is_output_token: bool) -> crate::Result<&mut Self>
32    where
33        T: CheckedAdd,
34    {
35        let current = if is_output_token {
36            &mut self.output_token_amount
37        } else {
38            &mut self.secondary_output_token_amount
39        };
40        *current = current.checked_add(amount).ok_or(crate::Error::Overflow)?;
41        Ok(self)
42    }
43}
44
45impl<T: Zero> Default for ClaimableCollateral<T> {
46    fn default() -> Self {
47        Self {
48            output_token_amount: Zero::zero(),
49            secondary_output_token_amount: Zero::zero(),
50        }
51    }
52}