use chrono::{DateTime, Utc};
use geo::Point;
use routers_network::{Entry, Metadata};
use routers_shard::{Geohash, GeohashStrategy, ShardingStrategy};
use routers_transition::candidate::RoutedPath;
use routers_transition::matcher::{Continuation, Trip};
use serde::{Deserialize, Serialize};
use crate::store::Storable;
#[derive(Debug, Serialize, Deserialize)]
#[serde(bound(serialize = "E: Serialize", deserialize = "E: Deserialize<'de>"))]
pub struct MatchContext<E: Entry> {
pub continuation: Continuation<E>,
pub vehicle_id: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MatchResult<E: Entry, M: Metadata> {
pub path: RoutedPath<E, M>,
pub vehicle_id: String,
pub trip: Trip<E>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Payload {
pub trip_id: String,
pub vehicle_id: String,
pub provider: String,
#[serde(with = "chrono::serde::ts_microseconds")]
pub timestamp: DateTime<Utc>,
pub point: Point,
}
impl Payload {
pub fn as_event(&self) -> RawEvent {
RawEvent {
vehicle_id: self.vehicle_id.clone(),
point: self.point,
timestamp: self.timestamp,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct RawEvent {
pub vehicle_id: String,
pub point: Point,
#[serde(with = "chrono::serde::ts_microseconds")]
pub timestamp: DateTime<Utc>,
}
impl Storable for RawEvent {
type ShardId = Geohash;
type Key = String;
fn shard_id(&self) -> Self::ShardId {
GeohashStrategy::with_precision(4).locate(self.point)
}
fn key(&self) -> Self::Key {
self.vehicle_id.clone()
}
}