aion_server/namespace/
mint_forward.rs1use std::net::SocketAddr;
13use std::sync::Arc;
14
15use async_trait::async_trait;
16
17use aion_proto::generated;
18use aion_store::NamespaceOrigin;
19
20use super::route::{ForwardMintError, MintCredentials, MintForwarder, encode_mint_origin};
21use crate::routing::{ForwardReply, ForwardRequest, RequestForwarder, owner_refusal};
22
23#[derive(Clone)]
25pub struct GrpcMintForwarder {
26 forwarder: Arc<dyn RequestForwarder>,
27}
28
29impl GrpcMintForwarder {
30 #[must_use]
32 pub const fn new(forwarder: Arc<dyn RequestForwarder>) -> Self {
33 Self { forwarder }
34 }
35}
36
37fn classify(status: &tonic::Status) -> ForwardMintError {
46 owner_refusal(status).map_or_else(
47 || ForwardMintError::Unreachable(status.code().to_string()),
48 ForwardMintError::Refused,
49 )
50}
51
52#[async_trait]
53impl MintForwarder for GrpcMintForwarder {
54 async fn forward_mint(
55 &self,
56 target: SocketAddr,
57 credentials: &MintCredentials,
58 namespaces: &[String],
59 origin: NamespaceOrigin,
60 ) -> Result<(), ForwardMintError> {
61 let request = generated::MintNamespaceRequest {
62 namespaces: namespaces.to_vec(),
63 origin: encode_mint_origin(origin),
64 };
65 match self
66 .forwarder
67 .forward(
68 target,
69 credentials.to_grpc_metadata(),
70 ForwardRequest::MintNamespace(request),
71 )
72 .await
73 {
74 Ok(ForwardReply::MintNamespace(_)) => Ok(()),
75 Ok(_) => Err(ForwardMintError::Unreachable(
76 "the forwarder returned a reply for a different request".to_owned(),
77 )),
78 Err(status) => Err(classify(&status)),
79 }
80 }
81}