use std::collections::HashMap;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Protocol {
min_reader_version: u32,
}
impl Protocol {
pub fn min_reader_version(&self) -> u32 {
self.min_reader_version
}
}
impl Default for Protocol {
fn default() -> Self {
Self {
min_reader_version: 1,
}
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Format {
provider: String,
options: Option<HashMap<String, String>>,
}
impl Format {
pub fn provider(&self) -> &str {
self.provider.as_ref()
}
pub fn options(&self) -> Option<&HashMap<String, String>> {
self.options.as_ref()
}
}
impl Default for Format {
fn default() -> Self {
Self {
provider: String::from("parquet"),
options: None,
}
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Metadata {
id: String,
name: Option<String>,
description: Option<String>,
format: Format,
schema_string: String,
partition_columns: Vec<String>,
#[serde(default)]
configuration: HashMap<String, String>,
version: Option<String>,
size: Option<u64>,
num_files: Option<u64>,
}
impl Metadata {
pub fn id(&self) -> &str {
&self.id
}
pub fn name(&self) -> Option<&str> {
self.name.as_deref()
}
pub fn description(&self) -> Option<&str> {
self.description.as_deref()
}
pub fn format(&self) -> &Format {
&self.format
}
pub fn schema_string(&self) -> &str {
&self.schema_string
}
pub fn partition_columns(&self) -> &[String] {
&self.partition_columns
}
pub fn configuration(&self) -> &HashMap<String, String> {
&self.configuration
}
pub fn version(&self) -> Option<&str> {
self.version.as_deref()
}
pub fn size(&self) -> Option<u64> {
self.size
}
pub fn num_files(&self) -> Option<u64> {
self.num_files
}
}
#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct File {
url: String,
id: String,
partition_values: HashMap<String, Option<String>>,
size: u64,
#[serde(skip_serializing_if = "Option::is_none")]
stats: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
version: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
timestamp: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
expiration_timestamp: Option<u64>,
}
impl File {
pub fn url(&self) -> &str {
self.url.as_ref()
}
pub fn url_mut(&mut self) -> &mut String {
&mut self.url
}
pub fn id(&self) -> &str {
self.id.as_ref()
}
pub fn partition_values(&self) -> HashMap<String, String> {
self.partition_values
.iter()
.map(|(k, v)| (k.clone(), v.clone().unwrap_or_default()))
.collect()
}
pub fn size(&self) -> u64 {
self.size
}
pub fn stats(&self) -> Option<&str> {
self.stats.as_deref()
}
pub fn version(&self) -> Option<u64> {
self.version
}
pub fn timestamp(&self) -> Option<u64> {
self.timestamp
}
pub fn expiration_timestamp(&self) -> Option<u64> {
self.expiration_timestamp
}
}