light_client/indexer/
options.rs

1use photon_api::models::{FilterSelector, Memcmp};
2use solana_account_decoder_client_types::UiDataSliceConfig;
3use solana_pubkey::Pubkey;
4
5#[derive(Debug, Clone)]
6pub struct GetCompressedTokenAccountsByOwnerOrDelegateOptions {
7    pub mint: Option<Pubkey>,
8    pub cursor: Option<String>,
9    pub limit: Option<u16>,
10}
11
12impl GetCompressedTokenAccountsByOwnerOrDelegateOptions {
13    pub fn new(mint: Option<Pubkey>) -> Self {
14        Self {
15            mint,
16            cursor: None,
17            limit: None,
18        }
19    }
20}
21
22/// **Cursor** is a unique identifier for a page of results by which the next page can be fetched.
23///
24/// **Limit** is the maximum number of results to return per page.
25pub struct PaginatedOptions {
26    pub cursor: Option<String>,
27    pub limit: Option<u16>,
28}
29
30pub struct GetCompressedAccountsByOwnerConfig {
31    pub filters: Option<Vec<GetCompressedAccountsFilter>>,
32    pub data_slice: Option<UiDataSliceConfig>,
33    pub cursor: Option<String>,
34    pub limit: Option<u16>,
35}
36
37#[derive(Clone)]
38pub struct GetCompressedAccountsFilter {
39    pub bytes: Vec<u8>,
40    pub offset: u32,
41}
42
43#[allow(clippy::from_over_into)]
44impl Into<FilterSelector> for GetCompressedAccountsFilter {
45    fn into(self) -> FilterSelector {
46        FilterSelector {
47            memcmp: Some(Box::new(Memcmp {
48                offset: self.offset,
49                bytes: base64::encode(&self.bytes), // TODO: double check
50            })),
51        }
52    }
53}
54
55impl GetCompressedAccountsByOwnerConfig {
56    pub fn filters_to_photon(&self) -> Option<Vec<FilterSelector>> {
57        self.filters
58            .as_ref()
59            .map(|filters| filters.iter().map(|f| f.clone().into()).collect())
60    }
61}