Coverage Report

Created: 2024-05-16 12:16

/__w/smoldot/smoldot/repo/lib/src/libp2p/multiaddr.rs
Line
Count
Source (jump to first uncovered line)
1
// Smoldot
2
// Copyright (C) 2019-2022  Parity Technologies (UK) Ltd.
3
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
4
5
// This program is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
9
10
// This program is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
// GNU General Public License for more details.
14
15
// You should have received a copy of the GNU General Public License
16
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18
// TODO: needs documentation
19
20
use alloc::{borrow::Cow, vec::Vec};
21
use base64::Engine as _;
22
use core::{
23
    fmt, iter, net,
24
    str::{self, FromStr},
25
};
26
27
pub use super::multihash::{FromBytesError as MultihashFromBytesError, Multihash};
28
29
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
30
pub struct Multiaddr<T = Vec<u8>> {
31
    bytes: T,
32
}
33
34
impl Multiaddr<Vec<u8>> {
35
    /// Creates a new empty `Multiaddr`.
36
0
    pub fn empty() -> Self {
37
0
        Multiaddr { bytes: Vec::new() }
38
0
    }
Unexecuted instantiation: _RNvMNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB2_9Multiaddr5empty
Unexecuted instantiation: _RNvMNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB2_9Multiaddr5empty
39
40
    /// Pushes a protocol at the end of this `Multiaddr`.
41
0
    pub fn push(&mut self, protocol: Protocol) {
42
0
        for slice in protocol.as_bytes() {
43
0
            self.bytes.extend(slice.as_ref());
44
0
        }
45
0
    }
Unexecuted instantiation: _RNvMNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB2_9Multiaddr4push
Unexecuted instantiation: _RNvMNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB2_9Multiaddr4push
46
47
    /// Shrinks the memory used by the underlying container to its size.
48
0
    pub fn shrink_to_fit(&mut self) {
49
0
        self.bytes.shrink_to_fit();
50
0
    }
Unexecuted instantiation: _RNvMNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB2_9Multiaddr13shrink_to_fit
Unexecuted instantiation: _RNvMNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB2_9Multiaddr13shrink_to_fit
51
52
    /// Pops the last protocol from the list.
53
    ///
54
    /// # Panic
55
    ///
56
    /// Panics if the `Multiaddr` is empty.
57
    ///
58
2
    pub fn pop(&mut self) {
59
2
        let remain = {
60
2
            let mut iter = nom::combinator::iterator(
61
2
                &self.bytes[..],
62
2
                nom::combinator::recognize(protocol::<&'_ [u8], nom::error::Error<&'_ [u8]>>),
63
2
            );
64
2
65
2
            let bytes_prefix = iter.last().unwrap().len();
66
2
            self.bytes.len() - bytes_prefix
67
2
        };
68
2
69
2
        self.bytes.truncate(remain);
70
2
    }
_RNvMNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB2_9Multiaddr3pop
Line
Count
Source
58
2
    pub fn pop(&mut self) {
59
2
        let remain = {
60
2
            let mut iter = nom::combinator::iterator(
61
2
                &self.bytes[..],
62
2
                nom::combinator::recognize(protocol::<&'_ [u8], nom::error::Error<&'_ [u8]>>),
63
2
            );
64
2
65
2
            let bytes_prefix = iter.last().unwrap().len();
66
2
            self.bytes.len() - bytes_prefix
67
2
        };
68
2
69
2
        self.bytes.truncate(remain);
70
2
    }
Unexecuted instantiation: _RNvMNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB2_9Multiaddr3pop
71
}
72
73
impl<T> Multiaddr<T> {
74
    /// Returns the serialized version of this `Multiaddr`.
75
0
    pub fn into_bytes(self) -> T {
76
0
        self.bytes
77
0
    }
Unexecuted instantiation: _RNvMs_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB4_9MultiaddrpE10into_bytesB8_
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB4_9MultiaddrRShE10into_bytesCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB4_9Multiaddr10into_bytesCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB4_9MultiaddrpE10into_bytesB8_
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB4_9Multiaddr10into_bytesCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB4_9Multiaddr10into_bytesCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB4_9Multiaddr10into_bytesCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvMs_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB4_9Multiaddr10into_bytesCsibGXYHQB8Ea_25json_rpc_general_requests
78
}
79
80
impl<T: AsRef<[u8]>> Multiaddr<T> {
81
    /// Checks whether the given bytes have the proper format, and if so wraps them
82
    /// around a [`Multiaddr`].
83
13
    pub fn from_bytes(bytes: T) -> Result<Self, (FromBytesError, T)> {
84
13
        // Check whether this is indeed a valid list of protocols.
85
13
        if nom::combinator::all_consuming(nom::multi::fold_many0(
86
13
            nom::combinator::complete(protocol::<&[u8], nom::error::Error<&[u8]>>),
87
13
            || (),
_RNCNvMs0_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytes0Bb_
Line
Count
Source
87
13
            || (),
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRShE10from_bytes0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytes0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrpE10from_bytes0Bb_
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEE10from_bytes0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytes0CsiUjFBJteJ7x_17smoldot_full_node
88
28
            |(), _| (),
_RNCNvMs0_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytess_0Bb_
Line
Count
Source
88
28
            |(), _| (),
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRShE10from_bytess_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytess_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrpE10from_bytess_0Bb_
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEE10from_bytess_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr10from_bytess_0CsiUjFBJteJ7x_17smoldot_full_node
89
13
        ))(bytes.as_ref())
90
13
        .is_err()
91
        {
92
0
            return Err((FromBytesError, bytes));
93
13
        }
94
13
95
13
        Ok(Multiaddr { bytes })
96
13
    }
_RNvMs0_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9Multiaddr10from_bytesB9_
Line
Count
Source
83
13
    pub fn from_bytes(bytes: T) -> Result<Self, (FromBytesError, T)> {
84
13
        // Check whether this is indeed a valid list of protocols.
85
13
        if nom::combinator::all_consuming(nom::multi::fold_many0(
86
13
            nom::combinator::complete(protocol::<&[u8], nom::error::Error<&[u8]>>),
87
13
            || (),
88
13
            |(), _| (),
89
13
        ))(bytes.as_ref())
90
13
        .is_err()
91
        {
92
0
            return Err((FromBytesError, bytes));
93
13
        }
94
13
95
13
        Ok(Multiaddr { bytes })
96
13
    }
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRShE10from_bytesCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr10from_bytesCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrpE10from_bytesB9_
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEE10from_bytesCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr10from_bytesCsiUjFBJteJ7x_17smoldot_full_node
97
98
    /// Returns the list of components of the multiaddress.
99
17
    pub fn iter(&'_ self) -> impl Iterator<Item = Protocol<&'_ [u8]>> + '_ {
100
17
        let mut iter = nom::combinator::iterator(
101
17
            self.bytes.as_ref(),
102
17
            protocol::<_, nom::error::Error<&'_ [u8]>>,
103
17
        );
104
55
        iter::from_fn(move || (&mut iter).next())
_RNCNvMs0_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0Bb_
Line
Count
Source
104
55
        iter::from_fn(move || (&mut iter).next())
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRShE4iter0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrpE4iter0Bb_
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEE4iter0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_9Multiaddr4iter0CsibGXYHQB8Ea_25json_rpc_general_requests
105
17
    }
_RNvMs0_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterB9_
Line
Count
Source
99
17
    pub fn iter(&'_ self) -> impl Iterator<Item = Protocol<&'_ [u8]>> + '_ {
100
17
        let mut iter = nom::combinator::iterator(
101
17
            self.bytes.as_ref(),
102
17
            protocol::<_, nom::error::Error<&'_ [u8]>>,
103
17
        );
104
17
        iter::from_fn(move || (&mut iter).next())
105
17
    }
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRShE4iterCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCsih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrpE4iterB9_
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEE4iterCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvMs0_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9Multiaddr4iterCsibGXYHQB8Ea_25json_rpc_general_requests
106
}
107
108
impl<T> AsRef<T> for Multiaddr<T> {
109
13
    fn as_ref(&self) -> &T {
110
13
        &self.bytes
111
13
    }
_RNvXs1_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9MultiaddrINtNtCsaYZPK01V26L_4core7convert5AsRefINtNtCsdZExvAaxgia_5alloc3vec3VechEE6as_refB9_
Line
Count
Source
109
13
    fn as_ref(&self) -> &T {
110
13
        &self.bytes
111
13
    }
Unexecuted instantiation: _RNvXs1_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRShEINtNtCsaYZPK01V26L_4core7convert5AsRefB12_E6as_refCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXs1_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrINtNtCsaYZPK01V26L_4core7convert5AsRefINtNtCsdZExvAaxgia_5alloc3vec3VechEE6as_refCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs1_0pEINtB5_9MultiaddrpEINtNtCsaYZPK01V26L_4core7convert5AsRefpE6as_refB9_
Unexecuted instantiation: _RNvXs1_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrINtNtCsaYZPK01V26L_4core7convert5AsRefINtNtCsdZExvAaxgia_5alloc3vec3VechEE6as_refCsiUjFBJteJ7x_17smoldot_full_node
112
}
113
114
impl<T: AsRef<[u8]>> From<Protocol<T>> for Multiaddr<Vec<u8>> {
115
0
    fn from(proto: Protocol<T>) -> Multiaddr<Vec<u8>> {
116
0
        let bytes = proto.as_bytes().fold(Vec::new(), |mut a, b| {
117
0
            a.extend_from_slice(b.as_ref());
118
0
            a
119
0
        });
Unexecuted instantiation: _RNCNvXININtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrs2_0pENtB7_9MultiaddrINtNtCsaYZPK01V26L_4core7convert4FromINtB7_8ProtocolpEE4from0Bb_
Unexecuted instantiation: _RNCNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs2_0pENtB7_9MultiaddrINtNtCsaYZPK01V26L_4core7convert4FromINtB7_8ProtocolpEE4from0Bb_
120
0
121
0
        Multiaddr { bytes }
122
0
    }
Unexecuted instantiation: _RNvXININtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrs2_0pENtB5_9MultiaddrINtNtCsaYZPK01V26L_4core7convert4FromINtB5_8ProtocolpEE4fromB9_
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs2_0pENtB5_9MultiaddrINtNtCsaYZPK01V26L_4core7convert4FromINtB5_8ProtocolpEE4fromB9_
123
}
124
125
impl FromStr for Multiaddr<Vec<u8>> {
126
    type Err = ParseError;
127
128
27
    fn from_str(input: &str) -> Result<Self, Self::Err> {
129
27
        let mut bytes = Vec::with_capacity(input.len());
130
27
        let mut parts = input.split('/').peekable();
131
27
132
27
        if parts.next() != Some("") {
133
1
            return Err(ParseError::InvalidMultiaddr);
134
26
        }
135
136
62
        while parts.peek().is_some() {
137
47
            let 
protocol36
= Protocol::from_str_parts(&mut parts)
?11
;
138
89
            for slice in 
protocol.as_bytes()36
{
139
89
                bytes.extend_from_slice(slice.as_ref());
140
89
            }
141
        }
142
143
15
        Ok(Multiaddr { bytes })
144
27
    }
_RNvXs3_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtNtCsaYZPK01V26L_4core3str6traits7FromStr8from_str
Line
Count
Source
128
27
    fn from_str(input: &str) -> Result<Self, Self::Err> {
129
27
        let mut bytes = Vec::with_capacity(input.len());
130
27
        let mut parts = input.split('/').peekable();
131
27
132
27
        if parts.next() != Some("") {
133
1
            return Err(ParseError::InvalidMultiaddr);
134
26
        }
135
136
62
        while parts.peek().is_some() {
137
47
            let 
protocol36
= Protocol::from_str_parts(&mut parts)
?11
;
138
89
            for slice in 
protocol.as_bytes()36
{
139
89
                bytes.extend_from_slice(slice.as_ref());
140
89
            }
141
        }
142
143
15
        Ok(Multiaddr { bytes })
144
27
    }
Unexecuted instantiation: _RNvXs3_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtNtCsaYZPK01V26L_4core3str6traits7FromStr8from_str
145
}
146
147
impl<T: AsRef<[u8]>> FromIterator<Protocol<T>> for Multiaddr<Vec<u8>> {
148
0
    fn from_iter<I>(iter: I) -> Self
149
0
    where
150
0
        I: IntoIterator<Item = Protocol<T>>,
151
0
    {
152
0
        let mut bytes = Vec::new();
153
0
        for protocol in iter {
154
0
            for slice in protocol.as_bytes() {
155
0
                bytes.extend(slice.as_ref());
156
0
            }
157
        }
158
0
        Multiaddr { bytes }
159
0
    }
Unexecuted instantiation: _RINvXININtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrs4_0pENtB6_9MultiaddrINtNtNtNtCsaYZPK01V26L_4core4iter6traits7collect12FromIteratorINtB6_8ProtocolpEE9from_iterpEBa_
Unexecuted instantiation: _RINvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs4_0pENtB6_9MultiaddrINtNtNtNtCsaYZPK01V26L_4core4iter6traits7collect12FromIteratorINtB6_8ProtocolpEE9from_iterpEBa_
Unexecuted instantiation: _RINvXs4_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB6_9MultiaddrINtNtNtNtCsaYZPK01V26L_4core4iter6traits7collect12FromIteratorINtB6_8ProtocolRShEE9from_iterINtNtNtB1b_5array4iter8IntoIterB22_Kj2_EECsiUjFBJteJ7x_17smoldot_full_node
160
}
161
162
impl<T: AsRef<[u8]>> fmt::Debug for Multiaddr<T> {
163
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
164
0
        fmt::Display::fmt(&self, f)
165
0
    }
