use std::cmp::Ordering;
use std::fmt;
use std::sync::Arc;
use crate::temporal::TemporalValue;
use crate::value::Value;
use super::shared::{Charset, DecodeKind, Format, WhitelistSelector};
type DecodeDecoderFn = dyn Fn(&str, Charset, DecodeKind) -> String + Send + Sync;
type EncodeTokenEncoderFn = dyn Fn(EncodeToken<'_>, Charset, Format) -> String + Send + Sync;
type FunctionFilterFn = dyn Fn(&str, &Value) -> FilterResult + Send + Sync;
type SorterFn = dyn Fn(&str, &str) -> Ordering + Send + Sync;
type TemporalSerializerFn = dyn Fn(&TemporalValue) -> Option<String> + Send + Sync;
#[derive(Clone)]
pub struct DecodeDecoder(Arc<DecodeDecoderFn>);
impl DecodeDecoder {
pub fn new<F>(decoder: F) -> Self
where
F: Fn(&str, Charset, DecodeKind) -> String + Send + Sync + 'static,
{
Self(Arc::new(decoder))
}
pub fn decode(&self, input: &str, charset: Charset, kind: DecodeKind) -> String {
(self.0)(input, charset, kind)
}
}
impl fmt::Debug for DecodeDecoder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("DecodeDecoder(<closure>)")
}
}
#[derive(Clone, Copy, Debug)]
pub enum EncodeToken<'a> {
Key(&'a str),
Value(&'a Value),
TextValue(&'a str),
}
#[derive(Clone)]
pub struct EncodeTokenEncoder(Arc<EncodeTokenEncoderFn>);
impl EncodeTokenEncoder {
pub fn new<F>(encoder: F) -> Self
where
F: Fn(EncodeToken<'_>, Charset, Format) -> String + Send + Sync + 'static,
{
Self(Arc::new(encoder))
}
pub fn encode(&self, token: EncodeToken<'_>, charset: Charset, format: Format) -> String {
(self.0)(token, charset, format)
}
}
impl fmt::Debug for EncodeTokenEncoder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("EncodeTokenEncoder(<closure>)")
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum FilterResult {
Keep,
Omit,
Replace(Value),
}
#[derive(Clone)]
pub struct FunctionFilter(Arc<FunctionFilterFn>);
impl FunctionFilter {
pub fn new<F>(filter: F) -> Self
where
F: Fn(&str, &Value) -> FilterResult + Send + Sync + 'static,
{
Self(Arc::new(filter))
}
pub fn apply(&self, prefix: &str, value: &Value) -> FilterResult {
(self.0)(prefix, value)
}
}
impl fmt::Debug for FunctionFilter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("FunctionFilter(<closure>)")
}
}
#[derive(Clone, Debug)]
pub enum EncodeFilter {
Whitelist(Vec<WhitelistSelector>),
Function(FunctionFilter),
}
#[derive(Clone)]
pub struct Sorter(Arc<SorterFn>);
impl Sorter {
pub fn new<F>(sorter: F) -> Self
where
F: Fn(&str, &str) -> Ordering + Send + Sync + 'static,
{
Self(Arc::new(sorter))
}
pub fn compare(&self, left: &str, right: &str) -> Ordering {
(self.0)(left, right)
}
}
impl fmt::Debug for Sorter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("Sorter(<closure>)")
}
}
#[derive(Clone)]
pub struct TemporalSerializer(Arc<TemporalSerializerFn>);
impl TemporalSerializer {
pub fn new<F>(serializer: F) -> Self
where
F: Fn(&TemporalValue) -> Option<String> + Send + Sync + 'static,
{
Self(Arc::new(serializer))
}
pub fn serialize(&self, value: &TemporalValue) -> Option<String> {
(self.0)(value)
}
}
impl fmt::Debug for TemporalSerializer {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("TemporalSerializer(<closure>)")
}
}
#[cfg(test)]
mod tests;