pibtool_stock_data/
data_source.rs

1// SPDX-FileCopyrightText: Politik im Blick developers
2// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
3// SPDX-FileCopyrightText: amdoku <aqpoba@gmail.com>
4//
5// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2
6
7mod cities_app_data_source;
8mod city_leonding_data_source;
9mod city_linz_data_source;
10mod city_vienna_data_source;
11mod city_wels_data_source;
12mod district_vienna_data_source;
13mod frag_den_staat_data_source;
14mod gemdat_folders_data_source;
15mod gsz_accordion_cards_data_source;
16mod legal_framework_data_source;
17mod municipality_breitenfurt_data_source;
18mod official_website_data_source;
19mod session_net_data_source;
20mod unknown_page_format_data_source;
21mod wikipedia_page_data_source;
22
23pub use cities_app_data_source::CitiesAppDataSource;
24pub use city_leonding_data_source::CityLeondingDataSource;
25pub use city_linz_data_source::CityLinzDataSource;
26pub use city_vienna_data_source::CityViennaDataSource;
27pub use city_wels_data_source::CityWelsDataSource;
28pub use district_vienna_data_source::DistrictViennaDataSource;
29pub use frag_den_staat_data_source::FragDenStaatDataSource;
30pub use gemdat_folders_data_source::GemdatFoldersDataSource;
31pub use gsz_accordion_cards_data_source::GszAccordionCardsDataSource;
32pub use legal_framework_data_source::LegalFrameworkDataSource;
33pub use municipality_breitenfurt_data_source::MunicipalityBreitenfurtDataSource;
34pub use official_website_data_source::OfficialWebsiteDataSource;
35pub use session_net_data_source::{SessionNetDataSource, SessionNetDocumentsConfiguration};
36pub use unknown_page_format_data_source::UnknownPageFormatDataSource;
37pub use wikipedia_page_data_source::WikipediaPageDataSource;
38
39use serde::{Deserialize, Serialize};
40
41use super::DocumentKind;
42
43/// An enumeration type representing one of the available data source descriptions.
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
45#[serde(tag = "kind", rename_all = "snake_case")]
46pub enum DataSource {
47    /// Official website data source.
48    OfficialWebsite(OfficialWebsiteDataSource),
49
50    /// Wikipedia page data source.
51    WikipediaPage(WikipediaPageDataSource),
52
53    /// Legal framework data source.
54    LegalFramework(LegalFrameworkDataSource),
55
56    /// Frag den Staat data source.
57    FragDenStaat(FragDenStaatDataSource),
58
59    /// Gemdat folders data source.
60    GemdatFolders(GemdatFoldersDataSource),
61
62    /// GSZ accordion data source.
63    GszAccordionCards(GszAccordionCardsDataSource),
64
65    /// CitiesApp data source.
66    CitiesApp(CitiesAppDataSource),
67
68    /// SessionNet data source.
69    SessionNet(SessionNetDataSource),
70
71    /// City Vienna data source.
72    CityVienna(CityViennaDataSource),
73
74    /// City Wels data source.
75    CityWels(CityWelsDataSource),
76
77    /// Viennese district data source.
78    DistrictVienna(DistrictViennaDataSource),
79
80    /// Municipality of Breitenfurt data source.
81    MunicipalityBreitenfurt(MunicipalityBreitenfurtDataSource),
82
83    /// City Linz data source.
84    CityLinz(CityLinzDataSource),
85
86    /// City Leonding data source.
87    CityLeonding(CityLeondingDataSource),
88
89    /// Data source for a web page in an unknown format.
90    UnknownPageFormat(UnknownPageFormatDataSource),
91}
92
93/// A trait for providing information about a data source.
94pub trait DataSourceInfo {
95    /// Tell whether the download is supported from that data source.
96    fn is_download_supported(&self) -> bool;
97
98    /// Get the list of documents provided by that data source.
99    fn provides_documents(&self, document_kind: DocumentKind) -> bool;
100}
101
102impl DataSource {
103    fn inner(&self) -> &dyn DataSourceInfo {
104        match self {
105            DataSource::OfficialWebsite(ds) => ds,
106            DataSource::WikipediaPage(ds) => ds,
107            DataSource::LegalFramework(ds) => ds,
108            DataSource::FragDenStaat(ds) => ds,
109            DataSource::GemdatFolders(ds) => ds,
110            DataSource::GszAccordionCards(ds) => ds,
111            DataSource::CitiesApp(ds) => ds,
112            DataSource::SessionNet(ds) => ds,
113            DataSource::CityVienna(ds) => ds,
114            DataSource::CityWels(ds) => ds,
115            DataSource::DistrictVienna(ds) => ds,
116            DataSource::MunicipalityBreitenfurt(ds) => ds,
117            DataSource::CityLinz(ds) => ds,
118            DataSource::UnknownPageFormat(ds) => ds,
119            DataSource::CityLeonding(ds) => ds,
120        }
121    }
122}
123
124impl DataSourceInfo for DataSource {
125    fn is_download_supported(&self) -> bool {
126        self.inner().is_download_supported()
127    }
128
129    fn provides_documents(&self, document_kind: DocumentKind) -> bool {
130        self.inner().provides_documents(document_kind)
131    }
132}