mirror of
https://github.com/NLnetLabs/domain.git
synced 2026-09-28 20:54:55 +02:00
Introduce OctetsFrom and OctetsInto.
This commit is contained in:
+16
-2
@@ -33,8 +33,8 @@ use core::{cmp, fmt, hash, ops, str};
|
||||
};
|
||||
use super::cmp::CanonicalOrd;
|
||||
use super::octets::{
|
||||
Compose, EmptyBuilder, FromBuilder, IntoBuilder, OctetsBuilder, OctetsRef,
|
||||
Parse, ParseError, Parser, ShortBuf
|
||||
Compose, EmptyBuilder, FromBuilder, IntoBuilder, OctetsBuilder, OctetsFrom,
|
||||
OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
};
|
||||
use super::str::{BadSymbol, Symbol, SymbolError};
|
||||
|
||||
@@ -163,6 +163,20 @@ impl CharStr<[u8]> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<CharStr<SrcOctets>> for CharStr<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: CharStr<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.0).map(|octets| {
|
||||
unsafe {
|
||||
Self::from_octets_unchecked(octets)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- FromStr
|
||||
|
||||
impl<Octets> str::FromStr for CharStr<Octets>
|
||||
|
||||
+15
-1
@@ -17,7 +17,7 @@ use super::iana::{Class, Rcode, Rtype};
|
||||
use super::message_builder::{AdditionalBuilder, AnswerBuilder};
|
||||
use super::name::ParsedDname;
|
||||
use super::octets::{
|
||||
OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
};
|
||||
use super::opt::{Opt, OptRecord};
|
||||
use super::question::Question;
|
||||
@@ -597,6 +597,20 @@ impl<Octets: AsRef<[u8]>> AsRef<[u8]> for Message<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Message<SrcOctets>> for Message<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Message<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.octets).map(|octets| {
|
||||
unsafe {
|
||||
Self::from_octets_unchecked(octets)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- IntoIterator
|
||||
|
||||
impl<'a, Octets> IntoIterator for &'a Message<Octets>
|
||||
|
||||
+15
-1
@@ -12,7 +12,7 @@ use core::str::FromStr;
|
||||
use super::super::cmp::CanonicalOrd;
|
||||
use super::super::octets::{
|
||||
Compose, EmptyBuilder, FormError, FromBuilder, OctetsBuilder, OctetsExt,
|
||||
OctetsRef, Parse, Parser, ParseError, ShortBuf
|
||||
OctetsFrom, OctetsRef, Parse, Parser, ParseError, ShortBuf
|
||||
};
|
||||
use super::builder::{DnameBuilder, FromStrError};
|
||||
use super::label::{Label, LabelTypeError, SplitLabelError};
|
||||
@@ -588,6 +588,20 @@ impl<Octets: AsRef<T> + ?Sized, T: ?Sized> AsRef<T> for Dname<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Dname<SrcOctets>> for Dname<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Dname<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.0).map(|octets| {
|
||||
unsafe {
|
||||
Self::from_octets_unchecked(octets)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- FromStr
|
||||
|
||||
impl<Octets> FromStr for Dname<Octets>
|
||||
|
||||
@@ -7,8 +7,8 @@ use core::cmp::Ordering;
|
||||
#[cfg(feature = "std")] use std::vec::Vec;
|
||||
#[cfg(feature = "bytes")] use bytes::Bytes;
|
||||
use super::super::octets::{
|
||||
Compose, IntoBuilder, OctetsBuilder, OctetsExt, OctetsRef, ParseError,
|
||||
ShortBuf
|
||||
Compose, IntoBuilder, OctetsBuilder, OctetsExt, OctetsFrom, OctetsRef,
|
||||
ParseError, ShortBuf
|
||||
};
|
||||
use super::builder::{DnameBuilder, PushError};
|
||||
use super::chain::{Chain, LongChainError};
|
||||
@@ -569,6 +569,21 @@ impl<Octets: AsRef<T> + ?Sized, T: ?Sized> AsRef<T> for RelativeDname<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets>
|
||||
OctetsFrom<RelativeDname<SrcOctets>> for RelativeDname<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: RelativeDname<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.0).map(|octets| {
|
||||
unsafe {
|
||||
Self::from_octets_unchecked(octets)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- ToLabelIter and ToRelativeDname
|
||||
|
||||
impl<'a, Octets> ToLabelIter<'a> for RelativeDname<Octets>
|
||||
|
||||
+80
-11
@@ -313,6 +313,86 @@ impl<'a, A: Array<Item = u8>> OctetsRef for &'a SmallVec<A> {
|
||||
}
|
||||
|
||||
|
||||
//------------ OctetsFrom ----------------------------------------------------
|
||||
|
||||
/// Convert a type from one octets type to another.
|
||||
///
|
||||
/// This trait allows creating a value of a type that is generic over an
|
||||
/// octets sequence from an identical value using a different type of octets
|
||||
/// sequence.
|
||||
///
|
||||
/// This is different from just `From` in that the conversion may fail if the
|
||||
/// source sequence is longer than the space available for the target type.
|
||||
pub trait OctetsFrom<Source>: Sized {
|
||||
/// Performs the conversion.
|
||||
fn octets_from(source: Source) -> Result<Self, ShortBuf>;
|
||||
}
|
||||
|
||||
|
||||
impl<'a, Source: AsRef<[u8]> + 'a> OctetsFrom<&'a Source> for &'a [u8] {
|
||||
fn octets_from(source: &'a Source) -> Result<Self, ShortBuf> {
|
||||
Ok(source.as_ref())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<Source> OctetsFrom<Source> for Vec<u8>
|
||||
where Self: From<Source> {
|
||||
fn octets_from(source: Source) -> Result<Self, ShortBuf> {
|
||||
Ok(From::from(source))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "bytes")]
|
||||
impl<Source> OctetsFrom<Source> for Bytes
|
||||
where Self: From<Source> {
|
||||
fn octets_from(source: Source) -> Result<Self, ShortBuf> {
|
||||
Ok(From::from(source))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "bytes")]
|
||||
impl<Source> OctetsFrom<Source> for BytesMut
|
||||
where Self: From<Source> {
|
||||
fn octets_from(source: Source) -> Result<Self, ShortBuf> {
|
||||
Ok(From::from(source))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(features = "smallvec")]
|
||||
impl<Source, A> OctetsFrom<Source> for SmallVec<A>
|
||||
where Source: AsRef<u8>, A: Array<Item = u8> {
|
||||
fn octets_from(source: Source) -> Result<Self, ShortBuf> {
|
||||
Ok(smallvec::ToSmallVec::to_smallvec(source.as_ref()))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------ OctetsInto ----------------------------------------------------
|
||||
|
||||
/// Convert a type from one octets type to another.
|
||||
///
|
||||
/// This trait allows trading in a value of a type that is generic over an
|
||||
/// octets sequence for an identical value using a different type of octets
|
||||
/// sequence.
|
||||
///
|
||||
/// This is different from just `Into` in that the conversion may fail if the
|
||||
/// source sequence is longer than the space available for the target type.
|
||||
///
|
||||
/// This trait has a blanket implementation for all pairs of types where
|
||||
/// `OctetsFrom` has been implemented.
|
||||
pub trait OctetsInto<Target> {
|
||||
/// Performs the conversion.
|
||||
fn octets_into(self) -> Result<Target, ShortBuf>;
|
||||
}
|
||||
|
||||
impl<Source, Target: OctetsFrom<Source>> OctetsInto<Target> for Source {
|
||||
fn octets_into(self) -> Result<Target, ShortBuf> {
|
||||
Target::octets_from(self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------ OctetsBuilder -------------------------------------------------
|
||||
|
||||
/// A buffer to construct an octet sequence.
|
||||
@@ -557,11 +637,6 @@ impl<A: Array<Item = u8>> EmptyBuilder for SmallVec<A> {
|
||||
/// An octets type that can be converted into an octets builder.
|
||||
pub trait IntoBuilder {
|
||||
/// The type of octets builder this octets type can be converted into.
|
||||
///
|
||||
/// If `Builder` implements [`IntoOctets`], the `Octets` associated
|
||||
/// type of that trait must be `Self`.
|
||||
///
|
||||
/// [`IntoOctets`]: trait.IntoOctets.html
|
||||
type Builder: OctetsBuilder;
|
||||
|
||||
/// Converts an octets value into an octets builder.
|
||||
@@ -620,12 +695,6 @@ impl<A: Array<Item = u8>> IntoBuilder for SmallVec<A> {
|
||||
//------------ FromBuilder ---------------------------------------------------
|
||||
|
||||
/// An octets type that can be created from an octets builder.
|
||||
///
|
||||
/// This trait is a mirror of [`IntoOctets`] and only exists because otherwise
|
||||
/// trait bounds become ridiculously complex. The implementations of the two
|
||||
/// traits must behave identically.
|
||||
///
|
||||
/// [`IntoOctets`]: trait.IntoOctets.html
|
||||
pub trait FromBuilder: AsRef<[u8]> + Sized {
|
||||
/// The type of builder this octets type can be created from.
|
||||
type Builder: OctetsBuilder<Octets = Self>;
|
||||
|
||||
+28
-1
@@ -47,7 +47,8 @@ use super::iana::{OptionCode, OptRcode, Rtype};
|
||||
use super::header::Header;
|
||||
use super::name::ToDname;
|
||||
use super::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
use super::rdata::RtypeRecordData;
|
||||
use super::record::Record;
|
||||
@@ -104,6 +105,16 @@ impl<Octets: AsRef<[u8]>> Opt<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Opt<SrcOctets>> for Opt<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Opt<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.octets).map(|octets| Opt { octets })
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Opt<Other>> for Opt<Octets>
|
||||
@@ -410,6 +421,22 @@ impl<Octets, N: ToDname> From<Record<N, Opt<Octets>>> for OptRecord<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<OptRecord<SrcOctets>> for OptRecord<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: OptRecord<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(OptRecord {
|
||||
udp_payload_size: source.udp_payload_size,
|
||||
ext_rcode: source.ext_rcode,
|
||||
version: source.version,
|
||||
flags: source.flags,
|
||||
data: Opt::octets_from(source.data)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- Deref and AsRef
|
||||
|
||||
impl<Octets> ops::Deref for OptRecord<Octets> {
|
||||
|
||||
+16
-2
@@ -10,7 +10,8 @@ use super::cmp::CanonicalOrd;
|
||||
use super::iana::{Class, Rtype};
|
||||
use super::name::{ParsedDname, ToDname};
|
||||
use super::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, Parser, ParseError, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, Parser, ParseError,
|
||||
ShortBuf
|
||||
};
|
||||
|
||||
|
||||
@@ -42,7 +43,7 @@ pub struct Question<N> {
|
||||
|
||||
/// # Creation and Conversion
|
||||
///
|
||||
impl<N: ToDname> Question<N> {
|
||||
impl<N> Question<N> {
|
||||
/// Creates a new question from its three componets.
|
||||
pub fn new(qname: N, qtype: Rtype, qclass: Class) -> Self {
|
||||
Question { qname, qtype, qclass }
|
||||
@@ -95,6 +96,19 @@ impl<N: ToDname> From<(N, Rtype)> for Question<N> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<Question<SrcName>> for Question<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: Question<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(Question::new(
|
||||
Name::octets_from(source.qname)?,
|
||||
source.qtype, source.qclass
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<Question<NN>> for Question<N>
|
||||
|
||||
+18
-1
@@ -31,7 +31,8 @@ use core::cmp::Ordering;
|
||||
use super::cmp::CanonicalOrd;
|
||||
use super::iana::Rtype;
|
||||
use super::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
|
||||
|
||||
@@ -220,6 +221,22 @@ impl UnknownRecordData<Bytes> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets>
|
||||
OctetsFrom<UnknownRecordData<SrcOctets>> for UnknownRecordData<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(
|
||||
source: UnknownRecordData<SrcOctets>
|
||||
) -> Result<Self, ShortBuf> {
|
||||
Ok(UnknownRecordData {
|
||||
rtype: source.rtype,
|
||||
data: Octets::octets_from(source.data)?
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<UnknownRecordData<Other>>
|
||||
|
||||
+23
-1
@@ -21,7 +21,8 @@ use super::cmp::CanonicalOrd;
|
||||
use super::iana::{Class, Rtype};
|
||||
use super::name::{ParsedDname, ToDname};
|
||||
use super::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, Parser, ParseError, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, Parser, ParseError,
|
||||
ShortBuf
|
||||
};
|
||||
use super::rdata::{RecordData, ParseRecordData};
|
||||
|
||||
@@ -182,6 +183,27 @@ impl<N, D> From<(N, u32, D)> for Record<N, D> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
//
|
||||
// XXX We don’t have blanket FromOctets for a type T into itself, so this may
|
||||
// not always work as expected. Not sure what we can do about it?
|
||||
|
||||
impl<Name, Data, SrcName, SrcData>
|
||||
OctetsFrom<Record<SrcName, SrcData>> for Record<Name, Data>
|
||||
where Name: OctetsFrom<SrcName>, Data: OctetsFrom<SrcData> {
|
||||
fn octets_from(
|
||||
source: Record<SrcName, SrcData>
|
||||
) -> Result<Self, ShortBuf> {
|
||||
Ok(Record {
|
||||
owner: Name::octets_from(source.owner)?,
|
||||
class: source.class,
|
||||
ttl: source.ttl,
|
||||
data: Data::octets_from(source.data)?
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN, D, DD> PartialEq<Record<NN, DD>> for Record<N, D>
|
||||
|
||||
@@ -60,6 +60,39 @@ macro_rules! rdata_types {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets, Name, SrcName>
|
||||
$crate::base::octets::OctetsFrom<
|
||||
MasterRecordData<SrcOctets, SrcName>
|
||||
>
|
||||
for MasterRecordData<Octets, Name>
|
||||
where
|
||||
Octets: $crate::base::octets::OctetsFrom<SrcOctets>,
|
||||
Name: $crate::base::octets::OctetsFrom<SrcName>
|
||||
{
|
||||
fn octets_from(
|
||||
source: MasterRecordData<SrcOctets, SrcName>
|
||||
) -> Result<Self, $crate::base::octets::ShortBuf> {
|
||||
match source {
|
||||
$( $( $(
|
||||
MasterRecordData::$mtype(inner) => {
|
||||
$mtype::octets_from(inner).map(
|
||||
MasterRecordData::$mtype
|
||||
)
|
||||
}
|
||||
)* )* )*
|
||||
MasterRecordData::Other(inner) => {
|
||||
$crate::base::rdata::
|
||||
UnknownRecordData::octets_from(inner).map(
|
||||
MasterRecordData::Other
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- From
|
||||
|
||||
$( $( $(
|
||||
@@ -449,6 +482,51 @@ macro_rules! rdata_types {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets, Name, SrcName>
|
||||
$crate::base::octets::OctetsFrom<
|
||||
AllRecordData<SrcOctets, SrcName>
|
||||
>
|
||||
for AllRecordData<Octets, Name>
|
||||
where
|
||||
Octets: $crate::base::octets::OctetsFrom<SrcOctets>,
|
||||
Name: $crate::base::octets::OctetsFrom<SrcName>
|
||||
{
|
||||
fn octets_from(
|
||||
source: AllRecordData<SrcOctets, SrcName>
|
||||
) -> Result<Self, $crate::base::octets::ShortBuf> {
|
||||
match source {
|
||||
$( $( $(
|
||||
AllRecordData::$mtype(inner) => {
|
||||
$mtype::octets_from(inner).map(
|
||||
AllRecordData::$mtype
|
||||
)
|
||||
}
|
||||
)* )* )*
|
||||
$( $( $(
|
||||
AllRecordData::$ptype(inner) => {
|
||||
$ptype::octets_from(inner).map(
|
||||
AllRecordData::$ptype
|
||||
)
|
||||
}
|
||||
)* )* )*
|
||||
AllRecordData::Opt(inner) => {
|
||||
$crate::base::opt::Opt::octets_from(inner).map(
|
||||
AllRecordData::Opt
|
||||
)
|
||||
}
|
||||
AllRecordData::Other(inner) => {
|
||||
$crate::base::rdata::
|
||||
UnknownRecordData::octets_from(inner).map(
|
||||
AllRecordData::Other
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<O, OO, N, NN> PartialEq<AllRecordData<OO, NN>>
|
||||
@@ -745,6 +823,18 @@ macro_rules! dname_type {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<$target<SrcName>> for $target<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: $target<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Name::octets_from(source.$field).map(|name| {
|
||||
Self::new(name)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<$target<NN>> for $target<N>
|
||||
|
||||
+90
-2
@@ -16,8 +16,8 @@ use crate::base::str::Symbol;
|
||||
use crate::base::name::{ParsedDname, ToDname};
|
||||
use crate::base::net::Ipv4Addr;
|
||||
use crate::base::octets::{
|
||||
Compose, EmptyBuilder, FromBuilder, OctetsBuilder, OctetsRef, Parse,
|
||||
ParseError, Parser, ShortBuf
|
||||
Compose, EmptyBuilder, FromBuilder, OctetsBuilder, OctetsFrom, OctetsRef,
|
||||
Parse, ParseError, Parser, ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
use crate::base::serial::Serial;
|
||||
@@ -55,6 +55,15 @@ impl A {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl OctetsFrom<A> for A {
|
||||
fn octets_from(source: A) -> Result<Self, ShortBuf> {
|
||||
Ok(source)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- From and FromStr
|
||||
|
||||
impl From<Ipv4Addr> for A {
|
||||
@@ -211,6 +220,19 @@ impl<Octets> Hinfo<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Hinfo<SrcOctets>> for Hinfo<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Hinfo<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Hinfo::new(
|
||||
CharStr::octets_from(source.cpu)?,
|
||||
CharStr::octets_from(source.os)?
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Hinfo<Other>> for Hinfo<Octets>
|
||||
@@ -434,6 +456,19 @@ impl<N> Minfo<N> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<Minfo<SrcName>> for Minfo<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: Minfo<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(Minfo::new(
|
||||
Name::octets_from(source.rmailbx)?,
|
||||
Name::octets_from(source.emailbx)?
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<Minfo<NN>> for Minfo<N>
|
||||
@@ -595,6 +630,19 @@ impl<N> Mx<N> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<Mx<SrcName>> for Mx<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: Mx<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(Mx::new(
|
||||
source.preference,
|
||||
Name::octets_from(source.exchange)?
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<Mx<NN>> for Mx<N>
|
||||
@@ -759,6 +807,18 @@ impl<Octets> From<Octets> for Null<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Null<SrcOctets>> for Null<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Null<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.data).map(|octets| {
|
||||
Self::new(octets)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Null<Other>> for Null<Octets>
|
||||
@@ -957,6 +1017,24 @@ impl<N> Soa<N> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<Soa<SrcName>> for Soa<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: Soa<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(Soa::new(
|
||||
Name::octets_from(source.mname)?,
|
||||
Name::octets_from(source.rname)?,
|
||||
source.serial,
|
||||
source.refresh,
|
||||
source.retry,
|
||||
source.expire,
|
||||
source.minimum
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<Soa<NN>> for Soa<N>
|
||||
@@ -1223,6 +1301,16 @@ impl<Octets: AsRef<[u8]>> Txt<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Txt<SrcOctets>> for Txt<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Txt<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.0).map(Self)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- IntoIterator
|
||||
|
||||
impl<'a, Octets: AsRef<[u8]>> IntoIterator for &'a Txt<Octets> {
|
||||
|
||||
+14
-1
@@ -10,7 +10,7 @@ use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::Rtype;
|
||||
use crate::base::name::{ParsedDname, ToDname};
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, Parser, ParseError,
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, Parser, ParseError,
|
||||
ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
@@ -58,6 +58,19 @@ impl<N> Srv<N> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<Srv<SrcName>> for Srv<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: Srv<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(Srv::new(
|
||||
source.priority, source.weight, source.port,
|
||||
Name::octets_from(source.target)?
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN> PartialEq<Srv<NN>> for Srv<N>
|
||||
|
||||
+22
-1
@@ -11,7 +11,7 @@ use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::{Rtype, TsigRcode};
|
||||
use crate::base::name::{ParsedDname, ToDname};
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser,
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
@@ -165,6 +165,27 @@ impl<O, N> Tsig<O, N> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets, Name, SrcName>
|
||||
OctetsFrom<Tsig<SrcOctets, SrcName>> for Tsig<Octets, Name>
|
||||
where Octets: OctetsFrom<SrcOctets>, Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(
|
||||
source: Tsig<SrcOctets, SrcName>
|
||||
) -> Result<Self, ShortBuf> {
|
||||
Ok(Tsig::new(
|
||||
Name::octets_from(source.algorithm)?,
|
||||
source.time_signed,
|
||||
source.fudge,
|
||||
Octets::octets_from(source.mac)?,
|
||||
source.original_id,
|
||||
source.error,
|
||||
Octets::octets_from(source.other)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<O, OO, N, NN> PartialEq<Tsig<OO, NN>> for Tsig<O, N>
|
||||
|
||||
+10
-1
@@ -10,7 +10,7 @@ use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::Rtype;
|
||||
use crate::base::net::Ipv6Addr;
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, Parse, ParseError, Parser, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, Parse, ParseError, Parser, ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
#[cfg(feature="master")] use crate::master::scan::{
|
||||
@@ -59,6 +59,15 @@ impl core::str::FromStr for Aaaa {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl OctetsFrom<Aaaa> for Aaaa {
|
||||
fn octets_from(source: Aaaa) -> Result<Self, ShortBuf> {
|
||||
Ok(source)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- CanonicalOrd
|
||||
|
||||
impl CanonicalOrd for Aaaa {
|
||||
|
||||
+90
-2
@@ -13,8 +13,8 @@ use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::{DigestAlg, Rtype, SecAlg};
|
||||
use crate::base::name::{ParsedDname, ToDname};
|
||||
use crate::base::octets::{
|
||||
Compose, EmptyBuilder, FormError, FromBuilder, OctetsBuilder, OctetsRef,
|
||||
Parse, ParseError, Parser, ShortBuf
|
||||
Compose, EmptyBuilder, FormError, FromBuilder, OctetsBuilder, OctetsFrom,
|
||||
OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
};
|
||||
use crate::base::rdata::{RtypeRecordData};
|
||||
use crate::base::serial::Serial;
|
||||
@@ -157,6 +157,19 @@ impl<Octets> Dnskey<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Dnskey<SrcOctets>> for Dnskey<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Dnskey<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Dnskey::new(
|
||||
source.flags, source.protocol, source.algorithm,
|
||||
Octets::octets_from(source.public_key)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Dnskey<Other>> for Dnskey<Octets>
|
||||
@@ -355,6 +368,22 @@ impl<Name> ProtoRrsig<Name> {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Name, SrcName> OctetsFrom<ProtoRrsig<SrcName>> for ProtoRrsig<Name>
|
||||
where Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(source: ProtoRrsig<SrcName>) -> Result<Self, ShortBuf> {
|
||||
Ok(ProtoRrsig::new(
|
||||
source.type_covered, source.algorithm, source.labels,
|
||||
source.original_ttl, source.expiration, source.inception,
|
||||
source.key_tag,
|
||||
Name::octets_from(source.signer_name)?
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- Compose
|
||||
|
||||
impl<Name: Compose> Compose for ProtoRrsig<Name> {
|
||||
@@ -476,6 +505,25 @@ impl<Octets, Name> Rrsig<Octets, Name> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets, Name, SrcName>
|
||||
OctetsFrom<Rrsig<SrcOctets, SrcName>> for Rrsig<Octets, Name>
|
||||
where Octets: OctetsFrom<SrcOctets>, Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(
|
||||
source: Rrsig<SrcOctets, SrcName>
|
||||
) -> Result<Self, ShortBuf> {
|
||||
Ok(Rrsig::new(
|
||||
source.type_covered, source.algorithm, source.labels,
|
||||
source.original_ttl, source.expiration, source.inception,
|
||||
source.key_tag,
|
||||
Name::octets_from(source.signer_name)?,
|
||||
Octets::octets_from(source.signature)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<N, NN, O, OO> PartialEq<Rrsig<OO, NN>> for Rrsig<O, N>
|
||||
@@ -759,6 +807,22 @@ impl<Octets, Name> Nsec<Octets, Name> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets, Name, SrcName>
|
||||
OctetsFrom<Nsec<SrcOctets, SrcName>> for Nsec<Octets, Name>
|
||||
where Octets: OctetsFrom<SrcOctets>, Name: OctetsFrom<SrcName> {
|
||||
fn octets_from(
|
||||
source: Nsec<SrcOctets, SrcName>
|
||||
) -> Result<Self, ShortBuf> {
|
||||
Ok(Nsec::new(
|
||||
Name::octets_from(source.next_name)?,
|
||||
RtypeBitmap::octets_from(source.types)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<O, OO, N, NN> PartialEq<Nsec<OO, NN>> for Nsec<O, N>
|
||||
@@ -943,6 +1007,19 @@ impl<Octets> Ds<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Ds<SrcOctets>> for Ds<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Ds<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Ds::new(
|
||||
source.key_tag, source.algorithm, source.digest_type,
|
||||
Octets::octets_from(source.digest)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Ds<Other>> for Ds<Octets>
|
||||
@@ -1188,6 +1265,17 @@ impl<T, Octets: AsRef<T>> AsRef<T> for RtypeBitmap<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets>
|
||||
OctetsFrom<RtypeBitmap<SrcOctets>> for RtypeBitmap<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: RtypeBitmap<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Octets::octets_from(source.0).map(RtypeBitmap)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<O, OO> PartialEq<RtypeBitmap<OO>> for RtypeBitmap<O>
|
||||
|
||||
+31
-1
@@ -11,7 +11,8 @@ use crate::base::charstr::CharStr;
|
||||
use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::{Nsec3HashAlg, Rtype};
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
#[cfg(feature="master")] use crate::master::scan::{
|
||||
@@ -75,6 +76,21 @@ impl<Octets> Nsec3<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Nsec3<SrcOctets>> for Nsec3<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Nsec3<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Nsec3::new(
|
||||
source.hash_algorithm, source.flags, source.iterations,
|
||||
CharStr::octets_from(source.salt)?,
|
||||
CharStr::octets_from(source.next_owner)?,
|
||||
RtypeBitmap::octets_from(source.types)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Nsec3<Other>> for Nsec3<Octets>
|
||||
@@ -321,6 +337,20 @@ impl<Octets> Nsec3param<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets>
|
||||
OctetsFrom<Nsec3param<SrcOctets>> for Nsec3param<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Nsec3param<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Nsec3param::new(
|
||||
source.hash_algorithm, source.flags, source.iterations,
|
||||
CharStr::octets_from(source.salt)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Nsec3param<Other>> for Nsec3param<Octets>
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::Rtype;
|
||||
use crate::base::name::{ParsedDname, ToDname};
|
||||
use crate::base::octets::{Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf};
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
#[cfg(feature = "master")]
|
||||
use crate::master::scan::{CharSource, Scan, ScanError, Scanner};
|
||||
|
||||
+28
-1
@@ -7,7 +7,8 @@ use core::cmp::Ordering;
|
||||
use crate::base::cmp::CanonicalOrd;
|
||||
use crate::base::iana::{DigestAlg, Rtype, SecAlg};
|
||||
use crate::base::octets::{
|
||||
Compose, OctetsBuilder, OctetsRef, Parse, ParseError, Parser, ShortBuf
|
||||
Compose, OctetsBuilder, OctetsFrom, OctetsRef, Parse, ParseError, Parser,
|
||||
ShortBuf
|
||||
};
|
||||
use crate::base::rdata::RtypeRecordData;
|
||||
#[cfg(feature="master")] use crate::master::scan::{
|
||||
@@ -59,6 +60,19 @@ impl<Octets> Cdnskey<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Cdnskey<SrcOctets>> for Cdnskey<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Cdnskey<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Cdnskey::new(
|
||||
source.flags, source.protocol, source.algorithm,
|
||||
Octets::octets_from(source.public_key)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Cdnskey<Other>> for Cdnskey<Octets>
|
||||
@@ -248,6 +262,19 @@ impl<Octets> Cds<Octets> {
|
||||
}
|
||||
|
||||
|
||||
//--- OctetsFrom
|
||||
|
||||
impl<Octets, SrcOctets> OctetsFrom<Cds<SrcOctets>> for Cds<Octets>
|
||||
where Octets: OctetsFrom<SrcOctets> {
|
||||
fn octets_from(source: Cds<SrcOctets>) -> Result<Self, ShortBuf> {
|
||||
Ok(Cds::new(
|
||||
source.key_tag, source.algorithm, source.digest_type,
|
||||
Octets::octets_from(source.digest)?,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--- PartialEq and Eq
|
||||
|
||||
impl<Octets, Other> PartialEq<Cds<Other>> for Cds<Octets>
|
||||
|
||||
@@ -56,7 +56,7 @@ const RETRY_RANDOM_PORT: usize = 10;
|
||||
/// A DNS stub resolver.
|
||||
///
|
||||
/// This type collects all information making it possible to start DNS
|
||||
/// queries. You can create a new resoler using the system’s configuration
|
||||
/// queries. You can create a new resolver using the system’s configuration
|
||||
/// using the [`new()`] associate function or using your own configuration
|
||||
/// with [`from_conf()`].
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user