use crate::config::WriteType;
pub const WRITE_TYPE_XATTR_KEY: &str = "innerWriteType";
#[derive(Debug, Clone, PartialEq, Default)]
pub enum WriteTypeXAttr {
Explicit(WriteType),
#[default]
Inherit,
}
pub fn get_write_type_from_xattr(
xattr: &std::collections::HashMap<String, Vec<u8>>,
) -> Option<WriteType> {
let raw = xattr.get(WRITE_TYPE_XATTR_KEY)?;
let s = std::str::from_utf8(raw).ok()?;
s.parse::<WriteType>().ok()
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::WriteType;
use std::collections::HashMap;
fn xattr(key: &str, val: &str) -> HashMap<String, Vec<u8>> {
let mut m = HashMap::new();
m.insert(key.to_string(), val.as_bytes().to_vec());
m
}
#[test]
fn test_get_must_cache() {
let x = xattr(WRITE_TYPE_XATTR_KEY, "MUST_CACHE");
assert_eq!(get_write_type_from_xattr(&x), Some(WriteType::MustCache));
}
#[test]
fn test_get_cache_through() {
let x = xattr(WRITE_TYPE_XATTR_KEY, "CACHE_THROUGH");
assert_eq!(get_write_type_from_xattr(&x), Some(WriteType::CacheThrough));
}
#[test]
fn test_get_through() {
let x = xattr(WRITE_TYPE_XATTR_KEY, "THROUGH");
assert_eq!(get_write_type_from_xattr(&x), Some(WriteType::Through));
}
#[test]
fn test_get_async_through() {
let x = xattr(WRITE_TYPE_XATTR_KEY, "ASYNC_THROUGH");
assert_eq!(get_write_type_from_xattr(&x), Some(WriteType::AsyncThrough));
}
#[test]
fn test_key_absent_returns_none() {
let x = xattr("other_key", "MUST_CACHE");
assert_eq!(get_write_type_from_xattr(&x), None);
}
#[test]
fn test_invalid_value_returns_none() {
let x = xattr(WRITE_TYPE_XATTR_KEY, "NOT_A_WRITE_TYPE");
assert_eq!(get_write_type_from_xattr(&x), None);
}
#[test]
fn test_empty_map_returns_none() {
assert_eq!(get_write_type_from_xattr(&HashMap::new()), None);
}
#[test]
fn test_write_type_xattr_default_is_inherit() {
assert_eq!(WriteTypeXAttr::default(), WriteTypeXAttr::Inherit);
}
}