fish_lib/game/
service_provider.rs1use 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}