use crate::errors::Result;
use crate::format::{
ColumnCryptoMetaData as TColumnCryptoMetaData,
EncryptionWithColumnKey as TEncryptionWithColumnKey,
EncryptionWithFooterKey as TEncryptionWithFooterKey,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ColumnCryptoMetaData {
EncryptionWithFooterKey,
EncryptionWithColumnKey(EncryptionWithColumnKey),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct EncryptionWithColumnKey {
pub path_in_schema: Vec<String>,
pub key_metadata: Option<Vec<u8>>,
}
pub fn try_from_thrift(
thrift_column_crypto_metadata: &TColumnCryptoMetaData,
) -> Result<ColumnCryptoMetaData> {
let crypto_metadata = match thrift_column_crypto_metadata {
TColumnCryptoMetaData::ENCRYPTIONWITHFOOTERKEY(_) => {
ColumnCryptoMetaData::EncryptionWithFooterKey
}
TColumnCryptoMetaData::ENCRYPTIONWITHCOLUMNKEY(encryption_with_column_key) => {
ColumnCryptoMetaData::EncryptionWithColumnKey(EncryptionWithColumnKey {
path_in_schema: encryption_with_column_key.path_in_schema.clone(),
key_metadata: encryption_with_column_key.key_metadata.clone(),
})
}
};
Ok(crypto_metadata)
}
pub fn to_thrift(column_crypto_metadata: &ColumnCryptoMetaData) -> TColumnCryptoMetaData {
match column_crypto_metadata {
ColumnCryptoMetaData::EncryptionWithFooterKey => {
TColumnCryptoMetaData::ENCRYPTIONWITHFOOTERKEY(TEncryptionWithFooterKey {})
}
ColumnCryptoMetaData::EncryptionWithColumnKey(encryption_with_column_key) => {
TColumnCryptoMetaData::ENCRYPTIONWITHCOLUMNKEY(TEncryptionWithColumnKey {
path_in_schema: encryption_with_column_key.path_in_schema.clone(),
key_metadata: encryption_with_column_key.key_metadata.clone(),
})
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encryption_with_footer_key_from_thrift() {
let metadata = ColumnCryptoMetaData::EncryptionWithFooterKey;
assert_eq!(try_from_thrift(&to_thrift(&metadata)).unwrap(), metadata);
}
#[test]
fn test_encryption_with_column_key_from_thrift() {
let metadata = ColumnCryptoMetaData::EncryptionWithColumnKey(EncryptionWithColumnKey {
path_in_schema: vec!["abc".to_owned(), "def".to_owned()],
key_metadata: Some(vec![0, 1, 2, 3, 4, 5]),
});
assert_eq!(try_from_thrift(&to_thrift(&metadata)).unwrap(), metadata);
}
}