use std::{
ops::RangeInclusive,
time::{Duration, SystemTime},
};
use crate::bridge::file_source::{RawResourceRequest, ResourceKind};
use super::from_epoch;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct ResourceRequest {
pub url: String,
pub kind: ResourceKind,
pub loading_methods: LoadingMethods,
pub storage_policy: StoragePolicy,
pub priority: Priority,
pub usage: Usage,
pub tile: Option<TileRequest>,
pub data_range: Option<RangeInclusive<u64>>,
pub prior_modified: Option<SystemTime>,
pub prior_expires: Option<SystemTime>,
pub prior_etag: Option<String>,
pub prior_data: Option<Vec<u8>>,
pub minimum_update_interval: Duration,
}
impl ResourceRequest {
pub(super) fn from_ffi(raw: &RawResourceRequest) -> Self {
Self {
url: raw.url.clone(),
kind: raw.kind,
loading_methods: LoadingMethods::from_bits(raw.loading_methods),
storage_policy: if raw.is_volatile {
StoragePolicy::Volatile
} else {
StoragePolicy::Permanent
},
priority: if raw.is_low_priority { Priority::Low } else { Priority::Regular },
usage: if raw.is_offline { Usage::Offline } else { Usage::Online },
tile: raw.has_tile.then(|| TileRequest {
url_template: raw.tile_url_template.clone(),
pixel_ratio: raw.tile_pixel_ratio,
x: raw.tile_x,
y: raw.tile_y,
z: raw.tile_z,
}),
data_range: raw.has_data_range.then_some(raw.data_range_start..=raw.data_range_end),
prior_modified: from_epoch(raw.has_prior_modified, raw.prior_modified_epoch_s),
prior_expires: from_epoch(raw.has_prior_expires, raw.prior_expires_epoch_s),
prior_etag: raw.has_prior_etag.then(|| raw.prior_etag.clone()),
prior_data: raw.has_prior_data.then(|| raw.prior_data.clone()),
minimum_update_interval: Duration::from_millis(
u64::try_from(raw.minimum_update_interval_ms).unwrap_or(0),
),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LoadingMethods(u8);
impl LoadingMethods {
const CACHE: u8 = 0b01;
const NETWORK: u8 = 0b10;
const fn from_bits(bits: u8) -> Self {
Self(bits)
}
#[must_use]
pub const fn has_cache(self) -> bool {
self.0 & Self::CACHE != 0
}
#[must_use]
pub const fn has_network(self) -> bool {
self.0 & Self::NETWORK != 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum StoragePolicy {
Permanent,
Volatile,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Priority {
Regular,
Low,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Usage {
Online,
Offline,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct TileRequest {
pub url_template: String,
pub pixel_ratio: u8,
pub x: i32,
pub y: i32,
pub z: i8,
}