use std::net::Ipv4Addr;
pub trait IpFieldType<TMapping> {}
pub trait IpMapping
where
Self: Default,
{
fn boost() -> Option<f32> {
None
}
fn doc_values() -> Option<bool> {
None
}
fn index() -> Option<bool> {
None
}
fn null_value() -> Option<Ipv4Addr> {
None
}
fn store() -> Option<bool> {
None
}
}
#[derive(PartialEq, Debug, Default, Clone, Copy)]
pub struct DefaultIpMapping;
impl IpMapping for DefaultIpMapping {}
mod private {
use serde::{Serialize, Serializer};
use serde::ser::SerializeStruct;
use private::field::{DocumentField, FieldMapping, FieldType};
use super::{IpFieldType, IpMapping};
#[derive(Default)]
pub struct IpPivot;
impl<TField, TMapping> FieldType<TMapping, IpPivot> for TField
where
TField: IpFieldType<TMapping> + Serialize,
TMapping: IpMapping,
{
}
impl<TMapping> FieldMapping<IpPivot> for TMapping
where
TMapping: IpMapping,
{
type DocumentField = DocumentField<TMapping, IpPivot>;
fn data_type() -> &'static str {
"ip"
}
}
impl<TMapping> Serialize for DocumentField<TMapping, IpPivot>
where
TMapping: FieldMapping<IpPivot> + IpMapping,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = try!(serializer.serialize_struct("mapping", 6));
try!(state.serialize_field("type", TMapping::data_type()));
ser_field!(state, "boost", TMapping::boost());
ser_field!(state, "doc_values", TMapping::doc_values());
ser_field!(state, "index", TMapping::index());
ser_field!(state, "store", TMapping::store());
ser_field!(state, "null_value", TMapping::null_value());
state.end()
}
}
}
#[cfg(test)]
mod tests {
use serde_json;
use std::net::Ipv4Addr;
use prelude::*;
use private::field::{DocumentField, FieldType};
#[derive(Default, Clone)]
pub struct MyIpMapping;
impl IpMapping for MyIpMapping {
fn boost() -> Option<f32> {
Some(1.01)
}
fn index() -> Option<bool> {
Some(false)
}
fn doc_values() -> Option<bool> {
Some(true)
}
fn store() -> Option<bool> {
Some(true)
}
fn null_value() -> Option<Ipv4Addr> {
Some(Ipv4Addr::new(127, 0, 0, 1))
}
}
#[test]
fn ipv4addr_has_default_mapping() {
assert_eq!(DefaultIpMapping, Ipv4Addr::field_mapping());
}
#[test]
fn serialise_mapping_default() {
let ser = serde_json::to_string(&DocumentField::from(DefaultIpMapping)).unwrap();
let expected = json_str!({
"type": "ip"
});
assert_eq!(expected, ser);
}
#[test]
fn serialise_mapping_custom() {
let ser = serde_json::to_string(&DocumentField::from(MyIpMapping)).unwrap();
let expected = json_str!({
"type": "ip",
"boost": 1.01,
"doc_values": true,
"index": false,
"store": true,
"null_value": "127.0.0.1"
});
assert_eq!(expected, ser);
}
}