use std::net::{IpAddr, Ipv6Addr};
use std::ops::BitOr;
use serde::{Deserialize, Serialize};
use super::flags::{FastFlag, IndexedFlag, SchemaFlagList, StoredFlag};
pub trait IntoIpv6Addr {
fn into_ipv6_addr(self) -> Ipv6Addr;
}
impl IntoIpv6Addr for IpAddr {
fn into_ipv6_addr(self) -> Ipv6Addr {
match self {
IpAddr::V4(addr) => addr.to_ipv6_mapped(),
IpAddr::V6(addr) => addr,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct IpAddrOptions {
fast: bool,
stored: bool,
indexed: bool,
fieldnorms: bool,
}
impl IpAddrOptions {
#[inline]
pub fn is_fast(&self) -> bool {
self.fast
}
#[inline]
pub fn is_stored(&self) -> bool {
self.stored
}
#[inline]
pub fn is_indexed(&self) -> bool {
self.indexed
}
#[inline]
pub fn fieldnorms(&self) -> bool {
self.fieldnorms
}
#[must_use]
pub fn set_fieldnorms(mut self) -> Self {
self.fieldnorms = true;
self
}
#[must_use]
pub fn set_stored(mut self) -> Self {
self.stored = true;
self
}
#[must_use]
pub fn set_indexed(mut self) -> Self {
self.indexed = true;
self
}
#[must_use]
pub fn set_fast(mut self) -> Self {
self.fast = true;
self
}
}
impl From<()> for IpAddrOptions {
fn from(_: ()) -> IpAddrOptions {
IpAddrOptions::default()
}
}
impl From<FastFlag> for IpAddrOptions {
fn from(_: FastFlag) -> Self {
IpAddrOptions {
fieldnorms: false,
indexed: false,
stored: false,
fast: true,
}
}
}
impl From<StoredFlag> for IpAddrOptions {
fn from(_: StoredFlag) -> Self {
IpAddrOptions {
fieldnorms: false,
indexed: false,
stored: true,
fast: false,
}
}
}
impl From<IndexedFlag> for IpAddrOptions {
fn from(_: IndexedFlag) -> Self {
IpAddrOptions {
fieldnorms: true,
indexed: true,
stored: false,
fast: false,
}
}
}
impl<T: Into<IpAddrOptions>> BitOr<T> for IpAddrOptions {
type Output = IpAddrOptions;
fn bitor(self, other: T) -> IpAddrOptions {
let other = other.into();
IpAddrOptions {
fieldnorms: self.fieldnorms | other.fieldnorms,
indexed: self.indexed | other.indexed,
stored: self.stored | other.stored,
fast: self.fast | other.fast,
}
}
}
impl<Head, Tail> From<SchemaFlagList<Head, Tail>> for IpAddrOptions
where
Head: Clone,
Tail: Clone,
Self: BitOr<Output = Self> + From<Head> + From<Tail>,
{
fn from(head_tail: SchemaFlagList<Head, Tail>) -> Self {
Self::from(head_tail.head) | Self::from(head_tail.tail)
}
}