gmsol_sdk/builders/
callback.rs

1use gmsol_programs::gmsol_store::types::ActionHeader;
2use gmsol_utils::action::ActionCallbackKind;
3use solana_sdk::pubkey::Pubkey;
4use typed_builder::TypedBuilder;
5
6use crate::serde::StringPubkey;
7
8/// Callback.
9#[cfg_attr(js, derive(tsify_next::Tsify))]
10#[cfg_attr(js, tsify(from_wasm_abi))]
11#[cfg_attr(serde, derive(serde::Serialize, serde::Deserialize))]
12#[derive(Debug, Clone, TypedBuilder)]
13pub struct Callback {
14    /// Callback version.
15    pub version: u8,
16    /// Callback program ID.
17    #[builder(setter(into))]
18    pub program: StringPubkey,
19    /// The address of shared data account.
20    #[builder(setter(into))]
21    pub shared_data: StringPubkey,
22    /// The address of partitioned data account.
23    #[builder(setter(into))]
24    pub partitioned_data: StringPubkey,
25}
26
27impl Callback {
28    /// Create from [`ActionHeader`].
29    pub fn from_header(header: &ActionHeader) -> crate::Result<Option<Self>> {
30        let callback = match header.callback_kind()? {
31            ActionCallbackKind::Disabled => None,
32            ActionCallbackKind::General => Some(Self {
33                version: header.callback_version,
34                program: header.callback_program_id.into(),
35                shared_data: header.callback_shared_data.into(),
36                partitioned_data: header.callback_partitioned_data.into(),
37            }),
38            _ => return Err(crate::Error::custom("unsupported callback kind")),
39        };
40        Ok(callback)
41    }
42}
43
44/// Callback parameters.
45#[derive(Default)]
46pub(crate) struct CallbackParams {
47    pub(crate) callback_version: Option<u8>,
48    pub(crate) callback_authority: Option<Pubkey>,
49    pub(crate) callback_program: Option<Pubkey>,
50    pub(crate) callback_shared_data_account: Option<Pubkey>,
51    pub(crate) callback_partitioned_data_account: Option<Pubkey>,
52}