pibtool_stock_data/
data_source.rs

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