Unexecuted instantiation: _RNvXs5_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs5_0pEINtB5_9MultiaddrpENtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
Unexecuted instantiation: _RNvXs5_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt5Debug3fmtCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvXs5_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt5Debug3fmtCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvXs5_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt5Debug3fmtCsibGXYHQB8Ea_25json_rpc_general_requests
166
}
167
168
impl<T: AsRef<[u8]>> fmt::Display for Multiaddr<T> {
169
15
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
170
32
        for protocol in 
self.iter()15
{
171
32
            fmt::Display::fmt(&protocol, f)
?0
;
172
        }
173
174
15
        Ok(())
175
15
    }
_RNvXs6_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Line
Count
Source
169
15
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
170
32
        for protocol in 
self.iter()15
{
171
32
            fmt::Display::fmt(&protocol, f)
?0
;
172
        }
173
174
15
        Ok(())
175
15
    }
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs6_0pEINtB5_9MultiaddrpENtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_9MultiaddrRINtNtCsdZExvAaxgia_5alloc3vec3VechEENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvXs6_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_9MultiaddrNtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsibGXYHQB8Ea_25json_rpc_general_requests
176
}
177
178
0
#[derive(Debug, derive_more::Display, Clone, PartialEq, Eq)]
Unexecuted instantiation: _RNvXsn_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_14FromBytesErrorNtNtCsaYZPK01V26L_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXsn_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_14FromBytesErrorNtNtCsaYZPK01V26L_4core3fmt7Display3fmt
179
#[display(fmt = "Unable to parse multiaddress")]
180
pub struct FromBytesError;
181
182
// TODO: more doc and properly derive Display
183
0
#[derive(Debug, derive_more::Display, Clone)]
Unexecuted instantiation: _RNvXst_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrNtB5_10ParseErrorNtNtCsaYZPK01V26L_4core3fmt7Display3fmt
Unexecuted instantiation: _RNvXst_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_10ParseErrorNtNtCsaYZPK01V26L_4core3fmt7Display3fmt
184
pub enum ParseError {
185
    /// A multiaddress must always start with `/`.
186
    InvalidMultiaddr,
187
    UnexpectedEof,
188
    UnrecognizedProtocol,
189
    InvalidPort,
190
    InvalidIp,
191
    NotBase58,
192
    InvalidDomainName,
193
    InvalidMultihash(MultihashFromBytesError),
194
    InvalidMemoryPayload,
195
    InvalidMultibase,
196
    InvalidBase64,
197
}
198
199
#[derive(Clone, PartialEq, Eq)]
200
pub enum Protocol<T = Vec<u8>> {
201
    Dns(DomainName<T>),
202
    Dns4(DomainName<T>),
203
    Dns6(DomainName<T>),
204
    DnsAddr(DomainName<T>),
205
    Ip4([u8; 4]),
206
    Ip6([u8; 16]),
207
    P2p(Multihash<T>), // TODO: put directly a PeerId? unclear
208
    Quic,
209
    Tcp(u16),
210
    Tls,
211
    Udp(u16),
212
    Ws,
213
    // TODO: remove support for `/wss` in a long time (https://github.com/paritytech/smoldot/issues/1940)
214
    Wss,
215
    // TODO: unclear what the payload is; see https://github.com/multiformats/multiaddr/issues/127
216
    Memory(u64),
217
    WebRtcDirect,
218
    /// Contains the multihash of the TLS certificate.
219
    Certhash(Multihash<T>),
220
}
221
222
impl<'a> Protocol<Cow<'a, [u8]>> {
223
    /// Attempts to extract a protocol from an iterator of `/`-separated components.
224
47
    pub fn from_str_parts(mut iter: impl Iterator<Item = &'a str>) -> Result<Self, ParseError> {
225
47
        match iter.next().ok_or(ParseError::UnexpectedEof)
?0
{
226
47
            "dns" => {
227
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
228
1
                Ok(Protocol::Dns(DomainName::from_bytes(Cow::Borrowed(
229
1
                    addr.as_bytes(),
230
1
                ))
?0
))
231
            }
232
46
            "dns4" => {
233
3
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
234
3
                Ok(Protocol::Dns4(DomainName::from_bytes(Cow::Borrowed(
235
3
                    addr.as_bytes(),
236
3
                ))
?0
))
237
            }
238
43
            "dns6" => {
239
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
240
1
                Ok(Protocol::Dns6(DomainName::from_bytes(Cow::Borrowed(
241
1
                    addr.as_bytes(),
242
1
                ))
?0
))
243
            }
244
42
            "dnsaddr" => {
245
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
246
1
                Ok(Protocol::DnsAddr(DomainName::from_bytes(Cow::Borrowed(
247
1
                    addr.as_bytes(),
248
1
                ))
?0
))
249
            }
250
41
            "ip4" => {
251
3
                let string_ip = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
252
2
                let parsed =
253
3
                    net::Ipv4Addr::from_str(string_ip).map_err(|_| 
ParseError::InvalidIp1
)
?1
;
_RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEE0Bc_
Line
Count
Source
253
1
                    net::Ipv4Addr::from_str(string_ip).map_err(|_| ParseError::InvalidIp)?;
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEE0Bc_
254
2
                Ok(Protocol::Ip4(parsed.octets()))
255
            }
256
38
            "ip6" => {
257
4
                let string_ip = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
258
3
                let parsed =
259
4
                    net::Ipv6Addr::from_str(string_ip).map_err(|_| 
ParseError::InvalidIp1
)
?1
;
_RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs_0Bc_
Line
Count
Source
259
1
                    net::Ipv6Addr::from_str(string_ip).map_err(|_| ParseError::InvalidIp)?;
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs_0Bc_
260
3
                Ok(Protocol::Ip6(parsed.octets()))
261
            }
262
34
            "p2p" => {
263
4
                let s = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
264
4
                let 
decoded3
= bs58::decode(s)
265
4
                    .into_vec()
266
4
                    .map_err(|_| 
ParseError::NotBase581
)
?1
;
_RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs0_0Bc_
Line
Count
Source
266
1
                    .map_err(|_| ParseError::NotBase58)?;
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs0_0Bc_
267
                Ok(Protocol::P2p(
268
3
                    Multihash::from_bytes(Cow::Owned(decoded))
269
3
                        .map_err(|(err, _)| 
ParseError::InvalidMultihash(err)0
)
?0
,
Unexecuted instantiation: _RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs1_0Bc_
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs1_0Bc_
270
                ))
271
            }
272
30
            "tcp" => {
273
9
                let port = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
274
                Ok(Protocol::Tcp(
275
9
                    port.parse().map_err(|_| 
ParseError::InvalidPort1
)
?1
,
_RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs2_0Bc_
Line
Count
Source
275
1
                    port.parse().map_err(|_| ParseError::InvalidPort)?,
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs2_0Bc_
276
                ))
277
            }
278
21
            "tls" => 
Ok(Protocol::Tls)3
,
279
18
            "udp" => {
280
4
                let port = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
281
                Ok(Protocol::Udp(
282
4
                    port.parse().map_err(|_| 
ParseError::InvalidPort0
)
?0
,
Unexecuted instantiation: _RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs3_0Bc_
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs3_0Bc_
283
                ))
284
            }
285
14
            "ws" => 
Ok(Protocol::Ws)3
,
286
11
            "wss" => 
Ok(Protocol::Wss)1
,
287
10
            "memory" => {
288
1
                let payload = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
289
                Ok(Protocol::Memory(
290
1
                    payload
291
1
                        .parse()
292
1
                        .map_err(|_| 
ParseError::InvalidMemoryPayload0
)
?0
,
Unexecuted instantiation: _RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs4_0Bc_
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs4_0Bc_
293
                ))
294
            }
295
9
            "webrtc-direct" => 
Ok(Protocol::WebRtcDirect)2
,
296
7
            "certhash" => {
297
2
                let 
s1
= iter.next().ok_or(ParseError::UnexpectedEof)
?1
;
298
                // See <https://github.com/multiformats/multibase#multibase-table>
299
1
                let 
base64_flavor0
= match s.as_bytes().first() {
300
0
                    Some(b'm') => base64::engine::general_purpose::STANDARD_NO_PAD,
301
0
                    Some(b'M') => base64::engine::general_purpose::STANDARD,
302
0
                    Some(b'u') => base64::engine::general_purpose::URL_SAFE_NO_PAD,
303
0
                    Some(b'U') => base64::engine::general_purpose::URL_SAFE,
304
1
                    _ => return Err(ParseError::InvalidMultibase),
305
                };
306
0
                let decoded = base64_flavor
307
0
                    .decode(&s[1..])
308
0
                    .map_err(|_| ParseError::InvalidBase64)?;
Unexecuted instantiation: _RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs5_0Bc_
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs5_0Bc_
309
                Ok(Protocol::Certhash(
310
0
                    Multihash::from_bytes(Cow::Owned(decoded))
311
0
                        .map_err(|(err, _)| ParseError::InvalidMultihash(err))?,
Unexecuted instantiation: _RNCINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB27_3str4iter5SplitcEEEs6_0Bc_
Unexecuted instantiation: _RNCINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB8_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB28_3str4iter5SplitcEEEs6_0Bc_
312
                ))
313
            }
314
5
            _ => Err(ParseError::UnrecognizedProtocol),
315
        }
316
47
    }
_RINvMs7_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB6_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB25_3str4iter5SplitcEEEBa_
Line
Count
Source
224
47
    pub fn from_str_parts(mut iter: impl Iterator<Item = &'a str>) -> Result<Self, ParseError> {
225
47
        match iter.next().ok_or(ParseError::UnexpectedEof)
?0
{
226
47
            "dns" => {
227
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
228
1
                Ok(Protocol::Dns(DomainName::from_bytes(Cow::Borrowed(
229
1
                    addr.as_bytes(),
230
1
                ))
?0
))
231
            }
232
46
            "dns4" => {
233
3
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
234
3
                Ok(Protocol::Dns4(DomainName::from_bytes(Cow::Borrowed(
235
3
                    addr.as_bytes(),
236
3
                ))
?0
))
237
            }
238
43
            "dns6" => {
239
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
240
1
                Ok(Protocol::Dns6(DomainName::from_bytes(Cow::Borrowed(
241
1
                    addr.as_bytes(),
242
1
                ))
?0
))
243
            }
244
42
            "dnsaddr" => {
245
1
                let addr = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
246
1
                Ok(Protocol::DnsAddr(DomainName::from_bytes(Cow::Borrowed(
247
1
                    addr.as_bytes(),
248
1
                ))
?0
))
249
            }
250
41
            "ip4" => {
251
3
                let string_ip = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
252
2
                let parsed =
253
3
                    net::Ipv4Addr::from_str(string_ip).map_err(|_| ParseError::InvalidIp)
?1
;
254
2
                Ok(Protocol::Ip4(parsed.octets()))
255
            }
256
38
            "ip6" => {
257
4
                let string_ip = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
258
3
                let parsed =
259
4
                    net::Ipv6Addr::from_str(string_ip).map_err(|_| ParseError::InvalidIp)
?1
;
260
3
                Ok(Protocol::Ip6(parsed.octets()))
261
            }
262
34
            "p2p" => {
263
4
                let s = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
264
4
                let 
decoded3
= bs58::decode(s)
265
4
                    .into_vec()
266
4
                    .map_err(|_| ParseError::NotBase58)
?1
;
267
                Ok(Protocol::P2p(
268
3
                    Multihash::from_bytes(Cow::Owned(decoded))
269
3
                        .map_err(|(err, _)| ParseError::InvalidMultihash(err))
?0
,
270
                ))
271
            }
272
30
            "tcp" => {
273
9
                let port = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
274
                Ok(Protocol::Tcp(
275
9
                    port.parse().map_err(|_| ParseError::InvalidPort)
?1
,
276
                ))
277
            }
278
21
            "tls" => 
Ok(Protocol::Tls)3
,
279
18
            "udp" => {
280
4
                let port = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
281
                Ok(Protocol::Udp(
282
4
                    port.parse().map_err(|_| ParseError::InvalidPort)
?0
,
283
                ))
284
            }
285
14
            "ws" => 
Ok(Protocol::Ws)3
,
286
11
            "wss" => 
Ok(Protocol::Wss)1
,
287
10
            "memory" => {
288
1
                let payload = iter.next().ok_or(ParseError::UnexpectedEof)
?0
;
289
                Ok(Protocol::Memory(
290
1
                    payload
291
1
                        .parse()
292
1
                        .map_err(|_| ParseError::InvalidMemoryPayload)
?0
,
293
                ))
294
            }
295
9
            "webrtc-direct" => 
Ok(Protocol::WebRtcDirect)2
,
296
7
            "certhash" => {
297
2
                let 
s1
= iter.next().ok_or(ParseError::UnexpectedEof)
?1
;
298
                // See <https://github.com/multiformats/multibase#multibase-table>
299
1
                let 
base64_flavor0
= match s.as_bytes().first() {
300
0
                    Some(b'm') => base64::engine::general_purpose::STANDARD_NO_PAD,
301
0
                    Some(b'M') => base64::engine::general_purpose::STANDARD,
302
0
                    Some(b'u') => base64::engine::general_purpose::URL_SAFE_NO_PAD,
303
0
                    Some(b'U') => base64::engine::general_purpose::URL_SAFE,
304
1
                    _ => return Err(ParseError::InvalidMultibase),
305
                };
306
0
                let decoded = base64_flavor
307
0
                    .decode(&s[1..])
308
0
                    .map_err(|_| ParseError::InvalidBase64)?;
309
                Ok(Protocol::Certhash(
310
0
                    Multihash::from_bytes(Cow::Owned(decoded))
311
0
                        .map_err(|(err, _)| ParseError::InvalidMultihash(err))?,
312
                ))
313
            }
314
5
            _ => Err(ParseError::UnrecognizedProtocol),
315
        }
316
47
    }
Unexecuted instantiation: _RINvMs7_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB6_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE14from_str_partsQINtNtNtNtCsaYZPK01V26L_4core4iter8adapters8peekable8PeekableINtNtNtB26_3str4iter5SplitcEEEBa_
317
}
318
319
impl<T: AsRef<[u8]>> Protocol<T> {
320
    /// Returns an iterator to a list of buffers that, when concatenated together, form the
321
    /// binary representation of this protocol.
322
36
    pub fn as_bytes(&self) -> impl Iterator<Item = impl AsRef<[u8]>> {
323
36
        let code = match self {
324
1
            Protocol::Dns(_) => 53,
325
3
            Protocol::Dns4(_) => 54,
326
1
            Protocol::Dns6(_) => 55,
327
1
            Protocol::DnsAddr(_) => 56,
328
2
            Protocol::Ip4(_) => 4,
329
3
            Protocol::Ip6(_) => 41,
330
3
            Protocol::P2p(_) => 421,
331
0
            Protocol::Quic => 460,
332
8
            Protocol::Tcp(_) => 6,
333
3
            Protocol::Tls => 448,
334
4
            Protocol::Udp(_) => 273,
335
3
            Protocol::Ws => 477,
336
1
            Protocol::Wss => 478,
337
1
            Protocol::Memory(_) => 777,
338
2
            Protocol::WebRtcDirect => 280,
339
0
            Protocol::Certhash(_) => 466,
340
        };
341
342
        // TODO: optimize by not allocating a Vec
343
36
        let extra = match self {
344
1
            Protocol::Dns(addr)
345
3
            | Protocol::Dns4(addr)
346
1
            | Protocol::Dns6(addr)
347
1
            | Protocol::DnsAddr(addr) => {
348
6
                let addr = addr.as_ref().as_ref();
349
6
                let mut out = Vec::with_capacity(addr.len() + 4);
350
6
                out.extend(crate::util::leb128::encode_usize(addr.len()));
351
6
                out.extend_from_slice(addr);
352
6
                out
353
            }
354
2
            Protocol::Ip4(ip) => ip.to_vec(),
355
3
            Protocol::Ip6(ip) => ip.to_vec(),
356
3
            Protocol::P2p(multihash) => {
357
3
                let multihash = multihash.as_ref().as_ref();
358
3
                // TODO: what if not a valid multihash? the enum variant can be constructed by the user
359
3
                let mut out = Vec::with_capacity(multihash.len() + 4);
360
3
                out.extend(crate::util::leb128::encode_usize(multihash.len()));
361
3
                out.extend_from_slice(multihash);
362
3
                out
363
            }
364
12
            Protocol::Tcp(
port8
) | Protocol::Udp(
port4
) => port.to_be_bytes().to_vec(),
365
1
            Protocol::Memory(payload) => payload.to_be_bytes().to_vec(),
366
0
            Protocol::Certhash(multihash) => {
367
0
                let multihash = multihash.as_ref().as_ref();
368
0
                // TODO: what if not a valid multihash? the enum variant can be constructed by the user
369
0
                let mut out = Vec::with_capacity(multihash.len() + 4);
370
0
                out.extend(crate::util::leb128::encode_usize(multihash.len()));
371
0
                out.extend_from_slice(multihash);
372
0
                out
373
            }
374
9
            _ => Vec::new(),
375
        };
376
377
        // Combine `code` and `extra`.
378
36
        crate::util::leb128::encode_usize(code)
379
53
            .map(|b| either::Left([b]))
_RNCNvMs8_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE8as_bytes0Bb_
Line
Count
Source
379
53
            .map(|b| either::Left([b]))
Unexecuted instantiation: _RNCNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE8as_bytes0Bb_
Unexecuted instantiation: _RNCNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB7_8Protocol8as_bytes0Bb_
Unexecuted instantiation: _RNCNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_8ProtocolRShE8as_bytes0CsiUjFBJteJ7x_17smoldot_full_node
380
36
            .chain(iter::once(either::Right(extra)))
381
36
    }
_RNvMs8_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE8as_bytesB9_
Line
Count
Source
322
36
    pub fn as_bytes(&self) -> impl Iterator<Item = impl AsRef<[u8]>> {
323
36
        let code = match self {
324
1
            Protocol::Dns(_) => 53,
325
3
            Protocol::Dns4(_) => 54,
326
1
            Protocol::Dns6(_) => 55,
327
1
            Protocol::DnsAddr(_) => 56,
328
2
            Protocol::Ip4(_) => 4,
329
3
            Protocol::Ip6(_) => 41,
330
3
            Protocol::P2p(_) => 421,
331
0
            Protocol::Quic => 460,
332
8
            Protocol::Tcp(_) => 6,
333
3
            Protocol::Tls => 448,
334
4
            Protocol::Udp(_) => 273,
335
3
            Protocol::Ws => 477,
336
1
            Protocol::Wss => 478,
337
1
            Protocol::Memory(_) => 777,
338
2
            Protocol::WebRtcDirect => 280,
339
0
            Protocol::Certhash(_) => 466,
340
        };
341
342
        // TODO: optimize by not allocating a Vec
343
36
        let extra = match self {
344
1
            Protocol::Dns(addr)
345
3
            | Protocol::Dns4(addr)
346
1
            | Protocol::Dns6(addr)
347
1
            | Protocol::DnsAddr(addr) => {
348
6
                let addr = addr.as_ref().as_ref();
349
6
                let mut out = Vec::with_capacity(addr.len() + 4);
350
6
                out.extend(crate::util::leb128::encode_usize(addr.len()));
351
6
                out.extend_from_slice(addr);
352
6
                out
353
            }
354
2
            Protocol::Ip4(ip) => ip.to_vec(),
355
3
            Protocol::Ip6(ip) => ip.to_vec(),
356
3
            Protocol::P2p(multihash) => {
357
3
                let multihash = multihash.as_ref().as_ref();
358
3
                // TODO: what if not a valid multihash? the enum variant can be constructed by the user
359
3
                let mut out = Vec::with_capacity(multihash.len() + 4);
360
3
                out.extend(crate::util::leb128::encode_usize(multihash.len()));
361
3
                out.extend_from_slice(multihash);
362
3
                out
363
            }
364
12
            Protocol::Tcp(
port8
) | Protocol::Udp(
port4
) => port.to_be_bytes().to_vec(),
365
1
            Protocol::Memory(payload) => payload.to_be_bytes().to_vec(),
366
0
            Protocol::Certhash(multihash) => {
367
0
                let multihash = multihash.as_ref().as_ref();
368
0
                // TODO: what if not a valid multihash? the enum variant can be constructed by the user
369
0
                let mut out = Vec::with_capacity(multihash.len() + 4);
370
0
                out.extend(crate::util::leb128::encode_usize(multihash.len()));
371
0
                out.extend_from_slice(multihash);
372
0
                out
373
            }
374
9
            _ => Vec::new(),
375
        };
376
377
        // Combine `code` and `extra`.
378
36
        crate::util::leb128::encode_usize(code)
379
36
            .map(|b| either::Left([b]))
380
36
            .chain(iter::once(either::Right(extra)))
381
36
    }
Unexecuted instantiation: _RNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE8as_bytesB9_
Unexecuted instantiation: _RNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_8Protocol8as_bytesB9_
Unexecuted instantiation: _RNvMs8_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShE8as_bytesCsiUjFBJteJ7x_17smoldot_full_node
382
}
383
384
impl<T: AsRef<[u8]>> fmt::Debug for Protocol<T> {
385
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
386
0
        fmt::Display::fmt(self, f)
387
0
    }
