af_oracle/
graphql.rs

1use af_move_type::MoveInstance;
2use af_sui_types::{Address, ObjectId};
3use sui_gql_client::queries::{Error as QueryError, GraphQlClientExt as _};
4use sui_gql_client::GraphQlClient;
5
6use crate::oracle::PriceFeed;
7
8type Key = crate::keys::PriceFeedForSource;
9
10/// Error type for [`GraphQlClientExt`].
11#[derive(thiserror::Error, Debug)]
12pub enum Error<C: std::error::Error> {
13    #[error("Querying Owner DF content: {0}")]
14    OwnerDfContent(QueryError<C>),
15
16    #[error("BCS De/Ser: {0}")]
17    Bcs(#[from] bcs::Error),
18
19    #[error(transparent)]
20    FromRawType(#[from] af_move_type::FromRawTypeError),
21}
22
23#[trait_variant::make(Send)]
24pub trait GraphQlClientExt: GraphQlClient + Sized {
25    /// For a `PriceFeedStorage`, get the `PriceFeed` backed by `source_wrapper_id`, if any.
26    async fn get_price_feed_for_source(
27        &self,
28        af_oracle_pkg: Address,
29        price_feed_storage: ObjectId,
30        source_wrapper_id: ObjectId,
31    ) -> Result<Option<MoveInstance<PriceFeed>>, Error<Self::Error>> {
32        async move {
33            let key = Key::new(source_wrapper_id.into()).move_instance(af_oracle_pkg);
34            let raw_move_value = self
35                .owner_df_content(price_feed_storage.into(), key.try_into()?, None)
36                .await;
37            match raw_move_value {
38                Ok(raw) => Ok(Some(raw.try_into()?)),
39                Err(QueryError::MissingData(_)) => Ok(None),
40                Err(err) => Err(Error::OwnerDfContent(err)),
41            }
42        }
43    }
44}
45
46impl<T: GraphQlClient> GraphQlClientExt for T {}