sui_indexer_alt_reader/
displays.rs1use 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#[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}