Unexecuted instantiation: _RNvXININtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrs9_0pEINtB5_8ProtocolpENtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrs9_0pEINtB5_8ProtocolpENtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
388
}
389
390
impl<T: AsRef<[u8]>> fmt::Display for Protocol<T> {
391
32
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
392
32
        match self {
393
            // Note that since a `DomainName` always contains a valid domain name, it is
394
            // guaranteed that `addr` never contains a `/`.
395
1
            Protocol::Dns(addr) => write!(f, "/dns/{addr}"),
396
3
            Protocol::Dns4(addr) => write!(f, "/dns4/{addr}"),
397
1
            Protocol::Dns6(addr) => write!(f, "/dns6/{addr}"),
398
1
            Protocol::DnsAddr(addr) => write!(f, "/dnsaddr/{addr}"),
399
2
            Protocol::Ip4(ip) => write!(f, "/ip4/{}", net::Ipv4Addr::from(*ip)),
400
3
            Protocol::Ip6(ip) => write!(f, "/ip6/{}", net::Ipv6Addr::from(*ip)),
401
1
            Protocol::P2p(multihash) => {
402
1
                // Base58 encoding doesn't have `/` in its characters set.
403
1
                write!(f, "/p2p/{}", bs58::encode(multihash.as_ref()).into_string())
404
            }
405
0
            Protocol::Quic => write!(f, "/quic"),
406
8
            Protocol::Tcp(port) => write!(f, "/tcp/{port}"),
407
3
            Protocol::Tls => write!(f, "/tls"),
408
4
            Protocol::Udp(port) => write!(f, "/udp/{port}"),
409
2
            Protocol::Ws => write!(f, "/ws"),
410
1
            Protocol::Wss => write!(f, "/wss"),
411
1
            Protocol::Memory(payload) => write!(f, "/memory/{payload}"),
412
1
            Protocol::WebRtcDirect => write!(f, "/webrtc-direct"),
413
0
            Protocol::Certhash(multihash) => {
414
0
                write!(
415
0
                    f,
416
0
                    "/certhash/u{}",
417
0
                    base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(multihash.as_ref())
418
0
                )
419
            }
420
        }
421
32
    }
