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