use crate::AsValidateStr;
use std::{net::IpAddr, str::FromStr};
#[derive(Debug, Clone)]
pub struct Ip;
impl Ip {
pub fn validate<'a, T>(&self, val: &'a T) -> bool
where
T: AsValidateStr<'a>,
{
if let Some(val) = val.as_validate_str().as_ref() {
IpAddr::from_str(val).is_ok()
} else {
true
}
}
}
#[cfg(feature = "proc")]
impl quote::ToTokens for Ip {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
use quote::quote;
tokens.extend(quote! {
(::prove::ip::Ip)
});
}
}
#[derive(Debug, Clone)]
pub struct IpV4;
impl IpV4 {
pub fn validate<'a, T>(&self, val: &'a T) -> bool
where
T: AsValidateStr<'a>,
{
if let Some(val) = val.as_validate_str().as_ref() {
match IpAddr::from_str(val) {
Ok(i) => match i {
IpAddr::V4(_) => true,
_ => false,
},
_ => false,
}
} else {
true
}
}
}
#[cfg(feature = "proc")]
impl quote::ToTokens for IpV4 {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
use quote::quote;
tokens.extend(quote! {
(::prove::ip::IpV4)
});
}
}
#[derive(Debug, Clone)]
pub struct IpV6;
impl IpV6 {
pub fn validate<'a, T>(&self, val: &'a T) -> bool
where
T: AsValidateStr<'a>,
{
if let Some(val) = val.as_validate_str().as_ref() {
match IpAddr::from_str(val) {
Ok(i) => match i {
IpAddr::V6(_) => true,
_ => false,
},
_ => false,
}
} else {
true
}
}
}
#[cfg(feature = "proc")]
impl quote::ToTokens for IpV6 {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
use quote::quote;
tokens.extend(quote! {
(::prove::ip::IpV6)
});
}
}