pub trait TryFrom<T>: Sized {
type Error;
// Required method
fn try_from(value: T) -> Result<Self, Self::Error>;
}
Expand description
Simple and safe type conversions that may fail in a controlled
way under some circumstances. It is the reciprocal of TryInto
.
This is useful when you are doing a type conversion that may
trivially succeed but may also need special handling.
For example, there is no way to convert an i64
into an i32
using the From
trait, because an i64
may contain a value
that an i32
cannot represent and so the conversion would lose data.
This might be handled by truncating the i64
to an i32
or by
simply returning i32::MAX
, or by some other method. The From
trait is intended for perfect conversions, so the TryFrom
trait
informs the programmer when a type conversion could go bad and lets
them decide how to handle it.
§Generic Implementations
TryFrom<T> for U
impliesTryInto
<U> for T
try_from
is reflexive, which means thatTryFrom<T> for T
is implemented and cannot fail – the associatedError
type for callingT::try_from()
on a value of typeT
isInfallible
. When the!
type is stabilizedInfallible
and!
will be equivalent.
TryFrom<T>
can be implemented as follows:
struct GreaterThanZero(i32);
impl TryFrom<i32> for GreaterThanZero {
type Error = &'static str;
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value <= 0 {
Err("GreaterThanZero only accepts values greater than zero!")
} else {
Ok(GreaterThanZero(value))
}
}
}
§Examples
As described, i32
implements TryFrom<
i64
>
:
let big_number = 1_000_000_000_000i64;
// Silently truncates `big_number`, requires detecting
// and handling the truncation after the fact.
let smaller_number = big_number as i32;
assert_eq!(smaller_number, -727379968);
// Returns an error because `big_number` is too big to
// fit in an `i32`.
let try_smaller_number = i32::try_from(big_number);
assert!(try_smaller_number.is_err());
// Returns `Ok(3)`.
let try_successful_smaller_number = i32::try_from(3);
assert!(try_successful_smaller_number.is_ok());
Required Associated Types§
Required Methods§
Object Safety§
Implementors§
source§impl TryFrom<&String> for http::uri::path::PathAndQuery
impl TryFrom<&String> for http::uri::path::PathAndQuery
type Error = InvalidUri
§impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::ecdsa::Signature::{constant#0}, (SignatureTag, EcdsaTag)>
impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::ecdsa::Signature::{constant#0}, (SignatureTag, EcdsaTag)>
§impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::ed25519::Signature::{constant#0}, (SignatureTag, Ed25519Tag)>
impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::ed25519::Signature::{constant#0}, (SignatureTag, Ed25519Tag)>
§impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::sr25519::Signature::{constant#0}, (SignatureTag, Sr25519Tag)>
impl TryFrom<MultiSignature> for CryptoBytes<sp_core::::sr25519::Signature::{constant#0}, (SignatureTag, Sr25519Tag)>
§impl TryFrom<MultiSigner> for CryptoBytes<sp_core::::ecdsa::Public::{constant#0}, (PublicTag, EcdsaTag)>
impl TryFrom<MultiSigner> for CryptoBytes<sp_core::::ecdsa::Public::{constant#0}, (PublicTag, EcdsaTag)>
§impl TryFrom<MultiSigner> for CryptoBytes<sp_core::::ed25519::Public::{constant#0}, (PublicTag, Ed25519Tag)>
impl TryFrom<MultiSigner> for CryptoBytes<sp_core::::ed25519::Public::{constant#0}, (PublicTag, Ed25519Tag)>
§impl TryFrom<SocketAddr> for Authority
impl TryFrom<SocketAddr> for Authority
1.59.0 · source§impl TryFrom<char> for u8
impl TryFrom<char> for u8
Maps a char
with code point in U+0000..=U+00FF to a byte in 0x00..=0xFF with same value,
failing if the code point is greater than U+00FF.
See impl From<u8> for char
for details on the encoding.
type Error = TryFromCharError
1.74.0 · source§impl TryFrom<char> for u16
impl TryFrom<char> for u16
Maps a char
with code point in U+0000..=U+FFFF to a u16
in 0x0000..=0xFFFF with same value,
failing if the code point is greater than U+FFFF.
This corresponds to the UCS-2 encoding, as specified in ISO/IEC 10646:2003.
type Error = TryFromCharError
source§impl TryFrom<u16> for http::status::StatusCode
impl TryFrom<u16> for http::status::StatusCode
type Error = InvalidStatusCode
source§impl TryFrom<StoredMessage> for UserMessage
impl TryFrom<StoredMessage> for UserMessage
source§impl TryFrom<StoredMessage> for UserStoredMessage
impl TryFrom<StoredMessage> for UserStoredMessage
source§impl TryFrom<UserMessage> for UserStoredMessage
impl TryFrom<UserMessage> for UserStoredMessage
§impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
§impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
§impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
impl TryFrom<Vec<u8>> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
source§impl TryFrom<Vec<u8>> for http::header::name::HeaderName
impl TryFrom<Vec<u8>> for http::header::name::HeaderName
type Error = InvalidHeaderName
source§impl TryFrom<Vec<u8>> for http::header::value::HeaderValue
impl TryFrom<Vec<u8>> for http::header::value::HeaderValue
type Error = InvalidHeaderValue
source§impl TryFrom<String> for http::header::name::HeaderName
impl TryFrom<String> for http::header::name::HeaderName
type Error = InvalidHeaderName
source§impl TryFrom<String> for http::header::value::HeaderValue
impl TryFrom<String> for http::header::value::HeaderValue
type Error = InvalidHeaderValue
source§impl TryFrom<String> for http::uri::path::PathAndQuery
impl TryFrom<String> for http::uri::path::PathAndQuery
type Error = InvalidUri
§impl TryFrom<PlainMessage> for Message
impl TryFrom<PlainMessage> for Message
Parses a plaintext message into a well-typed [Message
].
A [PlainMessage
] must contain plaintext content. Encrypted content should be stored in an
[OpaqueMessage
] and decrypted before being stored into a [PlainMessage
].
source§impl<'a> TryFrom<&'a str> for LimitedStr<'a>
impl<'a> TryFrom<&'a str> for LimitedStr<'a>
type Error = LimitedStrTryFromError
source§impl<'a> TryFrom<&'a str> for http::header::name::HeaderName
impl<'a> TryFrom<&'a str> for http::header::name::HeaderName
type Error = InvalidHeaderName
source§impl<'a> TryFrom<&'a str> for http::header::value::HeaderValue
impl<'a> TryFrom<&'a str> for http::header::value::HeaderValue
type Error = InvalidHeaderValue
source§impl<'a> TryFrom<&'a str> for http::status::StatusCode
impl<'a> TryFrom<&'a str> for http::status::StatusCode
type Error = InvalidStatusCode
source§impl<'a> TryFrom<&'a str> for http::uri::path::PathAndQuery
impl<'a> TryFrom<&'a str> for http::uri::path::PathAndQuery
type Error = InvalidUri
§impl<'a> TryFrom<&'a str> for ServerName<'a>
impl<'a> TryFrom<&'a str> for ServerName<'a>
Attempt to make a ServerName from a string by parsing as a DNS name or IP address.
source§impl<'a> TryFrom<&'a String> for http::header::name::HeaderName
impl<'a> TryFrom<&'a String> for http::header::name::HeaderName
type Error = InvalidHeaderName
source§impl<'a> TryFrom<&'a String> for http::header::value::HeaderValue
impl<'a> TryFrom<&'a String> for http::header::value::HeaderValue
type Error = InvalidHeaderValue
§impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::ecdsa::AppSignature
§impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::ed25519::AppSignature
§impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
impl<'a> TryFrom<&'a [u8]> for gclient::ext::sp_runtime::app_crypto::sr25519::AppSignature
source§impl<'a> TryFrom<&'a [u8]> for http::header::name::HeaderName
impl<'a> TryFrom<&'a [u8]> for http::header::name::HeaderName
type Error = InvalidHeaderName
source§impl<'a> TryFrom<&'a [u8]> for http::header::value::HeaderValue
impl<'a> TryFrom<&'a [u8]> for http::header::value::HeaderValue
type Error = InvalidHeaderValue
source§impl<'a> TryFrom<&'a [u8]> for http::status::StatusCode
impl<'a> TryFrom<&'a [u8]> for http::status::StatusCode
type Error = InvalidStatusCode
source§impl<'a> TryFrom<&'a [u8]> for http::uri::path::PathAndQuery
impl<'a> TryFrom<&'a [u8]> for http::uri::path::PathAndQuery
type Error = InvalidUri
source§impl<'a> TryFrom<Vec<u8>> for http::uri::path::PathAndQuery
impl<'a> TryFrom<Vec<u8>> for http::uri::path::PathAndQuery
type Error = InvalidUri
source§impl<'a, K, V, T> TryFrom<&'a HashMap<K, V>> for http::header::map::HeaderMap<T>
impl<'a, K, V, T> TryFrom<&'a HashMap<K, V>> for http::header::map::HeaderMap<T>
Try to convert a HashMap
into a HeaderMap
.
§Examples
use std::collections::HashMap;
use std::convert::TryInto;
use http::HeaderMap;
let mut map = HashMap::new();
map.insert("X-Custom-Header".to_string(), "my value".to_string());
let headers: HeaderMap = (&map).try_into().expect("valid headers");
assert_eq!(headers["X-Custom-Header"], "my value");
§impl<'a, K, V, T> TryFrom<&'a HashMap<K, V>> for HeaderMap<T>
impl<'a, K, V, T> TryFrom<&'a HashMap<K, V>> for HeaderMap<T>
Try to convert a HashMap
into a HeaderMap
.
§Examples
use std::collections::HashMap;
use std::convert::TryInto;
use http::HeaderMap;
let mut map = HashMap::new();
map.insert("X-Custom-Header".to_string(), "my value".to_string());
let headers: HeaderMap = (&map).try_into().expect("valid headers");
assert_eq!(headers["X-Custom-Header"], "my value");
§impl<'a, T, O> TryFrom<&'a [T]> for &'a BitSlice<T, O>where
T: BitStore,
O: BitOrder,
impl<'a, T, O> TryFrom<&'a [T]> for &'a BitSlice<T, O>where
T: BitStore,
O: BitOrder,
Calls BitSlice::try_from_slice
, but returns the original Rust slice on
error instead of the failure event.
This only fails if slice.len()
exceeds BitSlice::MAX_ELTS
.
§impl<'a, T, O> TryFrom<&'a mut [T]> for &'a mut BitSlice<T, O>where
T: BitStore,
O: BitOrder,
impl<'a, T, O> TryFrom<&'a mut [T]> for &'a mut BitSlice<T, O>where
T: BitStore,
O: BitOrder,
Calls BitSlice::try_from_slice_mut
, but returns the original Rust slice
on error instead of the failure event.
This only fails if slice.len()
exceeds BitSlice::MAX_ELTS
.
1.34.0 · source§impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]
impl<'a, T, const N: usize> TryFrom<&'a [T]> for &'a [T; N]
Tries to create an array ref &[T; N]
from a slice ref &[T]
. Succeeds if
slice.len() == N
.
let bytes: [u8; 3] = [1, 0, 2];
let bytes_head: &[u8; 2] = <&[u8; 2]>::try_from(&bytes[0..2]).unwrap();
assert_eq!(1, u16::from_le_bytes(*bytes_head));
let bytes_tail: &[u8; 2] = bytes[1..3].try_into().unwrap();
assert_eq!(512, u16::from_le_bytes(*bytes_tail));
type Error = TryFromSliceError
1.34.0 · source§impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]
impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N]
Tries to create a mutable array ref &mut [T; N]
from a mutable slice ref
&mut [T]
. Succeeds if slice.len() == N
.
let mut bytes: [u8; 3] = [1, 0, 2];
let bytes_head: &mut [u8; 2] = <&mut [u8; 2]>::try_from(&mut bytes[0..2]).unwrap();
assert_eq!(1, u16::from_le_bytes(*bytes_head));
let bytes_tail: &mut [u8; 2] = (&mut bytes[1..3]).try_into().unwrap();
assert_eq!(512, u16::from_le_bytes(*bytes_tail));
type Error = TryFromSliceError
source§impl<'a, const CAP: usize> TryFrom<&'a str> for ArrayString<CAP>
impl<'a, const CAP: usize> TryFrom<&'a str> for ArrayString<CAP>
type Error = CapacityError<&'a str>
source§impl<'a, const CAP: usize> TryFrom<Arguments<'a>> for ArrayString<CAP>
impl<'a, const CAP: usize> TryFrom<Arguments<'a>> for ArrayString<CAP>
type Error = CapacityError<Error>
§impl<A, O> TryFrom<&BitSlice<<A as BitView>::Store, O>> for &BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
impl<A, O> TryFrom<&BitSlice<<A as BitView>::Store, O>> for &BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
§impl<A, O> TryFrom<&BitSlice<<A as BitView>::Store, O>> for BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
impl<A, O> TryFrom<&BitSlice<<A as BitView>::Store, O>> for BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
§impl<A, O> TryFrom<&mut BitSlice<<A as BitView>::Store, O>> for &mut BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
impl<A, O> TryFrom<&mut BitSlice<<A as BitView>::Store, O>> for &mut BitArray<A, O>where
A: BitViewSized,
O: BitOrder,
source§impl<BlockNumber> TryFrom<Program<BlockNumber>> for ActiveProgram<BlockNumber>where
BlockNumber: Copy,
impl<BlockNumber> TryFrom<Program<BlockNumber>> for ActiveProgram<BlockNumber>where
BlockNumber: Copy,
type Error = InactiveProgramError
§impl<K, V, S> TryFrom<BTreeMap<K, V>> for BoundedBTreeMap<K, V, S>
impl<K, V, S> TryFrom<BTreeMap<K, V>> for BoundedBTreeMap<K, V, S>
§impl<T> TryFrom<RangeInclusive<T>> for Interval<T>where
T: Numerated,
impl<T> TryFrom<RangeInclusive<T>> for Interval<T>where
T: Numerated,
§impl<T> TryFrom<RangeInclusive<T>> for IntervalIterator<T>where
T: Numerated,
impl<T> TryFrom<RangeInclusive<T>> for IntervalIterator<T>where
T: Numerated,
1.43.0 · source§impl<T, A, const N: usize> TryFrom<Arc<[T], A>> for Arc<[T; N], A>where
A: Allocator,
impl<T, A, const N: usize> TryFrom<Arc<[T], A>> for Arc<[T; N], A>where
A: Allocator,
§impl<T, D> TryFrom<u128> for TypeWithDefault<T, D>
impl<T, D> TryFrom<u128> for TypeWithDefault<T, D>
§impl<T, D> TryFrom<usize> for TypeWithDefault<T, D>
impl<T, D> TryFrom<usize> for TypeWithDefault<T, D>
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for u8
impl<T, D> TryFrom<TypeWithDefault<T, D>> for u8
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for u16
impl<T, D> TryFrom<TypeWithDefault<T, D>> for u16
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for u32
impl<T, D> TryFrom<TypeWithDefault<T, D>> for u32
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for u64
impl<T, D> TryFrom<TypeWithDefault<T, D>> for u64
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for u128
impl<T, D> TryFrom<TypeWithDefault<T, D>> for u128
§impl<T, D> TryFrom<TypeWithDefault<T, D>> for usize
impl<T, D> TryFrom<TypeWithDefault<T, D>> for usize
§impl<T, I> TryFrom<Range<I>> for Interval<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
impl<T, I> TryFrom<Range<I>> for Interval<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
§impl<T, I> TryFrom<Range<I>> for IntervalIterator<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
impl<T, I> TryFrom<Range<I>> for IntervalIterator<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
§impl<T, I> TryFrom<RangeFrom<I>> for Interval<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
impl<T, I> TryFrom<RangeFrom<I>> for Interval<T>where
T: Numerated + UpperBounded,
I: Into<<T as Numerated>::Bound>,
§impl<T, S> TryFrom<BTreeSet<T>> for BoundedBTreeSet<T, S>
impl<T, S> TryFrom<BTreeSet<T>> for BoundedBTreeSet<T, S>
§impl<T, S, E> TryFrom<(S, E)> for Interval<T>where
T: Numerated + UpperBounded,
S: Into<<T as Numerated>::Bound>,
E: Into<<T as Numerated>::Bound>,
impl<T, S, E> TryFrom<(S, E)> for Interval<T>where
T: Numerated + UpperBounded,
S: Into<<T as Numerated>::Bound>,
E: Into<<T as Numerated>::Bound>,
§impl<T, S, E> TryFrom<(S, E)> for IntervalIterator<T>where
T: Numerated + UpperBounded,
S: Into<<T as Numerated>::Bound>,
E: Into<<T as Numerated>::Bound>,
impl<T, S, E> TryFrom<(S, E)> for IntervalIterator<T>where
T: Numerated + UpperBounded,
S: Into<<T as Numerated>::Bound>,
E: Into<<T as Numerated>::Bound>,
source§impl<T, const CAP: usize> TryFrom<&[T]> for arrayvec::arrayvec::ArrayVec<T, CAP>where
T: Clone,
impl<T, const CAP: usize> TryFrom<&[T]> for arrayvec::arrayvec::ArrayVec<T, CAP>where
T: Clone,
Try to create an ArrayVec
from a slice. This will return an error if the slice was too big to
fit.
use arrayvec::ArrayVec;
use std::convert::TryInto as _;
let array: ArrayVec<_, 4> = (&[1, 2, 3] as &[_]).try_into().unwrap();
assert_eq!(array.len(), 3);
assert_eq!(array.capacity(), 4);
type Error = CapacityError
1.34.0 · source§impl<T, const N: usize> TryFrom<&[T]> for [T; N]where
T: Copy,
impl<T, const N: usize> TryFrom<&[T]> for [T; N]where
T: Copy,
Tries to create an array [T; N]
by copying from a slice &[T]
. Succeeds if
slice.len() == N
.
let bytes: [u8; 3] = [1, 0, 2];
let bytes_head: [u8; 2] = <[u8; 2]>::try_from(&bytes[0..2]).unwrap();
assert_eq!(1, u16::from_le_bytes(bytes_head));
let bytes_tail: [u8; 2] = bytes[1..3].try_into().unwrap();
assert_eq!(512, u16::from_le_bytes(bytes_tail));
type Error = TryFromSliceError
1.59.0 · source§impl<T, const N: usize> TryFrom<&mut [T]> for [T; N]where
T: Copy,
impl<T, const N: usize> TryFrom<&mut [T]> for [T; N]where
T: Copy,
Tries to create an array [T; N]
by copying from a mutable slice &mut [T]
.
Succeeds if slice.len() == N
.
let mut bytes: [u8; 3] = [1, 0, 2];
let bytes_head: [u8; 2] = <[u8; 2]>::try_from(&mut bytes[0..2]).unwrap();
assert_eq!(1, u16::from_le_bytes(bytes_head));
let bytes_tail: [u8; 2] = (&mut bytes[1..3]).try_into().unwrap();
assert_eq!(512, u16::from_le_bytes(bytes_tail));