fish_lib/game/
service_provider.rs

1use crate::config::ConfigInterface;
2use crate::database::DatabaseInterface;
3use crate::game::repositories::fishing_history_entry_repository::{
4    FishingHistoryEntryRepository, FishingHistoryEntryRepositoryInterface,
5};
6use crate::game::repositories::item_repository::{ItemRepository, ItemRepositoryInterface};
7use crate::game::repositories::pond_repository::{PondRepository, PondRepositoryInterface};
8use crate::game::repositories::specimen_repository::{
9    SpecimenRepository, SpecimenRepositoryInterface,
10};
11use crate::game::repositories::user_repository::{UserRepository, UserRepositoryInterface};
12use crate::game::services::encounter_service::{EncounterService, EncounterServiceInterface};
13use crate::game::services::fishing_history_service::{
14    FishingHistoryService, FishingHistoryServiceInterface,
15};
16use crate::game::services::item_service::{ItemService, ItemServiceInterface};
17use crate::game::services::location_service::{LocationService, LocationServiceInterface};
18use crate::game::services::pond_service::{PondService, PondServiceInterface};
19use crate::game::services::species_service::{SpeciesService, SpeciesServiceInterface};
20use crate::game::services::specimen_service::{SpecimenService, SpecimenServiceInterface};
21use crate::game::services::user_service::{UserService, UserServiceInterface};
22use crate::game::services::weather_service::{WeatherService, WeatherServiceInterface};
23use std::sync::{Arc, RwLock};
24
25pub trait ServiceProviderInterface: Send + Sync {
26    fn config(&self) -> Arc<dyn ConfigInterface>;
27    fn database(&self) -> Arc<RwLock<dyn DatabaseInterface>>;
28    fn fishing_history_entry_repository(&self) -> Arc<dyn FishingHistoryEntryRepositoryInterface>;
29    fn item_repository(&self) -> Arc<dyn ItemRepositoryInterface>;
30    fn pond_repository(&self) -> Arc<dyn PondRepositoryInterface>;
31    fn specimen_repository(&self) -> Arc<dyn SpecimenRepositoryInterface>;
32    fn user_repository(&self) -> Arc<dyn UserRepositoryInterface>;
33    fn encounter_service(&self) -> Arc<dyn EncounterServiceInterface>;
34    fn fishing_history_service(&self) -> Arc<dyn FishingHistoryServiceInterface>;
35    fn item_service(&self) -> Arc<dyn ItemServiceInterface>;
36    fn location_service(&self) -> Arc<dyn LocationServiceInterface>;
37    fn pond_service(&self) -> Arc<dyn PondServiceInterface>;
38    fn species_service(&self) -> Arc<dyn SpeciesServiceInterface>;
39    fn specimen_service(&self) -> Arc<dyn SpecimenServiceInterface>;
40    fn user_service(&self) -> Arc<dyn UserServiceInterface>;
41    fn weather_service(&self) -> Arc<dyn WeatherServiceInterface>;
42}
43
44pub struct ServiceProvider {
45    config: Arc<dyn ConfigInterface>,
46    database: Arc<RwLock<dyn DatabaseInterface>>,
47    fishing_history_entry_repository: Arc<dyn FishingHistoryEntryRepositoryInterface>,
48    item_repository: Arc<dyn ItemRepositoryInterface>,
49    pond_repository: Arc<dyn PondRepositoryInterface>,
50    specimen_repository: Arc<dyn SpecimenRepositoryInterface>,
51    user_repository: Arc<dyn UserRepositoryInterface>,
52    encounter_service: Arc<dyn EncounterServiceInterface>,
53    fishing_history_service: Arc<dyn FishingHistoryServiceInterface>,
54    item_service: Arc<dyn ItemServiceInterface>,
55    location_service: Arc<dyn LocationServiceInterface>,
56    pond_service: Arc<dyn PondServiceInterface>,
57    species_service: Arc<dyn SpeciesServiceInterface>,
58    specimen_service: Arc<dyn SpecimenServiceInterface>,
59    user_service: Arc<dyn UserServiceInterface>,
60    weather_service: Arc<dyn WeatherServiceInterface>,
61}
62
63impl ServiceProvider {
64    pub fn new(
65        config: Arc<dyn ConfigInterface>,
66        database: Arc<RwLock<dyn DatabaseInterface>>,
67    ) -> Self {
68        let fishing_history_entry_repository =
69            Arc::new(FishingHistoryEntryRepository::new(database.clone()));
70        let item_repository = Arc::new(ItemRepository::new(database.clone()));
71        let pond_repository = Arc::new(PondRepository::new(database.clone()));
72        let specimen_repository = Arc::new(SpecimenRepository::new(database.clone()));
73        let user_repository = Arc::new(UserRepository::new(database.clone()));
74
75        let encounter_service = Arc::new(EncounterService::new(config.clone()));
76        let fishing_history_service = Arc::new(FishingHistoryService::new(
77            config.clone(),
78            fishing_history_entry_repository.clone(),
79        ));
80        let item_service = Arc::new(ItemService::new(config.clone(), item_repository.clone()));
81        let location_service = Arc::new(LocationService::new(config.clone()));
82        let pond_service = Arc::new(PondService::new(pond_repository.clone()));
83        let species_service = Arc::new(SpeciesService::new(config.clone()));
84        let specimen_service = Arc::new(SpecimenService::new(specimen_repository.clone()));
85        let user_service = Arc::new(UserService::new(
86            fishing_history_entry_repository.clone(),
87            user_repository.clone(),
88        ));
89        let weather_service = Arc::new(WeatherService::new(config.clone()));
90
91        Self {
92            config,
93            database,
94            fishing_history_entry_repository,
95            item_repository,
96            pond_repository,
97            specimen_repository,
98            user_repository,
99            encounter_service,
100            fishing_history_service,
101            item_service,
102            location_service,
103            pond_service,
104            species_service,
105            specimen_service,
106            user_service,
107            weather_service,
108        }
109    }
110
111    pub fn create(
112        config: Arc<dyn ConfigInterface>,
113        database: Arc<RwLock<dyn DatabaseInterface>>,
114    ) -> Arc<dyn ServiceProviderInterface> {
115        Arc::new(ServiceProvider::new(config, database))
116    }
117}
118
119impl ServiceProviderInterface for ServiceProvider {
120    fn config(&self) -> Arc<dyn ConfigInterface> {
121        self.config.clone()
122    }
123
124    fn database(&self) -> Arc<RwLock<dyn DatabaseInterface>> {
125        self.database.clone()
126    }
127
128    fn fishing_history_entry_repository(&self) -> Arc<dyn FishingHistoryEntryRepositoryInterface> {
129        self.fishing_history_entry_repository.clone()
130    }
131
132    fn item_repository(&self) -> Arc<dyn ItemRepositoryInterface> {
133        self.item_repository.clone()
134    }
135
136    fn pond_repository(&self) -> Arc<dyn PondRepositoryInterface> {
137        self.pond_repository.clone()
138    }
139
140    fn specimen_repository(&self) -> Arc<dyn SpecimenRepositoryInterface> {
141        self.specimen_repository.clone()
142    }
143
144    fn user_repository(&self) -> Arc<dyn UserRepositoryInterface> {
145        self.user_repository.clone()
146    }
147
148    fn encounter_service(&self) -> Arc<dyn EncounterServiceInterface> {
149        self.encounter_service.clone()
150    }
151
152    fn fishing_history_service(&self) -> Arc<dyn FishingHistoryServiceInterface> {
153        self.fishing_history_service.clone()
154    }
155
156    fn item_service(&self) -> Arc<dyn ItemServiceInterface> {
157        self.item_service.clone()
158    }
159
160    fn location_service(&self) -> Arc<dyn LocationServiceInterface> {
161        self.location_service.clone()
162    }
163
164    fn pond_service(&self) -> Arc<dyn PondServiceInterface> {
165        self.pond_service.clone()
166    }
167
168    fn species_service(&self) -> Arc<dyn SpeciesServiceInterface> {
169        self.species_service.clone()
170    }
171
172    fn specimen_service(&self) -> Arc<dyn SpecimenServiceInterface> {
173        self.specimen_service.clone()
174    }
175
176    fn user_service(&self) -> Arc<dyn UserServiceInterface> {
177        self.user_service.clone()
178    }
179
180    fn weather_service(&self) -> Arc<dyn WeatherServiceInterface> {
181        self.weather_service.clone()
182    }
183}