_RNvXsa_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Line
Count
Source
391
32
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
392
32
        match self {
393
            // Note that since a `DomainName` always contains a valid domain name, it is
394
            // guaranteed that `addr` never contains a `/`.
395
1
            Protocol::Dns(addr) => write!(f, "/dns/{addr}"),
396
3
            Protocol::Dns4(addr) => write!(f, "/dns4/{addr}"),
397
1
            Protocol::Dns6(addr) => write!(f, "/dns6/{addr}"),
398
1
            Protocol::DnsAddr(addr) => write!(f, "/dnsaddr/{addr}"),
399
2
            Protocol::Ip4(ip) => write!(f, "/ip4/{}", net::Ipv4Addr::from(*ip)),
400
3
            Protocol::Ip6(ip) => write!(f, "/ip6/{}", net::Ipv6Addr::from(*ip)),
401
1
            Protocol::P2p(multihash) => {
402
1
                // Base58 encoding doesn't have `/` in its characters set.
403
1
                write!(f, "/p2p/{}", bs58::encode(multihash.as_ref()).into_string())
404
            }
405
0
            Protocol::Quic => write!(f, "/quic"),
406
8
            Protocol::Tcp(port) => write!(f, "/tcp/{port}"),
407
3
            Protocol::Tls => write!(f, "/tls"),
408
4
            Protocol::Udp(port) => write!(f, "/udp/{port}"),
409
2
            Protocol::Ws => write!(f, "/ws"),
410
1
            Protocol::Wss => write!(f, "/wss"),
411
1
            Protocol::Memory(payload) => write!(f, "/memory/{payload}"),
412
1
            Protocol::WebRtcDirect => write!(f, "/webrtc-direct"),
413
0
            Protocol::Certhash(multihash) => {
414
0
                write!(
415
0
                    f,
416
0
                    "/certhash/u{}",
417
0
                    base64::engine::general_purpose::URL_SAFE_NO_PAD.encode(multihash.as_ref())
418
0
                )
419
            }
420
        }
