Skip to main content

sui_indexer_alt_reader/
displays.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::collections::HashMap;
5
6use anyhow::Context;
7use async_graphql::dataloader::Loader;
8use diesel::ExpressionMethods;
9use diesel::QueryDsl;
10use move_core_types::language_storage::StructTag;
11use mysten_common::ZipDebugEqIteratorExt;
12use sui_indexer_alt_schema::displays::StoredDisplay;
13use sui_indexer_alt_schema::schema::sum_displays;
14
15use crate::error::Error;
16use crate::pg_reader::PgReader;
17
18/// Key for fetching a Display object by the type it corresponds to.
19#[derive(Debug, Clone, PartialEq, Eq, Hash)]
20pub struct DisplayKey(pub StructTag);
21
22#[async_trait::async_trait]
23impl Loader<DisplayKey> for PgReader {
24    type Value = StoredDisplay;
25    type Error = Error;
26
27    async fn load(&self, keys: &[DisplayKey]) -> Result<HashMap<DisplayKey, Self::Value>, Error> {
28        use sum_displays::dsl as d;
29
30        if keys.is_empty() {
31            return Ok(HashMap::new());
32        }
33
34        let mut conn = self.connect().await?;
35
36        let types = keys
37            .iter()
38            .map(|d| bcs::to_bytes(&d.0))
39            .collect::<Result<Vec<_>, _>>()
40            .context("Failed to serialize display types")?;
41
42        let displays: Vec<StoredDisplay> = conn
43            .results(d::sum_displays.filter(d::object_type.eq_any(types.clone())))
44            .await?;
45
46        let raw_type_to_stored: HashMap<_, _> = displays
47            .into_iter()
48            .map(|d| (d.object_type.clone(), d))
49            .collect();
50
51        Ok(keys
52            .iter()
53            .zip_debug_eq(types)
54            .filter_map(|(k, t)| Some((k.clone(), raw_type_to_stored.get(&t).cloned()?)))
55            .collect())
56    }
57}