geoprox-core 0.5.0

Core library for Geoprox, provides geospatial indexing and search functionalities
Documentation
use std::time::{Duration, Instant, SystemTime};

use serde::{Deserialize, Serialize};

use crate::index::SpatialIndex;

impl Serialize for SpatialIndex {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let sys_now = SystemTime::now();
        let now = Instant::now();
        self.objects()
            .into_iter()
            .map(|(key, ghash, ttl)| (key, ghash, ttl.map(|expire_at| sys_now - (now - expire_at))))
            .collect::<Vec<(String, String, Option<SystemTime>)>>()
            .serialize(serializer)
    }
}

impl<'de> Deserialize<'de> for SpatialIndex {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: serde::Deserializer<'de>,
    {
        let keys: Vec<(String, String, Option<SystemTime>)> = Vec::deserialize(deserializer)?;
        let sys_now = SystemTime::now();

        let mut index = SpatialIndex::default();
        keys.into_iter().for_each(|(key, ghash, sys_ttl)| {
            let expiration = sys_ttl.map(|ttl| {
                sys_now
                    .duration_since(ttl)
                    .unwrap_or(Duration::from_secs(0))
            });
            index.insert(&key, &ghash, expiration);
        });

        Ok(index)
    }
}