os-query-builder-rs 0.2.1

Open Search query builder
Documentation
use serde::{
    Serialize,
    Serializer,
    ser::SerializeMap
};
use crate::misc::{
    fuzziness::Fuzziness,
    rewrite::Rewrite
};

#[derive(Debug, Default, Clone)]
pub struct Fuzzy {
    field: Option<String>,
    value: FuzzyValue

}

#[derive(Debug, Default, Clone, Serialize)]
struct FuzzyValue {
    value: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    boost: Option<f64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    fuzziness: Option<Fuzziness>,
    #[serde(skip_serializing_if = "Option::is_none")]
    max_expansions: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    prefix_length: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    rewrite: Option<Rewrite>,
    #[serde(skip_serializing_if = "Option::is_none")]
    transpositions: Option<bool>
}

impl Serialize for Fuzzy {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
        where
            S: Serializer,
    {
        let mut state = serializer.serialize_map(Some(1))?;
        state.serialize_entry(&self.field.as_deref().unwrap_or_default(), &self.value)?;
        state.end()
    }
}

impl Fuzzy {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn field<T: Into<String> + Serialize>(self, field: T ) -> Self {
        Self {
            field: Some(field.into()),
            ..self
        }
    }

    pub fn value<T: Into<String> + Serialize>(self, value: T ) -> Self {
        Self {
            value: FuzzyValue {
                value: value.into(),
                ..self.value
            },
            ..self
        }
    }

    pub fn boost<T: Into<f64> + Serialize>(self, boost: T ) -> Self {
        Self {
            value: FuzzyValue {
                boost: Some(boost.into()),
                ..self.value
            },
            ..self
        }
    }

    pub fn fuzziness<T: Into<Fuzziness> + Serialize>(self, fuzziness: T ) -> Self {
        Self {
            value: FuzzyValue {
                fuzziness: Some(fuzziness.into()),
                ..self.value
            },
            ..self
        }
    }

    pub fn max_expansions<T: Into<u64> + Serialize>(self, max_expansions: T ) -> Self {
        Self {
            value: FuzzyValue {
                max_expansions: Some(max_expansions.into()),
                ..self.value
            },
            ..self
        }
    }

    pub fn prefix_length<T: Into<u64> + Serialize>(self, prefix_length: T ) -> Self {
        Self {
            value: FuzzyValue {
                prefix_length: Some(prefix_length.into()),
                ..self.value
            },
            ..self
        }
    }

    pub fn rewrite<T: Into<Rewrite> + Serialize>(self, rewrite: T ) -> Self {
        Self {
            value: FuzzyValue {
                rewrite: Some(rewrite.into()),
                ..self.value
            },
            ..self
        }
    }

    pub fn transpositions<T: Into<bool> + Serialize>(self, transpositions: T ) -> Self {
        Self {
            value: FuzzyValue {
                transpositions: Some(transpositions.into()),
                ..self.value
            },
            ..self
        }
    }
}