use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use tilejson::{Bounds, TileJSON};
use super::config::PostgresInfo;
use crate::config::file::UnrecognizedValues;
use crate::config::file::postgres::utils::patch_json;
pub type FuncInfoSources = BTreeMap<String, FunctionInfo>;
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
pub struct FunctionInfo {
pub schema: String,
pub function: String,
pub minzoom: Option<u8>,
pub maxzoom: Option<u8>,
pub bounds: Option<Bounds>,
#[serde(skip)]
pub tilejson: Option<serde_json::Value>,
#[serde(flatten, skip_serializing)]
pub unrecognized: UnrecognizedValues,
}
impl FunctionInfo {
#[must_use]
pub fn new(schema: String, function: String, tilejson: Option<serde_json::Value>) -> Self {
Self {
schema,
function,
tilejson,
..Default::default()
}
}
#[must_use]
pub fn new_extended(
schema: String,
function: String,
minzoom: u8,
maxzoom: u8,
bounds: Bounds,
) -> Self {
Self {
schema,
function,
minzoom: Some(minzoom),
maxzoom: Some(maxzoom),
bounds: Some(bounds),
..Default::default()
}
}
}
impl PostgresInfo for FunctionInfo {
fn format_id(&self) -> String {
format!("{}.{}", self.schema, self.function)
}
fn to_tilejson(&self, source_id: String) -> TileJSON {
let mut tilejson = tilejson::tilejson! {
tiles: vec![], name: source_id,
description: self.format_id(),
};
tilejson.minzoom = self.minzoom;
tilejson.maxzoom = self.maxzoom;
tilejson.bounds = self.bounds;
patch_json(tilejson, self.tilejson.as_ref())
}
}
impl FunctionInfo {
#[must_use]
pub fn append_cfg_info(&self, cfg_inf: &Self) -> Self {
Self {
tilejson: self.tilejson.clone(),
..cfg_inf.clone()
}
}
}