use arrow_flight::PutResult;
use serde::{Deserialize, Serialize};
use snafu::ResultExt;
use crate::error;
#[derive(Serialize, Deserialize)]
pub struct DoPutMetadata {
request_id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
min_timestamp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
max_timestamp: Option<i64>,
}
impl DoPutMetadata {
pub fn new(request_id: i64, min_timestamp: Option<i64>, max_timestamp: Option<i64>) -> Self {
Self {
request_id,
min_timestamp,
max_timestamp,
}
}
pub fn request_id(&self) -> i64 {
self.request_id
}
#[must_use]
pub fn min_timestamp(&self) -> Option<i64> {
self.min_timestamp
}
#[must_use]
pub fn max_timestamp(&self) -> Option<i64> {
self.max_timestamp
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DoPutResponse {
request_id: i64,
affected_rows: usize,
}
impl DoPutResponse {
pub fn new(request_id: i64, affected_rows: usize) -> Self {
Self {
request_id,
affected_rows,
}
}
pub fn request_id(&self) -> i64 {
self.request_id
}
pub fn affected_rows(&self) -> usize {
self.affected_rows
}
}
impl TryFrom<PutResult> for DoPutResponse {
type Error = error::Error;
fn try_from(value: PutResult) -> Result<Self, Self::Error> {
serde_json::from_slice(&value.app_metadata).context(error::SerdeJsonSnafu)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serde_do_put_metadata() {
let serialized = r#"{"request_id":42}"#;
let metadata = serde_json::from_str::<DoPutMetadata>(serialized).unwrap();
assert_eq!(metadata.request_id(), 42);
assert_eq!(metadata.min_timestamp(), None);
assert_eq!(metadata.max_timestamp(), None);
let metadata_with_ts = DoPutMetadata::new(42, Some(1000), Some(2000));
let serialized = serde_json::to_string(&metadata_with_ts).unwrap();
assert_eq!(
serialized,
r#"{"request_id":42,"min_timestamp":1000,"max_timestamp":2000}"#
);
let deserialized = serde_json::from_str::<DoPutMetadata>(&serialized).unwrap();
assert_eq!(deserialized.request_id(), 42);
assert_eq!(deserialized.min_timestamp(), Some(1000));
assert_eq!(deserialized.max_timestamp(), Some(2000));
let old_field_names = r#"{"request_id":42,"start_timestamp":1000,"end_timestamp":2000}"#;
let deserialized = serde_json::from_str::<DoPutMetadata>(old_field_names).unwrap();
assert_eq!(deserialized.min_timestamp(), None);
assert_eq!(deserialized.max_timestamp(), None);
}
#[test]
fn test_serde_do_put_response() {
let x = DoPutResponse::new(42, 88);
let serialized = serde_json::to_string(&x).unwrap();
assert_eq!(serialized, r#"{"request_id":42,"affected_rows":88}"#);
}
}