iota_graphql_rpc/types/
chain_identifier.rs1use async_graphql::*;
6use diesel::QueryDsl;
7use iota_indexer::schema::chain_identifier;
8use iota_types::{
9 digests::ChainIdentifier as NativeChainIdentifier, messages_checkpoint::CheckpointDigest,
10};
11
12use crate::{
13 data::{Db, DbConnection, QueryExecutor},
14 error::Error,
15};
16
17pub(crate) struct ChainIdentifier;
18
19impl ChainIdentifier {
20 pub(crate) async fn query(db: &Db) -> Result<NativeChainIdentifier, Error> {
22 use chain_identifier::dsl;
23
24 let digest_bytes = db
25 .execute(move |conn| {
26 conn.first(move || dsl::chain_identifier.select(dsl::checkpoint_digest))
27 })
28 .await
29 .map_err(|e| Error::Internal(format!("Failed to fetch genesis digest: {e}")))?;
30
31 Self::from_bytes(digest_bytes)
32 }
33
34 pub(crate) fn from_bytes(bytes: Vec<u8>) -> Result<NativeChainIdentifier, Error> {
37 let genesis_digest = CheckpointDigest::try_from(bytes)
38 .map_err(|e| Error::Internal(format!("Failed to deserialize genesis digest: {e}")))?;
39 Ok(NativeChainIdentifier::from(genesis_digest))
40 }
41}