routers_tz 0.1.1

Timezone Resolver
Documentation
use std::fmt::Debug;

use geo::{Contains, Rect};
use routers_tz_types::{
    TimeZone, storage::basic::BasicStorageBackend, timezone::internal::TimeZoneGeometry,
};

use crate::TimezoneResolver;

pub struct BasicStorage {
    backend: &'static BasicStorageBackend,
}

impl Debug for BasicStorage {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str("BasicStorage")
    }
}

impl Default for BasicStorage {
    fn default() -> Self {
        BasicStorage {
            backend: crate::generated::basic::storage(),
        }
    }
}

impl TimezoneResolver for BasicStorage {
    type Error = ();

    fn search(&self, rect: &Rect) -> Result<Vec<TimeZone>, Self::Error> {
        let timezones = self
            .backend
            .geometries
            .iter()
            .enumerate()
            .filter_map(|(index, TimeZoneGeometry(geometry))| {
                if geometry.contains(rect) {
                    Some(TimeZone::new(self.backend.names[index].tz()))
                } else {
                    None
                }
            })
            .collect::<Vec<TimeZone>>();

        match timezones[..] {
            [] => Err(()),
            _ => Ok(timezones),
        }
    }
}