421
32
    }
Unexecuted instantiation: _RNvXsa_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrsa_0pEINtB5_8ProtocolpENtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Unexecuted instantiation: _RNvXsa_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvXsa_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvXsa_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvXsa_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_8ProtocolRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsibGXYHQB8Ea_25json_rpc_general_requests
422
}
423
424
/// Domain name. Guarantees that the domain name has a valid syntax.
425
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
426
pub struct DomainName<T = Vec<u8>>(T);
427
428
impl<T> DomainName<T> {
429
    /// Returns the underlying bytes of the domain name.
430
0
    pub fn into_bytes(self) -> T {
431
0
        self.0
432
0
    }
Unexecuted instantiation: _RNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_10DomainNamepE10into_bytesB9_
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10into_bytesCsih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNamepE10into_bytesB9_
433
434
    /// Try to parse the given string as a domain name.
435
20
    pub fn from_bytes(bytes: T) -> Result<DomainName<T>, ParseError>
436
20
    where
437
20
        T: AsRef<[u8]>,
438
20
    {
439
        // Checks whether the input is valid domain name.
440
        // See https://datatracker.ietf.org/doc/html/rfc2181#section-11
441
442
        // An earlier version of this code used the `addr` Rust library, but it resulted in an
443
        // unnecessarily large binary size overhead (~1.1 MiB!), so the check is now implemented
444
        // manually instead.
445
446
20
        let as_str = str::from_utf8(bytes.as_ref()).map_err(|_| 
ParseError::InvalidDomainName0
)
?0
;
Unexecuted instantiation: _RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytes0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytes0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytes0CsibGXYHQB8Ea_25json_rpc_general_requests
447
448
20
        if as_str.len() > 255 {
449
0
            return Err(ParseError::InvalidDomainName);
450
20
        }
451
20
452
20
        if !as_str.is_empty() && 
as_str != "."17
{
453
            // The checks within this for loop would fail if `input` is empty or equal to ".",
454
            // even though "" and "." are valid domain names.
455
46
            for label in 
as_str.split_terminator('.')14
{
456
46
                if label.is_empty() || label.as_bytes().len() > 63 {
457
0
                    return Err(ParseError::InvalidDomainName);
458
46
                }
459
            }
460
6
        }
461
462
        // In addition to the standard, we also forbid any domain name containing a `/` byte,
463
        // because it would mess up with the multiaddress format.
464
232
        if 
as_str.chars().any(20
|c| c == '/'
)20
||
as_str.as_bytes().iter().any(20
|b| *b == b'/'
)20
{
_RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytess_0Bb_
Line
Count
Source
464
63
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
_RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0Bb_
Line
Count
Source
464
169
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytess_0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess_0CsibGXYHQB8Ea_25json_rpc_general_requests
_RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytess0_0Bb_
Line
Count
Source
464
63
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
_RNCNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0Bb_
Line
Count
Source
464
169
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytess0_0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0Bb_
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB7_10DomainNameRShE10from_bytess0_0CsibGXYHQB8Ea_25json_rpc_general_requests
465
0
            return Err(ParseError::InvalidDomainName);
466
20
        }
467
20
468
20
        // Note that success here does in no way guarantee that this domain name is registrable,
469
20
        // only that its syntax is valid.
470
20
471
20
        Ok(DomainName(bytes))
472
20
    }
_RNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytesB9_
Line
Count
Source
435
6
    pub fn from_bytes(bytes: T) -> Result<DomainName<T>, ParseError>
436
6
    where
437
6
        T: AsRef<[u8]>,
438
6
    {
439
        // Checks whether the input is valid domain name.
440
        // See https://datatracker.ietf.org/doc/html/rfc2181#section-11
441
442
        // An earlier version of this code used the `addr` Rust library, but it resulted in an
443
        // unnecessarily large binary size overhead (~1.1 MiB!), so the check is now implemented
444
        // manually instead.
445
446
6
        let as_str = str::from_utf8(bytes.as_ref()).map_err(|_| ParseError::InvalidDomainName)
?0
;
447
448
6
        if as_str.len() > 255 {
449
0
            return Err(ParseError::InvalidDomainName);
450
6
        }
451
6
452
6
        if !as_str.is_empty() && 
as_str != "."5
{
453
            // The checks within this for loop would fail if `input` is empty or equal to ".",
454
            // even though "" and "." are valid domain names.
455
13
            for label in 
as_str.split_terminator('.')4
{
456
13
                if label.is_empty() || label.as_bytes().len() > 63 {
457
0
                    return Err(ParseError::InvalidDomainName);
458
13
                }
459
            }
460
2
        }
461
462
        // In addition to the standard, we also forbid any domain name containing a `/` byte,
463
        // because it would mess up with the multiaddress format.
464
6
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
465
0
            return Err(ParseError::InvalidDomainName);
466
6
        }
467
6
468
6
        // Note that success here does in no way guarantee that this domain name is registrable,
469
6
        // only that its syntax is valid.
470
6
471
6
        Ok(DomainName(bytes))
472
6
    }
