af_iperps/graphql/
registry.rs

1use af_move_type::MoveInstance;
2use af_sui_types::{ObjectId, TypeTag, Version};
3use futures::Stream;
4use sui_gql_client::GraphQlClient;
5use sui_gql_client::queries::GraphQlClientExt as _;
6use sui_gql_client::queries::outputs::DynamicField;
7
8use super::Result as QResult;
9
10pub(super) fn query<C>(
11    client: &C,
12    registry_address: ObjectId,
13    version: Option<Version>,
14) -> impl Stream<Item = QResult<ObjectId, C>> + '_
15where
16    C: GraphQlClient,
17{
18    async_stream::try_stream! {
19        let mut has_next_page = true;
20        let mut cursor = None;
21        while has_next_page {
22            let (dfs, cursor_) = client
23                .owner_df_contents(registry_address.into(), version, None, cursor)
24                .await?;
25            cursor = cursor_;
26            has_next_page = cursor.is_some();
27
28            for (name, raw) in dfs {
29                let DynamicField::Field(_raw) = raw else {
30                    continue;
31                };
32                let TypeTag::Struct(name_type) = name.type_ else {
33                    continue;
34                };
35                if let Ok(key) =
36                    MoveInstance::<crate::keys::RegistryMarketInfo>::from_raw_struct(*name_type, &name.bcs)
37                {
38                    yield key.value.ch_id.bytes;
39                }
40            }
41        }
42    }
43}