use crate::{WriteableKey, KeyNameInvalidError};
pub struct KeyBuilder<T: WriteableKey> {
key: T,
}
impl<T: WriteableKey> KeyBuilder<T> {
pub fn new(name: &str) -> Result<Self, KeyNameInvalidError> {
let key = T::new(name)?;
Ok(KeyBuilder { key })
}
pub fn new_empty() -> Self {
let key = T::new_empty();
KeyBuilder { key }
}
pub fn name(mut self, name: &str) -> Result<Self, KeyNameInvalidError> {
self.key.set_name(name)?;
Ok(self)
}
pub fn value(mut self, key_value: T::SetValue) -> Self {
self.key.set_value(key_value);
self
}
pub fn meta(mut self, metaname: &str, metavalue: &str) -> Result<Self, KeyNameInvalidError> {
self.key.set_meta(metaname, metavalue)?;
Ok(self)
}
pub fn build(self) -> T {
self.key
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::{BinaryKey, ReadableKey, StringKey};
#[test]
fn can_build_string_key() -> Result<(), KeyNameInvalidError> {
let name = "user:/test/newkey";
let val = "key_value";
let key: StringKey = KeyBuilder::new(name)?.value(val).build();
assert_eq!(key.name(), name);
assert_eq!(key.value(), val);
Ok(())
}
#[test]
fn can_build_binary_key() -> Result<(), KeyNameInvalidError> {
let name = "user:/test/binarykey";
let overwrite = "overwrite me";
let val = "😎";
let key: BinaryKey = KeyBuilder::new(name)?
.value(overwrite.as_bytes())
.value(val.as_bytes())
.build();
assert_eq!(key.name(), name);
assert_eq!(key.value(), val.to_owned().into_bytes());
Ok(())
}
#[test]
fn can_build_key_with_meta() -> Result<(), KeyNameInvalidError> {
let name = "user:/test/metatest";
let key: StringKey = KeyBuilder::new(name)?
.meta("metaname", "metavalue")?
.meta("OWNER", "me")?
.build();
assert_eq!(key.meta("OWNER").unwrap().value(), "me");
assert_eq!(key.meta("metaname").unwrap().value(), "metavalue");
Ok(())
}
}