_RNvMsb_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesB9_
Line
Count
Source
435
14
    pub fn from_bytes(bytes: T) -> Result<DomainName<T>, ParseError>
436
14
    where
437
14
        T: AsRef<[u8]>,
438
14
    {
439
        // Checks whether the input is valid domain name.
440
        // See https://datatracker.ietf.org/doc/html/rfc2181#section-11
441
442
        // An earlier version of this code used the `addr` Rust library, but it resulted in an
443
        // unnecessarily large binary size overhead (~1.1 MiB!), so the check is now implemented
444
        // manually instead.
445
446
14
        let as_str = str::from_utf8(bytes.as_ref()).map_err(|_| ParseError::InvalidDomainName)
?0
;
447
448
14
        if as_str.len() > 255 {
449
0
            return Err(ParseError::InvalidDomainName);
450
14
        }
451
14
452
14
        if !as_str.is_empty() && 
as_str != "."12
{
453
            // The checks within this for loop would fail if `input` is empty or equal to ".",
454
            // even though "" and "." are valid domain names.
455
33
            for label in 
as_str.split_terminator('.')10
{
456
33
                if label.is_empty() || label.as_bytes().len() > 63 {
457
0
                    return Err(ParseError::InvalidDomainName);
458
33
                }
459
            }
460
4
        }
461
462
        // In addition to the standard, we also forbid any domain name containing a `/` byte,
463
        // because it would mess up with the multiaddress format.
464
14
        if as_str.chars().any(|c| c == '/') || as_str.as_bytes().iter().any(|b| *b == b'/') {
465
0
            return Err(ParseError::InvalidDomainName);
466
14
        }
467
14
468
14
        // Note that success here does in no way guarantee that this domain name is registrable,
469
14
        // only that its syntax is valid.
470
14
471
14
        Ok(DomainName(bytes))
472
14
    }
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCsih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEE10from_bytesB9_
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesB9_
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvMsb_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShE10from_bytesCsibGXYHQB8Ea_25json_rpc_general_requests
473
}
474
475
impl<T> AsRef<T> for DomainName<T> {
476
6
    fn as_ref(&self) -> &T {
477
6
        &self.0
478
6
    }
_RNvXsc_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEEINtNtCsaYZPK01V26L_4core7convert5AsRefB13_E6as_refB9_
Line
Count
Source
476
6
    fn as_ref(&self) -> &T {
477
6
        &self.0
478
6
    }
Unexecuted instantiation: _RNvXsc_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameINtNtCsdZExvAaxgia_5alloc6borrow3CowShEEINtNtCsaYZPK01V26L_4core7convert5AsRefB14_E6as_refB9_
Unexecuted instantiation: _RNvXsc_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrNtB5_10DomainNameINtNtCsaYZPK01V26L_4core7convert5AsRefINtNtCsdZExvAaxgia_5alloc3vec3VechEE6as_refB9_
Unexecuted instantiation: _RNvXsc_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShEINtNtCsaYZPK01V26L_4core7convert5AsRefB14_E6as_refCsiUjFBJteJ7x_17smoldot_full_node
479
}
480
481
impl<T: AsRef<[u8]>> fmt::Debug for DomainName<T> {
482
0
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
483
0
        let as_str = str::from_utf8(self.0.as_ref()).unwrap();
484
0
        fmt::Debug::fmt(as_str, f)
485
0
    }
Unexecuted instantiation: _RNvXININtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrsd_0pEINtB5_10DomainNamepENtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrsd_0pEINtB5_10DomainNamepENtNtCsaYZPK01V26L_4core3fmt5Debug3fmtB9_
486
}
487
488
impl<T: AsRef<[u8]>> fmt::Display for DomainName<T> {
489
6
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
490
6
        let as_str = str::from_utf8(self.0.as_ref()).unwrap();
491
6
        fmt::Display::fmt(as_str, f)
492
6
    }
_RNvXse_NtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Line
Count
Source
489
6
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
490
6
        let as_str = str::from_utf8(self.0.as_ref()).unwrap();
491
6
        fmt::Display::fmt(as_str, f)
492
6
    }
Unexecuted instantiation: _RNvXse_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNvXININtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrse_0pEINtB5_10DomainNamepENtNtCsaYZPK01V26L_4core3fmt7Display3fmtB9_
Unexecuted instantiation: _RNvXse_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNvXse_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNvXse_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCscDgN54JpMGG_6author
Unexecuted instantiation: _RNvXse_NtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddrINtB5_10DomainNameRShENtNtCsaYZPK01V26L_4core3fmt7Display3fmtCsibGXYHQB8Ea_25json_rpc_general_requests
493
}
494
495
/// Parses a single protocol from its bytes.
496
104
fn protocol<'a, T: From<&'a [u8]> + AsRef<[u8]>, E: nom::error::ParseError<&'a [u8]>>(
497
104
    bytes: &'a [u8],
498
104
) -> nom::IResult<&'a [u8], Protocol<T>, E> {
499
104
    nom::combinator::flat_map(crate::util::leb128::nom_leb128_usize, |protocol_code| 
{72
500
72
        move |bytes: &'a [u8]| match protocol_code {
501
4
            4 => nom::combinator::map(nom::bytes::streaming::take(4_u32), |ip: &'a [u8]| {
502
4
                Protocol::Ip4(ip.try_into().unwrap())
503
4
            })(bytes),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE000Bc_
Line
Count
Source
501
4
            4 => nom::combinator::map(nom::bytes::streaming::take(4_u32), |ip: &'a [u8]| {
502
4
                Protocol::Ip4(ip.try_into().unwrap())
503
4
            })(bytes),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE000CsibGXYHQB8Ea_25json_rpc_general_requests
