fuel_gql_client/client/schema/
resource.rs

1use crate::client::schema::{
2    coin::Coin,
3    message::Message,
4    schema,
5    Address,
6    AssetId,
7    ConversionError,
8    MessageId,
9    UtxoId,
10    U64,
11};
12use itertools::Itertools;
13use std::str::FromStr;
14
15#[derive(cynic::InputObject, Clone, Debug)]
16#[cynic(schema_path = "./assets/schema.sdl")]
17pub struct ExcludeInput {
18    /// Utxos to exclude from the result.
19    utxos: Vec<UtxoId>,
20    /// Messages to exclude from teh result.
21    messages: Vec<MessageId>,
22}
23
24impl ExcludeInput {
25    pub fn from_tuple(tuple: (Vec<&str>, Vec<&str>)) -> Result<Self, ConversionError> {
26        let utxos = tuple.0.into_iter().map(UtxoId::from_str).try_collect()?;
27        let messages = tuple.1.into_iter().map(MessageId::from_str).try_collect()?;
28
29        Ok(Self { utxos, messages })
30    }
31}
32
33#[derive(cynic::InputObject, Clone, Debug)]
34#[cynic(schema_path = "./assets/schema.sdl")]
35pub struct SpendQueryElementInput {
36    /// asset ID of the coins
37    pub asset_id: AssetId,
38    /// address of the owner
39    pub amount: U64,
40    /// the maximum number of resources per asset from the owner to return.
41    pub max: Option<U64>,
42}
43
44#[derive(cynic::InlineFragments, Debug)]
45#[cynic(schema_path = "./assets/schema.sdl")]
46pub enum Resource {
47    Coin(Coin),
48    Message(Message),
49    #[cynic(fallback)]
50    Unknown,
51}
52
53impl Resource {
54    pub fn amount(&self) -> u64 {
55        match self {
56            Resource::Coin(c) => c.amount.0,
57            Resource::Message(m) => m.amount.0,
58            Resource::Unknown => 0,
59        }
60    }
61}
62
63#[derive(cynic::QueryVariables, Debug)]
64pub struct ResourcesToSpendArgs {
65    /// The `Address` of the assets' resources owner.
66    owner: Address,
67    /// The total amount of each asset type to spend
68    query_per_asset: Vec<SpendQueryElementInput>,
69    /// A list of ids to exclude from the selection
70    excluded_ids: Option<ExcludeInput>,
71}
72
73pub(crate) type ResourcesToSpendArgsTuple =
74    (Address, Vec<SpendQueryElementInput>, Option<ExcludeInput>);
75
76impl From<ResourcesToSpendArgsTuple> for ResourcesToSpendArgs {
77    fn from(r: ResourcesToSpendArgsTuple) -> Self {
78        ResourcesToSpendArgs {
79            owner: r.0,
80            query_per_asset: r.1,
81            excluded_ids: r.2,
82        }
83    }
84}
85
86#[derive(cynic::QueryFragment, Debug)]
87#[cynic(
88    schema_path = "./assets/schema.sdl",
89    graphql_type = "Query",
90    variables = "ResourcesToSpendArgs"
91)]
92pub struct ResourcesToSpendQuery {
93    #[arguments(owner: $owner, queryPerAsset: $query_per_asset, excludedIds: $excluded_ids)]
94    pub resources_to_spend: Vec<Vec<Resource>>,
95}