use std::borrow::Cow;
use metrique_core::{CloseValue, InflectableEntry, NameStyle};
use metrique_writer::{Entry, EntryWriter, Value};
use metrique_writer_core::entry::SampleGroupElement;
pub struct Flex<T> {
key: Cow<'static, str>,
value: Option<T>,
}
impl<T> Flex<T> {
pub fn new(key: impl Into<Cow<'static, str>>) -> Self {
Self {
key: key.into(),
value: None,
}
}
pub fn with_value(mut self, value: T) -> Self {
self.value = Some(value);
self
}
pub fn with_optional_value(mut self, value: Option<T>) -> Self {
self.value = value;
self
}
pub fn key(&self) -> &str {
&self.key
}
pub fn value(&self) -> Option<&T> {
self.value.as_ref()
}
pub fn set_value(&mut self, value: T) {
self.value = Some(value);
}
pub fn clear_value(&mut self) {
self.value = None;
}
}
impl<T: Default> Flex<T> {
pub fn with_default_value(mut self) -> Self {
self.value = Some(T::default());
self
}
}
pub struct FlexEntry<T> {
key: Cow<'static, str>,
value: Option<T>,
}
impl<T: Value> Entry for FlexEntry<T> {
fn write<'a>(&'a self, writer: &mut impl EntryWriter<'a>) {
writer.value(Cow::Borrowed(self.key.as_ref()), &self.value);
}
}
impl<T: Value, NS: NameStyle> InflectableEntry<NS> for FlexEntry<T> {
fn write<'a>(&'a self, writer: &mut impl EntryWriter<'a>) {
writer.value(Cow::Borrowed(self.key.as_ref()), &self.value);
}
fn sample_group(&self) -> impl Iterator<Item = SampleGroupElement> {
vec![].into_iter()
}
}
impl<T: CloseValue> CloseValue for Flex<T> {
type Closed = FlexEntry<T::Closed>;
fn close(self) -> Self::Closed {
FlexEntry {
key: self.key,
value: self.value.close(),
}
}
}