504
18
            6 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Tcp)(bytes),
505
6
            41 => nom::combinator::map(nom::bytes::streaming::take(16_u32), |ip: &'a [u8]| {
506
6
                Protocol::Ip6(ip.try_into().unwrap())
507
6
            })(bytes),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s_0Bc_
Line
Count
Source
505
6
            41 => nom::combinator::map(nom::bytes::streaming::take(16_u32), |ip: &'a [u8]| {
506
6
                Protocol::Ip6(ip.try_into().unwrap())
507
6
            })(bytes),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s_0CsibGXYHQB8Ea_25json_rpc_general_requests
508
2
            53 => nom::combinator::map(
509
2
                nom::combinator::map_opt(
510
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
511
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s0_0Bc_
Line
Count
Source
511
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s0_0CsibGXYHQB8Ea_25json_rpc_general_requests
512
2
                ),
513
2
                Protocol::Dns,
514
2
            )(bytes),
515
8
            54 => nom::combinator::map(
516
8
                nom::combinator::map_opt(
517
8
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
518
8
                    |s| DomainName::from_bytes(T::from(s)).ok(),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s1_0Bc_
Line
Count
Source
518
8
                    |s| DomainName::from_bytes(T::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s1_0CsibGXYHQB8Ea_25json_rpc_general_requests
519
8
                ),
520
8
                Protocol::Dns4,
521
8
            )(bytes),
522
2
            55 => nom::combinator::map(
523
2
                nom::combinator::map_opt(
524
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
525
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s2_0Bc_
Line
Count
Source
525
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s2_0CsibGXYHQB8Ea_25json_rpc_general_requests
526
2
                ),
527
2
                Protocol::Dns6,
528
2
            )(bytes),
529
2
            56 => nom::combinator::map(
530
2
                nom::combinator::map_opt(
531
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
532
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s3_0Bc_
Line
Count
Source
532
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s3_0CsibGXYHQB8Ea_25json_rpc_general_requests
533
2
                ),
534
2
                Protocol::DnsAddr,
535
2
            )(bytes),
536
8
            273 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Udp)(bytes),
537
6
            421 => nom::combinator::map(
538
6
                nom::combinator::map_opt(
539
6
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
540
6
                    |s| Multihash::from_bytes(From::from(s)).ok(),
_RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s4_0Bc_
Line
Count
Source
540
6
                    |s| Multihash::from_bytes(From::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s4_0CsibGXYHQB8Ea_25json_rpc_general_requests
541
6
                ),
542
6
                Protocol::P2p,
543
6
            )(bytes),
544
6
            448 => Ok((bytes, Protocol::Tls)),
545
0
            460 => Ok((bytes, Protocol::Quic)),
546
4
            477 => Ok((bytes, Protocol::Ws)),
547
2
            478 => Ok((bytes, Protocol::Wss)),
548
            // TODO: unclear what the /memory payload is, see https://github.com/multiformats/multiaddr/issues/127
549
2
            777 => nom::combinator::map(nom::number::streaming::be_u64, Protocol::Memory)(bytes),
550
2
            280 => Ok((bytes, Protocol::WebRtcDirect)),
551
0
            466 => nom::combinator::map(
552
0
                nom::combinator::map_opt(
553
0
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
554
0
                    |s| Multihash::from_bytes(From::from(s)).ok(),
Unexecuted instantiation: _RNCNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBX_EE00s5_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0Bc_
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBY_EE00s5_0CsibGXYHQB8Ea_25json_rpc_general_requests
555
0
                ),
556
0
                Protocol::Certhash,
557
0
            )(bytes),
558
0
            _ => Err(nom::Err::Error(nom::error::make_error(
559
0
                bytes,
560
0
                nom::error::ErrorKind::Tag,
561
0
            ))),
562
72
        }
_RNCNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBV_EE00Ba_
Line
Count
Source
500
72
        move |bytes: &'a [u8]| match protocol_code {
501
4
            4 => nom::combinator::map(nom::bytes::streaming::take(4_u32), |ip: &'a [u8]| {
502
                Protocol::Ip4(ip.try_into().unwrap())
503
4
            })(bytes),
504
18
            6 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Tcp)(bytes),
505
6
            41 => nom::combinator::map(nom::bytes::streaming::take(16_u32), |ip: &'a [u8]| {
506
                Protocol::Ip6(ip.try_into().unwrap())
507
6
            })(bytes),
508
2
            53 => nom::combinator::map(
509
2
                nom::combinator::map_opt(
510
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
511
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
512
2
                ),
513
2
                Protocol::Dns,
514
2
            )(bytes),
515
8
            54 => nom::combinator::map(
516
8
                nom::combinator::map_opt(
517
8
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
518
8
                    |s| DomainName::from_bytes(T::from(s)).ok(),
519
8
                ),
520
8
                Protocol::Dns4,
521
8
            )(bytes),
522
2
            55 => nom::combinator::map(
523
2
                nom::combinator::map_opt(
524
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
525
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
526
2
                ),
527
2
                Protocol::Dns6,
528
2
            )(bytes),
529
2
            56 => nom::combinator::map(
530
2
                nom::combinator::map_opt(
531
2
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
532
2
                    |s| DomainName::from_bytes(T::from(s)).ok(),
533
2
                ),
534
2
                Protocol::DnsAddr,
535
2
            )(bytes),
536
8
            273 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Udp)(bytes),
537
6
            421 => nom::combinator::map(
538
6
                nom::combinator::map_opt(
539
6
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
540
6
                    |s| Multihash::from_bytes(From::from(s)).ok(),
541
6
                ),
542
6
                Protocol::P2p,
543
6
            )(bytes),
544
6
            448 => Ok((bytes, Protocol::Tls)),
545
0
            460 => Ok((bytes, Protocol::Quic)),
546
4
            477 => Ok((bytes, Protocol::Ws)),
547
2
            478 => Ok((bytes, Protocol::Wss)),
548
            // TODO: unclear what the /memory payload is, see https://github.com/multiformats/multiaddr/issues/127
549
2
            777 => nom::combinator::map(nom::number::streaming::be_u64, Protocol::Memory)(bytes),
550
2
            280 => Ok((bytes, Protocol::WebRtcDirect)),
551
0
            466 => nom::combinator::map(
552
0
                nom::combinator::map_opt(
553
0
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
554
0
                    |s| Multihash::from_bytes(From::from(s)).ok(),
555
0
                ),
556
0
                Protocol::Certhash,
557
0
            )(bytes),
558
0
            _ => Err(nom::Err::Error(nom::error::make_error(
559
0
                bytes,
560
0
                nom::error::ErrorKind::Tag,
561
0
            ))),
562
72
        }
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00Ba_
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBW_EE00CsibGXYHQB8Ea_25json_rpc_general_requests
563
104
    
}72
)(bytes)
_RNCINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBT_EE0B8_
Line
Count
Source
499
72
    nom::combinator::flat_map(crate::util::leb128::nom_leb128_usize, |protocol_code| {
500
        move |bytes: &'a [u8]| match protocol_code {
501
            4 => nom::combinator::map(nom::bytes::streaming::take(4_u32), |ip: &'a [u8]| {
502
                Protocol::Ip4(ip.try_into().unwrap())
503
            })(bytes),
504
            6 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Tcp)(bytes),
505
            41 => nom::combinator::map(nom::bytes::streaming::take(16_u32), |ip: &'a [u8]| {
506
                Protocol::Ip6(ip.try_into().unwrap())
507
            })(bytes),
508
            53 => nom::combinator::map(
509
                nom::combinator::map_opt(
510
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
511
                    |s| DomainName::from_bytes(T::from(s)).ok(),
512
                ),
513
                Protocol::Dns,
514
            )(bytes),
515
            54 => nom::combinator::map(
516
                nom::combinator::map_opt(
517
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
518
                    |s| DomainName::from_bytes(T::from(s)).ok(),
519
                ),
520
                Protocol::Dns4,
521
            )(bytes),
