gmsol_sdk/builders/
callback.rs1use 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#[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 pub version: u8,
16 #[builder(setter(into))]
18 pub program: StringPubkey,
19 #[builder(setter(into))]
21 pub shared_data: StringPubkey,
22 #[builder(setter(into))]
24 pub partitioned_data: StringPubkey,
25}
26
27impl Callback {
28 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#[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}