af_switchboard_wrapper/
graphql.rs

1use af_move_type::MoveInstance;
2use af_sui_types::Address;
3use sui_framework_sdk::object::ID;
4use sui_gql_client::GraphQlClient;
5use sui_gql_client::queries::model::outputs::DynamicField;
6use sui_gql_client::queries::{Error as QueryError, GraphQlClientExt as _};
7
8type Key = crate::wrapper::SwitchboardAggregatorId;
9
10/// Error for [`GraphQlClientExt`].
11#[derive(thiserror::Error, Debug)]
12pub enum Error<C: std::error::Error> {
13    #[error("Querying Owner DF content: {0}")]
14    ObjectDfQuery(QueryError<C>),
15
16    #[error("BCS De/Ser: {0}")]
17    Bcs(#[from] sui_sdk_types::bcs::Error),
18
19    #[error(transparent)]
20    FromRawType(#[from] af_move_type::FromRawTypeError),
21
22    #[error("Found a struct object, expecting Address")]
23    RawInvalidType,
24}
25
26pub async fn query<C>(
27    client: &C,
28    switchboard_wrapper_pkg: Address,
29    price_feed: Address,
30) -> Result<Address, Error<C::Error>>
31where
32    C: GraphQlClient,
33{
34    let key = Key::new().move_instance(switchboard_wrapper_pkg);
35    let raw_move_value = client
36        .object_df_by_name(price_feed, key.try_into()?, None)
37        .await;
38    let move_id: MoveInstance<ID> = match raw_move_value {
39        Ok(DynamicField::Field(raw)) => raw.try_into()?,
40        Ok(DynamicField::Object(_, _)) => return Err(Error::RawInvalidType),
41        Err(err) => return Err(Error::ObjectDfQuery(err)),
42    };
43
44    Ok(move_id.value.bytes)
45}