522
            55 => nom::combinator::map(
523
                nom::combinator::map_opt(
524
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
525
                    |s| DomainName::from_bytes(T::from(s)).ok(),
526
                ),
527
                Protocol::Dns6,
528
            )(bytes),
529
            56 => nom::combinator::map(
530
                nom::combinator::map_opt(
531
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
532
                    |s| DomainName::from_bytes(T::from(s)).ok(),
533
                ),
534
                Protocol::DnsAddr,
535
            )(bytes),
536
            273 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Udp)(bytes),
537
            421 => nom::combinator::map(
538
                nom::combinator::map_opt(
539
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
540
                    |s| Multihash::from_bytes(From::from(s)).ok(),
541
                ),
542
                Protocol::P2p,
543
            )(bytes),
544
            448 => Ok((bytes, Protocol::Tls)),
545
            460 => Ok((bytes, Protocol::Quic)),
546
            477 => Ok((bytes, Protocol::Ws)),
547
            478 => Ok((bytes, Protocol::Wss)),
548
            // TODO: unclear what the /memory payload is, see https://github.com/multiformats/multiaddr/issues/127
549
            777 => nom::combinator::map(nom::number::streaming::be_u64, Protocol::Memory)(bytes),
550
            280 => Ok((bytes, Protocol::WebRtcDirect)),
551
            466 => nom::combinator::map(
552
                nom::combinator::map_opt(
553
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
554
                    |s| Multihash::from_bytes(From::from(s)).ok(),
555
                ),
556
                Protocol::Certhash,
557
            )(bytes),
558
            _ => Err(nom::Err::Error(nom::error::make_error(
559
                bytes,
560
                nom::error::ErrorKind::Tag,
561
            ))),
562
        }
563
72
    })(bytes)
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0CsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0Csih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0B8_
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0CsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0CsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0CscDgN54JpMGG_6author
Unexecuted instantiation: _RNCINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBU_EE0CsibGXYHQB8Ea_25json_rpc_general_requests
564
104
}
_RINvNtNtCsN16ciHI6Qf_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBR_EEB6_
Line
Count
Source
496
104
fn protocol<'a, T: From<&'a [u8]> + AsRef<[u8]>, E: nom::error::ParseError<&'a [u8]>>(
497
104
    bytes: &'a [u8],
498
104
) -> nom::IResult<&'a [u8], Protocol<T>, E> {
499
104
    nom::combinator::flat_map(crate::util::leb128::nom_leb128_usize, |protocol_code| {
500
        move |bytes: &'a [u8]| match protocol_code {
501
            4 => nom::combinator::map(nom::bytes::streaming::take(4_u32), |ip: &'a [u8]| {
502
                Protocol::Ip4(ip.try_into().unwrap())
503
            })(bytes),
504
            6 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Tcp)(bytes),
505
            41 => nom::combinator::map(nom::bytes::streaming::take(16_u32), |ip: &'a [u8]| {
506
                Protocol::Ip6(ip.try_into().unwrap())
507
            })(bytes),
508
            53 => nom::combinator::map(
509
                nom::combinator::map_opt(
510
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
511
                    |s| DomainName::from_bytes(T::from(s)).ok(),
512
                ),
513
                Protocol::Dns,
514
            )(bytes),
515
            54 => nom::combinator::map(
516
                nom::combinator::map_opt(
517
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
518
                    |s| DomainName::from_bytes(T::from(s)).ok(),
519
                ),
520
                Protocol::Dns4,
521
            )(bytes),
522
            55 => nom::combinator::map(
523
                nom::combinator::map_opt(
524
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
525
                    |s| DomainName::from_bytes(T::from(s)).ok(),
526
                ),
527
                Protocol::Dns6,
528
            )(bytes),
529
            56 => nom::combinator::map(
530
                nom::combinator::map_opt(
531
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
532
                    |s| DomainName::from_bytes(T::from(s)).ok(),
533
                ),
534
                Protocol::DnsAddr,
535
            )(bytes),
536
            273 => nom::combinator::map(nom::number::streaming::be_u16, Protocol::Udp)(bytes),
537
            421 => nom::combinator::map(
538
                nom::combinator::map_opt(
539
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
540
                    |s| Multihash::from_bytes(From::from(s)).ok(),
541
                ),
542
                Protocol::P2p,
543
            )(bytes),
544
            448 => Ok((bytes, Protocol::Tls)),
545
            460 => Ok((bytes, Protocol::Quic)),
546
            477 => Ok((bytes, Protocol::Ws)),
547
            478 => Ok((bytes, Protocol::Wss)),
548
            // TODO: unclear what the /memory payload is, see https://github.com/multiformats/multiaddr/issues/127
549
            777 => nom::combinator::map(nom::number::streaming::be_u64, Protocol::Memory)(bytes),
550
            280 => Ok((bytes, Protocol::WebRtcDirect)),
551
            466 => nom::combinator::map(
552
                nom::combinator::map_opt(
553
                    nom::multi::length_data(crate::util::leb128::nom_leb128_usize),
554
                    |s| Multihash::from_bytes(From::from(s)).ok(),
555
                ),
556
                Protocol::Certhash,
557
            )(bytes),
558
            _ => Err(nom::Err::Error(nom::error::make_error(
559
                bytes,
560
                nom::error::ErrorKind::Tag,
561
            ))),
562
        }
563
104
    })(bytes)
564
104
}
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECsDDUKWWCHAU_18smoldot_light_wasm
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECsih6EgvAwZF2_13smoldot_light
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EEB6_
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECsiLzmwikkc22_14json_rpc_basic
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECsiUjFBJteJ7x_17smoldot_full_node
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECscDgN54JpMGG_6author
Unexecuted instantiation: _RINvNtNtCseuYC0Zibziv_7smoldot6libp2p9multiaddr8protocolRShINtNtCs6ga8gEqbpRc_3nom5error5ErrorBS_EECsibGXYHQB8Ea_25json_rpc_general_requests
565
566
#[cfg(test)]
567
mod tests {
568
    use super::Multiaddr;
569
570
    #[test]
571
1
    fn basic() {
572
13
        fn check_valid(addr: &str) {
573
13
            let parsed = addr.parse::<Multiaddr>().unwrap();
574
13
            assert_eq!(parsed.to_string(), addr, 
"{}"0
, addr);
575
13
            assert_eq!(
576
13
                Multiaddr::from_bytes(parsed.as_ref().to_vec()).unwrap(),
577
1
                parsed,
578
1
                
"{}"0
,
579
1
                addr
580
1
            );
581
13
        }
582
1
583
11
        fn check_invalid(addr: &str) {
584
11
            assert!(addr.parse::<Multiaddr>().is_err(), "{}", addr);
585
11
        }
586
1
587
1
        check_valid("");
588
1
        check_valid("/ip4/1.2.3.4/tcp/30333");
589
1
        check_valid(
590
1
            "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN",
591
1
        );
592
1
        check_valid("/ip6/::/udp/30333");
593
1
        check_valid("/ip6/::1/udp/30333/tls");
594
1
        check_valid("/ip6/::1/udp/30333/tls/ws");
595
1
        check_valid("/tcp/65535/udp/65535/ws/tls/wss");
596
1
        check_valid("/dns/0.0.0.0");
597
1
        check_valid("/dns4/example.com./tcp/55");
598
1
        check_valid("/dns6//tcp/55");
599
1
        check_valid("/dnsaddr/./tcp/55");
600
1
        check_valid("/memory/1234567890");
601
1
        check_valid("/webrtc-direct");
602
1
        // TODO: example valid /certhash
603
1
604
1
        check_invalid("/");
605
1
        check_invalid("ip4/1.2.3.4");
606
1
        check_invalid("/nonexistingprotocol");
607
1
        check_invalid("/ip4/1.1.1");
608
1
        check_invalid("/ip6/:::");
609
1
        check_invalid("/ws/1.2.3.4");
610
1
        check_invalid("/tcp/65536");
611
1
        check_invalid("/p2p/blablabla");
612
1
        check_invalid("/webrtc-direct/2");
613
1
        check_invalid("/certhash");
614
1
        check_invalid("/certhash/12D3KooWDpJ7As7BWAwRMfu1VU2WCqNjvq387JEYKDBj4kx6nXTN");
615
1
    }
616
}