af_oracle/graphql/
price_feed_for_source.rs1use af_move_type::{FromRawStructError, MoveInstance};
2use af_sui_types::Address;
3use sui_gql_client::GraphQlClient;
4use sui_gql_client::queries::model::outputs::DynamicField;
5use sui_gql_client::queries::{Error as QueryError, GraphQlClientExt as _};
6
7use crate::oracle::PriceFeed;
8
9type Key = crate::keys::PriceFeedForSource;
10
11pub(crate) async fn query<C>(
12 client: &C,
13 af_oracle_pkg: Address,
14 price_feed_storage: Address,
15 source_wrapper_id: Address,
16) -> Result<Option<MoveInstance<PriceFeed>>, Error<C::Error>>
17where
18 C: GraphQlClient,
19{
20 let key = Key::new(source_wrapper_id.into()).move_instance(af_oracle_pkg);
21 let raw_move_value = client
22 .object_df_by_name(price_feed_storage, key.try_into()?, None)
23 .await;
24 match raw_move_value {
25 Ok(DynamicField::Field(raw)) => Ok(Some(raw.try_into()?)),
26 Ok(DynamicField::Object(_key, raw)) => Ok(Some(raw.try_into()?)),
27 Err(QueryError::MissingData(_)) => Ok(None),
28 Err(err) => Err(Error::OwnerDfContent(err)),
29 }
30}
31
32#[derive(thiserror::Error, Debug)]
33pub enum Error<C: std::error::Error> {
34 #[error("Querying Owner DF content: {0}")]
35 OwnerDfContent(QueryError<C>),
36
37 #[error("BCS De/Ser: {0}")]
38 Bcs(#[from] sui_sdk_types::bcs::Error),
39
40 #[error(transparent)]
41 FromRawType(#[from] af_move_type::FromRawTypeError),
42
43 #[error(transparent)]
44 FromRawStruct(#[from] FromRawStructError),
45}