gmsol_model/action/decrease_position/
claimable.rs1use num_traits::{CheckedAdd, Zero};
2
3#[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 pub fn output_token_amount(&self) -> &T {
22 &self.output_token_amount
23 }
24
25 pub fn secondary_output_token_amount(&self) -> &T {
27 &self.secondary_output_token_amount
28 }
29
30 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}