Add ToSql / FromSql for IpInet and IpCidr from cidr crate
This commit is contained in:
@@ -14,6 +14,7 @@ categories = ["database"]
|
||||
derive = ["postgres-derive"]
|
||||
array-impls = ["array-init"]
|
||||
with-bit-vec-0_6 = ["bit-vec-06"]
|
||||
with-cidr-0_2 = ["cidr-02"]
|
||||
with-chrono-0_4 = ["chrono-04"]
|
||||
with-eui48-0_4 = ["eui48-04"]
|
||||
with-eui48-1 = ["eui48-1"]
|
||||
@@ -32,6 +33,7 @@ postgres-derive = { version = "0.4.0", optional = true, path = "../postgres-deri
|
||||
|
||||
array-init = { version = "2", optional = true }
|
||||
bit-vec-06 = { version = "0.6", package = "bit-vec", optional = true }
|
||||
cidr-02 = { version = "0.2", package = "cidr", optional = true }
|
||||
chrono-04 = { version = "0.4.16", package = "chrono", default-features = false, features = ["clock"], optional = true }
|
||||
eui48-04 = { version = "0.4", package = "eui48", optional = true }
|
||||
eui48-1 = { version = "1.0", package = "eui48", optional = true }
|
||||
|
||||
44
postgres-types/src/cidr_02.rs
Normal file
44
postgres-types/src/cidr_02.rs
Normal file
@@ -0,0 +1,44 @@
|
||||
use bytes::BytesMut;
|
||||
use cidr_02::{IpCidr, IpInet};
|
||||
use postgres_protocol::types;
|
||||
use std::error::Error;
|
||||
|
||||
use crate::{FromSql, IsNull, ToSql, Type};
|
||||
|
||||
impl<'a> FromSql<'a> for IpCidr {
|
||||
fn from_sql(_: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
|
||||
let inet = types::inet_from_sql(raw)?;
|
||||
Ok(IpCidr::new(inet.addr(), inet.netmask()).expect("postgres cidr type has zeroed host portion"))
|
||||
}
|
||||
|
||||
accepts!(CIDR);
|
||||
}
|
||||
|
||||
impl ToSql for IpCidr {
|
||||
fn to_sql(&self, _: &Type, w: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
|
||||
types::inet_to_sql(self.first_address(), self.network_length(), w);
|
||||
Ok(IsNull::No)
|
||||
}
|
||||
|
||||
accepts!(CIDR);
|
||||
to_sql_checked!();
|
||||
}
|
||||
|
||||
impl<'a> FromSql<'a> for IpInet {
|
||||
fn from_sql(_: &Type, raw: &[u8]) -> Result<Self, Box<dyn Error + Sync + Send>> {
|
||||
let inet = types::inet_from_sql(raw)?;
|
||||
Ok(IpInet::new(inet.addr(), inet.netmask()).expect("postgres enforces maximum length of netmask"))
|
||||
}
|
||||
|
||||
accepts!(INET);
|
||||
}
|
||||
|
||||
impl ToSql for IpInet {
|
||||
fn to_sql(&self, _: &Type, w: &mut BytesMut) -> Result<IsNull, Box<dyn Error + Sync + Send>> {
|
||||
types::inet_to_sql(self.address(), self.network_length(), w);
|
||||
Ok(IsNull::No)
|
||||
}
|
||||
|
||||
accepts!(INET);
|
||||
to_sql_checked!();
|
||||
}
|
||||
@@ -210,6 +210,8 @@ where
|
||||
|
||||
#[cfg(feature = "with-bit-vec-0_6")]
|
||||
mod bit_vec_06;
|
||||
#[cfg(feature = "with-cidr-0_2")]
|
||||
mod cidr_02;
|
||||
#[cfg(feature = "with-chrono-0_4")]
|
||||
mod chrono_04;
|
||||
#[cfg(feature = "with-eui48-0_4")]
|
||||
|
||||
Reference in New Issue
Block a user