Skip to main content

par_osm_rust/
filter.rs

1//! Feature filter controlling which OSM feature types are included in conversion.
2
3use serde::{Deserialize, Serialize};
4
5fn default_true() -> bool {
6    true
7}
8
9/// Controls which OSM feature categories are fetched from Overpass and/or
10/// rendered during world generation. All fields default to `true`.
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
12pub struct FeatureFilter {
13    #[serde(default = "default_true")]
14    pub roads: bool,
15    #[serde(default = "default_true")]
16    pub buildings: bool,
17    #[serde(default = "default_true")]
18    pub water: bool,
19    #[serde(default = "default_true")]
20    pub landuse: bool,
21    #[serde(default = "default_true")]
22    pub railways: bool,
23}
24
25impl Default for FeatureFilter {
26    fn default() -> Self {
27        Self {
28            roads: true,
29            buildings: true,
30            water: true,
31            landuse: true,
32            railways: true,
33        }
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn default_enables_all() {
43        let f = FeatureFilter::default();
44        assert!(f.roads, "roads should be enabled by default");
45        assert!(f.buildings, "buildings should be enabled by default");
46        assert!(f.water, "water should be enabled by default");
47        assert!(f.landuse, "landuse should be enabled by default");
48        assert!(f.railways, "railways should be enabled by default");
49    }
50
51    #[test]
52    fn serde_empty_json_uses_defaults() {
53        let f: FeatureFilter = serde_json::from_str("{}").unwrap();
54        assert!(f.roads && f.buildings && f.water && f.landuse && f.railways);
55    }
56
57    #[test]
58    fn serde_partial_disable() {
59        let f: FeatureFilter = serde_json::from_str(r#"{"roads":false,"landuse":false}"#).unwrap();
60        assert!(!f.roads, "roads should be disabled");
61        assert!(!f.landuse, "landuse should be disabled");
62        assert!(f.buildings, "buildings should still be enabled");
63        assert!(f.water, "water should still be enabled");
64        assert!(f.railways, "railways should still be enabled");
65    }
66}