@@ -17,6 +17,49 @@ use sp_governed_map::GovernedMapDataSource;
1717use sp_native_token_management:: NativeTokenManagementDataSource ;
1818use std:: { error:: Error , sync:: Arc } ;
1919
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+
2063#[ derive( Clone ) ]
2164pub struct DataSources {
2265 pub mc_hash : Arc < dyn McHashDataSource + Send + Sync > ,
@@ -30,26 +73,26 @@ pub struct DataSources {
3073pub ( crate ) async fn create_cached_data_sources (
3174 metrics_opt : Option < McFollowerMetrics > ,
3275) -> 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+ } ) ,
4791
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+ }
5396}
5497
5598pub fn create_mock_data_sources ( )
@@ -68,6 +111,7 @@ pub fn create_mock_data_sources()
68111pub const CANDIDATES_FOR_EPOCH_CACHE_SIZE : usize = 64 ;
69112pub const STAKE_CACHE_SIZE : usize = 100 ;
70113pub const GOVERNED_MAP_CACHE_SIZE : u16 = 100 ;
114+
71115pub async fn create_cached_db_sync_data_sources (
72116 metrics_opt : Option < McFollowerMetrics > ,
73117) -> Result < DataSources , Box < dyn Error + Send + Sync + ' static > > {
0 commit comments