fuel_core/database/
message.rs

1use crate::{
2    database::{
3        OffChainIterableKeyValueView,
4        OnChainIterableKeyValueView,
5    },
6    fuel_core_graphql_api::storage::messages::{
7        OwnedMessageIds,
8        OwnedMessageKey,
9        SpentMessages,
10    },
11};
12use fuel_core_chain_config::TableEntry;
13use fuel_core_storage::{
14    Result as StorageResult,
15    iter::{
16        IterDirection,
17        IteratorOverTable,
18    },
19    tables::Messages,
20};
21use fuel_core_types::{
22    entities::relayer::message::Message,
23    fuel_types::{
24        Address,
25        Nonce,
26    },
27};
28use itertools::Itertools;
29
30impl OffChainIterableKeyValueView {
31    pub fn owned_message_ids(
32        &self,
33        owner: &Address,
34        start_message_id: Option<Nonce>,
35        direction: Option<IterDirection>,
36    ) -> impl Iterator<Item = StorageResult<Nonce>> + '_ + use<'_> {
37        let start_message_id =
38            start_message_id.map(|msg_id| OwnedMessageKey::new(owner, &msg_id));
39        self.iter_all_filtered_keys::<OwnedMessageIds, _>(
40            Some(*owner),
41            start_message_id.as_ref(),
42            direction,
43        )
44        .map(|res| res.map(|key| *key.nonce()))
45    }
46
47    pub fn message_is_spent(&self, id: &Nonce) -> StorageResult<bool> {
48        fuel_core_storage::StorageAsRef::storage::<SpentMessages>(&self).contains_key(id)
49    }
50}
51
52impl OnChainIterableKeyValueView {
53    pub fn all_messages(
54        &self,
55        start: Option<Nonce>,
56        direction: Option<IterDirection>,
57    ) -> impl Iterator<Item = StorageResult<Message>> + '_ {
58        self.iter_all_by_start::<Messages>(start.as_ref(), direction)
59            .map(|res| res.map(|(_, message)| message))
60    }
61
62    pub fn iter_messages(
63        &self,
64    ) -> impl Iterator<Item = StorageResult<TableEntry<Messages>>> + '_ {
65        self.iter_all_by_start::<Messages>(None, None)
66            .map_ok(|(key, value)| TableEntry { key, value })
67    }
68
69    pub fn message_exists(&self, id: &Nonce) -> StorageResult<bool> {
70        fuel_core_storage::StorageAsRef::storage::<Messages>(&self).contains_key(id)
71    }
72}