Skip to content

Commit cc9660f

Browse files
authored
Merge pull request #889 from input-output-hk/jpraynaud/870-fix-dyn-artifact-trait-object
Make `Artifact` usable as trait object
2 parents b679c45 + a9e3910 commit cc9660f

File tree

9 files changed

+114
-18
lines changed

9 files changed

+114
-18
lines changed

Cargo.lock

Lines changed: 67 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ tar = "0.4.38"
3232
thiserror = "1.0.31"
3333
tokio = { version = "1.17.0", features = ["full"] }
3434
tokio-util = { version = "0.7.1", features = ["codec"] }
35+
typetag = "0.2.8"
3536
uuid = { version = "1.3.0", features = ["v4", "fast-rng", "macro-diagnostics"] }
3637
warp = "0.3"
3738

mithril-aggregator/src/artifact_builder/artifact_builder_service.rs

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use async_trait::async_trait;
2+
13
use std::sync::Arc;
24

35
use mithril_common::{
@@ -10,14 +12,29 @@ use crate::artifact_builder::ArtifactBuilder;
1012

1113
use super::MithrilStakeDistribution;
1214

13-
/// ArtifactBuilder Service
14-
pub struct ArtifactBuilderService {
15+
#[cfg(test)]
16+
use mockall::automock;
17+
18+
/// ArtifactBuilder Service trait
19+
#[cfg_attr(test, automock)]
20+
#[async_trait]
21+
pub trait ArtifactBuilderService: Send + Sync {
22+
/// Compute artifact from signed entity type
23+
async fn compute_artifact(
24+
&self,
25+
signed_entity_type: SignedEntityType,
26+
certificate: &Certificate,
27+
) -> StdResult<Arc<dyn Artifact>>;
28+
}
29+
30+
/// Mithril ArtifactBuilder Service
31+
pub struct MithrilArtifactBuilderService {
1532
mithril_stake_distribution_artifact_builder:
1633
Arc<dyn ArtifactBuilder<Epoch, MithrilStakeDistribution>>,
1734
}
1835

19-
impl ArtifactBuilderService {
20-
/// ArtifactBuilderService factory
36+
impl MithrilArtifactBuilderService {
37+
/// MithrilArtifactBuilderService factory
2138
#[allow(dead_code)]
2239
pub fn new(
2340
mithril_stake_distribution_artifact_builder: Arc<
@@ -30,13 +47,14 @@ impl ArtifactBuilderService {
3047
}
3148
}
3249

33-
impl ArtifactBuilderService {
50+
#[async_trait]
51+
impl ArtifactBuilderService for MithrilArtifactBuilderService {
3452
#[allow(dead_code)]
3553
async fn compute_artifact(
3654
&self,
3755
signed_entity_type: SignedEntityType,
3856
certificate: &Certificate,
39-
) -> StdResult<Arc<impl Artifact>> {
57+
) -> StdResult<Arc<dyn Artifact>> {
4058
let artifact = match signed_entity_type {
4159
SignedEntityType::MithrilStakeDistribution(e) => Arc::new(
4260
self.mithril_stake_distribution_artifact_builder
@@ -70,18 +88,21 @@ mod tests {
7088
.once()
7189
.return_once(move |_, _| Ok(mithril_stake_distribution_clone));
7290

73-
let artifact_builder_service =
74-
ArtifactBuilderService::new(Arc::new(mock_mithril_stake_distribution_artifact_builder));
91+
let artifact_builder_service = MithrilArtifactBuilderService::new(Arc::new(
92+
mock_mithril_stake_distribution_artifact_builder,
93+
));
7594
let certificate = Certificate::default();
7695

7796
let signed_entity_type = SignedEntityType::MithrilStakeDistribution(Epoch(1));
7897
let artifact = artifact_builder_service
7998
.compute_artifact(signed_entity_type, &certificate)
8099
.await
81100
.unwrap();
101+
let mithril_stake_distribution_computed: MithrilStakeDistribution =
102+
serde_json::from_str(&serde_json::to_string(&artifact).unwrap()).unwrap();
82103
assert_eq!(
83104
serde_json::to_string(&mithril_stake_distribution_expected).unwrap(),
84-
serde_json::to_string(&artifact).unwrap()
105+
serde_json::to_string(&mithril_stake_distribution_computed).unwrap()
85106
);
86107
}
87108
}

mithril-aggregator/src/artifact_builder/dummy_artifact.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ impl DummyArtifact {
2222
}
2323
}
2424

25+
#[typetag::serde]
2526
impl Artifact for DummyArtifact {}
2627

2728
/// A [DummyArtifact] builder

mithril-aggregator/src/artifact_builder/mithril_stake_distribution.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ impl MithrilStakeDistribution {
2424
}
2525
}
2626

27+
#[typetag::serde]
2728
impl Artifact for MithrilStakeDistribution {}
2829

2930
/// A [MithrilStakeDistributionArtifact] builder

mithril-aggregator/src/dependency.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ pub struct DependencyManager {
115115
pub signable_builder_service: Arc<SignableBuilderService>,
116116

117117
/// Artifact Builder Service
118-
pub artifact_builder_service: Arc<ArtifactBuilderService>,
118+
pub artifact_builder_service: Arc<dyn ArtifactBuilderService>,
119119

120120
/// Certifier Service
121121
pub certifier_service: Arc<dyn CertifierService>,

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ use tokio::{
3333
use warp::Filter;
3434

3535
use crate::{
36-
artifact_builder::{ArtifactBuilderService, MithrilStakeDistributionArtifactBuilder},
36+
artifact_builder::{
37+
ArtifactBuilderService, MithrilArtifactBuilderService,
38+
MithrilStakeDistributionArtifactBuilder,
39+
},
3740
certifier_service::{CertifierService, MithrilCertifierService},
3841
configuration::{ExecutionEnvironment, LIST_SNAPSHOTS_MAX_ITEMS},
3942
database::provider::{
@@ -170,7 +173,7 @@ pub struct DependenciesBuilder {
170173
pub signable_builder_service: Option<Arc<SignableBuilderService>>,
171174

172175
/// Artifact Builder Service
173-
pub artifact_builder_service: Option<Arc<ArtifactBuilderService>>,
176+
pub artifact_builder_service: Option<Arc<dyn ArtifactBuilderService>>,
174177

175178
/// Certifier service
176179
pub certifier_service: Option<Arc<dyn CertifierService>>,
@@ -897,19 +900,21 @@ impl DependenciesBuilder {
897900
Ok(self.signable_builder_service.as_ref().cloned().unwrap())
898901
}
899902

900-
async fn build_artifact_builder_service(&mut self) -> Result<Arc<ArtifactBuilderService>> {
903+
async fn build_artifact_builder_service(&mut self) -> Result<Arc<dyn ArtifactBuilderService>> {
901904
let multi_signer = self.get_multi_signer().await?;
902905
let mithril_stake_distribution_artifact_builder =
903906
Arc::new(MithrilStakeDistributionArtifactBuilder::new(multi_signer));
904-
let artifact_builder_service = Arc::new(ArtifactBuilderService::new(
907+
let artifact_builder_service = Arc::new(MithrilArtifactBuilderService::new(
905908
mithril_stake_distribution_artifact_builder,
906909
));
907910

908911
Ok(artifact_builder_service)
909912
}
910913

911914
/// [ArtifactBuilderService] service
912-
pub async fn get_artifact_builder_service(&mut self) -> Result<Arc<ArtifactBuilderService>> {
915+
pub async fn get_artifact_builder_service(
916+
&mut self,
917+
) -> Result<Arc<dyn ArtifactBuilderService>> {
913918
if self.artifact_builder_service.is_none() {
914919
self.artifact_builder_service = Some(self.build_artifact_builder_service().await?);
915920
}

mithril-common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ strum = "0.24.1"
4949
strum_macros = "0.24.1"
5050
thiserror = "1.0.31"
5151
tokio = { version = "1.17.0", features = ["full"] }
52+
typetag = "0.2.8"
5253
walkdir = "2"
5354
warp = "0.3"
5455

mithril-common/src/signable_builder/interface.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use async_trait::async_trait;
2-
use serde::{de::DeserializeOwned, Serialize};
32
use std::fmt::Debug;
43

54
use crate::{entities::ProtocolMessage, StdResult};
@@ -14,7 +13,8 @@ pub trait Signable: Send + Sync {
1413
}
1514

1615
/// Artifact is a trait for types that represent signed artifacts
17-
pub trait Artifact: Serialize + DeserializeOwned + PartialEq + Debug + Send + Sync {}
16+
#[typetag::serde(tag = "type")]
17+
pub trait Artifact: Debug + Send + Sync {}
1818

1919
/// SignableBuilder is trait for building a signable for a beacon
2020
#[async_trait]

0 commit comments

Comments
 (0)