Skip to main content

quadbin_schema/
metadata.rs

1use arrow_schema::{ArrowError, Field};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use std::usize;
6
7#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
8pub struct Metadata {
9    pub min_zoom: i32,
10    pub max_zoom: i32,
11}
12
13impl Metadata {
14    /// Creates a new [`Metadata`] object.
15    pub fn new(min_zoom: i32, max_zoom: i32) -> Self {
16        Self { min_zoom, max_zoom }
17    }
18
19    /// Expose the underlying tile_size.
20    pub fn min_zoom(&self) -> &i32 {
21        &self.min_zoom
22    }
23
24    /// Expose the underlying binary_type
25    pub fn max_zoom(&self) -> &i32 {
26        &self.max_zoom
27    }
28
29    pub fn to_json_value(&self) -> Value {
30        serde_json::to_value(self).unwrap()
31    }
32
33    pub fn to_str_value(&self) -> String {
34        let json_value = self.to_json_value();
35
36        serde_json::to_string(&json_value).unwrap()
37    }
38
39    /// Serialize this metadata to a string.
40    ///
41    /// If `None`, no extension metadata should be written.
42    pub(crate) fn serialize(&self) -> Option<String> {
43        Some(serde_json::to_string(&self).unwrap())
44    }
45
46    /// Deserialize metadata from a string.
47    pub(crate) fn deserialize<S: AsRef<str>>(metadata: Option<S>) -> Result<Self, ArrowError> {
48        if let Some(ext_meta) = metadata {
49            Ok(serde_json::from_str(ext_meta.as_ref())
50                .map_err(|err| ArrowError::ExternalError(Box::new(err)))?)
51        } else {
52            Ok(Default::default())
53        }
54    }
55}
56
57impl TryFrom<&Field> for Metadata {
58    type Error = ArrowError;
59
60    fn try_from(value: &Field) -> Result<Self, Self::Error> {
61        Self::deserialize(value.extension_type_metadata())
62    }
63}