@@ -17,6 +17,49 @@ use sp_governed_map::GovernedMapDataSource;
17
17
use sp_native_token_management:: NativeTokenManagementDataSource ;
18
18
use std:: { error:: Error , sync:: Arc } ;
19
19
20
+ pub const DATA_SOURCE_VAR : & str = "CARDANO_DATA_SOURCE" ;
21
+
22
+ #[ derive( Clone , Debug , PartialEq ) ]
23
+ pub enum DataSourceType {
24
+ DbSync ,
25
+ Mock ,
26
+ Dolos ,
27
+ }
28
+
29
+ impl DataSourceType {
30
+ pub fn from_env ( ) -> Result < Self , Box < dyn Error + Send + Sync + ' static > > {
31
+ let env_value =
32
+ std:: env:: var ( DATA_SOURCE_VAR ) . map_err ( |_| format ! ( "{DATA_SOURCE_VAR} is not set" ) ) ?;
33
+
34
+ env_value. parse ( ) . map_err ( |err : String | err. into ( ) )
35
+ }
36
+ }
37
+
38
+ impl std:: str:: FromStr for DataSourceType {
39
+ type Err = String ;
40
+
41
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
42
+ match s. to_lowercase ( ) . as_str ( ) {
43
+ "db-sync" => Ok ( DataSourceType :: DbSync ) ,
44
+ "mock" => Ok ( DataSourceType :: Mock ) ,
45
+ "dolos" => Ok ( DataSourceType :: Dolos ) ,
46
+ _ => {
47
+ Err ( format ! ( "Invalid data source type: {}. Valid options: db-sync, mock, dolos" , s) )
48
+ } ,
49
+ }
50
+ }
51
+ }
52
+
53
+ impl std:: fmt:: Display for DataSourceType {
54
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
55
+ match self {
56
+ DataSourceType :: DbSync => write ! ( f, "db-sync" ) ,
57
+ DataSourceType :: Mock => write ! ( f, "mock" ) ,
58
+ DataSourceType :: Dolos => write ! ( f, "dolos" ) ,
59
+ }
60
+ }
61
+ }
62
+
20
63
#[ derive( Clone ) ]
21
64
pub struct DataSources {
22
65
pub mc_hash : Arc < dyn McHashDataSource + Send + Sync > ,
@@ -30,26 +73,26 @@ pub struct DataSources {
30
73
pub ( crate ) async fn create_cached_data_sources (
31
74
metrics_opt : Option < McFollowerMetrics > ,
32
75
) -> std:: result:: Result < DataSources , ServiceError > {
33
- if use_mock_follower ( ) {
34
- create_mock_data_sources ( ) . map_err ( |err| {
35
- ServiceError :: Application (
36
- format ! ( "Failed to create mock data sources: {err}. Check configuration." ) . into ( ) ,
37
- )
38
- } )
39
- } else {
40
- create_cached_db_sync_data_sources ( metrics_opt) . await . map_err ( |err| {
41
- ServiceError :: Application (
42
- format ! ( "Failed to create db-sync data sources: {err}" ) . into ( ) ,
43
- )
44
- } )
45
- }
46
- }
76
+ let data_source_type = DataSourceType :: from_env ( )
77
+ . map_err ( |err| ServiceError :: Application ( err. to_string ( ) . into ( ) ) ) ?;
78
+
79
+ match data_source_type {
80
+ DataSourceType :: DbSync => {
81
+ create_cached_db_sync_data_sources ( metrics_opt) . await . map_err ( |err| {
82
+ ServiceError :: Application (
83
+ format ! ( "Failed to create db-sync data sources: {err}" ) . into ( ) ,
84
+ )
85
+ } )
86
+ } ,
87
+
88
+ DataSourceType :: Mock => create_mock_data_sources ( ) . map_err ( |err| {
89
+ ServiceError :: Application ( format ! ( "Failed to create mock data sources: {err}" ) . into ( ) )
90
+ } ) ,
47
91
48
- fn use_mock_follower ( ) -> bool {
49
- std:: env:: var ( "USE_MOCK_DATA_SOURCES" )
50
- . ok ( )
51
- . and_then ( |v| v. parse :: < bool > ( ) . ok ( ) )
52
- . unwrap_or ( false )
92
+ DataSourceType :: Dolos => {
93
+ Err ( ServiceError :: Application ( "Dolos data source is not implemented yet." . into ( ) ) )
94
+ } ,
95
+ }
53
96
}
54
97
55
98
pub fn create_mock_data_sources ( )
@@ -68,6 +111,7 @@ pub fn create_mock_data_sources()
68
111
pub const CANDIDATES_FOR_EPOCH_CACHE_SIZE : usize = 64 ;
69
112
pub const STAKE_CACHE_SIZE : usize = 100 ;
70
113
pub const GOVERNED_MAP_CACHE_SIZE : u16 = 100 ;
114
+
71
115
pub async fn create_cached_db_sync_data_sources (
72
116
metrics_opt : Option < McFollowerMetrics > ,
73
117
) -> Result < DataSources , Box < dyn Error + Send + Sync + ' static > > {
0 commit comments