// These links overwrite the ones in `README.md`
// to become proper intra-doc links in Rust docs.
//! [`From`]: macro@crate::From
//! [`Into`]: macro@crate::Into
//! [`FromStr`]: macro@crate::FromStr
//! [`TryFrom`]: macro@crate::TryFrom
//! [`TryInto`]: macro@crate::TryInto
//! [`IntoIterator`]: macro@crate::IntoIterator
//! [`AsRef`]: macro@crate::AsRef
//!
//! [`Debug`]: macro@crate::Debug
//! [`Display`-like]: macro@crate::Display
//!
//! [`Error`]: macro@crate::Error
//!
//! [`Index`]: macro@crate::Index
//! [`Deref`]: macro@crate::Deref
//! [`Not`-like]: macro@crate::Not
//! [`Add`-like]: macro@crate::Add
//! [`Mul`-like]: macro@crate::Mul
//! [`Sum`-like]: macro@crate::Sum
//! [`IndexMut`]: macro@crate::IndexMut
//! [`DerefMut`]: macro@crate::DerefMut
//! [`AddAssign`-like]: macro@crate::AddAssign
//! [`MulAssign`-like]: macro@crate::MulAssign
//!
//! [`Constructor`]: macro@crate::Constructor
//! [`IsVariant`]: macro@crate::IsVariant
//! [`Unwrap`]: macro@crate::Unwrap
//! [`TryUnwrap`]: macro@crate::TryUnwrap
// The README includes doctests requiring these features. To make sure that
// tests pass when not all features are provided we exclude it when the
// required features are not available.
#![cfg_attr(
all(
feature =
"add",
feature =
"display",
feature =
"from",
feature =
"into"
),
doc = include_str!(
"../README.md")
)]
#![cfg_attr(not(feature =
"std"), no_std)]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#![cfg_attr(any(not(docsrs), ci), deny(rustdoc::all))]
#![forbid(non_ascii_idents, unsafe_code)]
#![warn(clippy::nonstandard_macro_braces)]
// For macro expansion internals only.
// Ensures better hygiene in case a local crate `core` is present in workspace of the user code,
// or some other crate is renamed as `core`.
#[doc(hidden)]
pub use core;
// Not public, but exported API. For macro expansion internals only.
#[doc(hidden)]
pub mod __private {
#[cfg(feature =
"as_ref")]
pub use crate::r
#as::{Conv, ExtractRef};
#[cfg(feature =
"debug")]
pub use crate::fmt::{debug_tuple, DebugTuple};
#[cfg(feature =
"error")]
pub use crate::vendor::thiserror::aserror::AsDynError;
}
// The modules containing error types and other helpers.
#[cfg(feature =
"add")]
mod add;
#[cfg(feature =
"add")]
pub use crate::add::{BinaryError, WrongVariantError};
#[cfg(any(feature =
"add", feature =
"not"))]
mod ops;
#[cfg(any(feature =
"add", feature =
"not"))]
pub use crate::ops::UnitError;
#[cfg(feature =
"as_ref")]
mod r
#as;
#[cfg(feature =
"debug")]
mod fmt;
#[cfg(feature =
"error")]
mod vendor;
#[cfg(feature =
"from_str")]
mod r
#str;
#[cfg(feature =
"from_str")]
#[doc(inline)]
pub use crate::r
#str::FromStrError;
#[cfg(any(feature =
"try_into", feature =
"try_from"))]
mod convert;
#[cfg(feature =
"try_from")]
#[doc(inline)]
pub use crate::convert::TryFromReprError;
#[cfg(feature =
"try_into")]
#[doc(inline)]
pub use crate::convert::TryIntoError;
#[cfg(feature =
"try_unwrap")]
mod try_unwrap;
#[cfg(feature =
"try_unwrap")]
#[doc(inline)]
pub use crate::try_unwrap::TryUnwrapError;
// This can be unused if no feature is enabled. We already error in that case, but this warning
// distracts from that error. So we suppress the warning.
#[allow(unused_imports)]
#[doc(inline)]
pub use derive_more_impl::*;
/// Module containing derive definitions only, without their corresponding traits.
///
/// Use it in your import paths, if you don't want to import traits, but only macros.
pub mod derive {
// This can be unused if no feature is enabled. We already error in that case, but this warning
// distracts from that error. So we suppress the warning.
#[allow(unused_imports)]
#[doc(inline)]
pub use derive_more_impl::*;
}
/// Module containing derive definitions with their corresponding traits along.
///
/// Use it in your import paths, if you do want to import derives along with their traits.
pub mod with_trait {
// When re-exporting traits from `std` we need to do a pretty crazy trick, because we ONLY want
// to re-export the traits and not derives that are called the same in the `std` module, because
// those would conflict with our own ones. The way we do this is by first importing both the
// trait and possible derive into a separate module and re-export them. Then, we wildcard-import
// all the things from that module into the main module, but we also import our own derive by
// its exact name. Due to the way wildcard imports work in Rust, that results in our own derive
// taking precedence over any derive from `std`. For some reason the named re-export of our own
// derive cannot be in this (or really any) macro too. It will somehow still consider it a
// wildcard then and will result in this warning `ambiguous_glob_reexports`, and not actually
// exporting of our derive.
macro_rules! re_export_traits((
$feature:literal, $new_module_name:ident, $module:path $(, $traits:ident)* $(,)?) => {
#[cfg(all(feature = $feature, any(not(docsrs), ci)))]
mod $new_module_name {
#[doc(hidden)]
pub use $module::{$($traits),*};
}
#[cfg(all(feature = $feature, any(not(docsrs), ci)))]
#[doc(hidden)]
pub use crate::with_trait::all_traits_and_derives::$new_module_name::*;
}
);
mod all_traits_and_derives {
re_export_traits!(
"add",
add_traits,
core::ops,
Add,
BitAnd,
BitOr,
BitXor,
Sub,
);
re_export_traits!(
"add_assign",
add_assign_traits,
core::ops,
AddAssign,
BitAndAssign,
BitOrAssign,
BitXorAssign,
SubAssign,
);
re_export_traits!(
"as_ref", as_ref_traits, core::convert, AsMut, AsRef);
re_export_traits!(
"debug", debug_traits, core::fmt, Debug);
re_export_traits!(
"deref", deref_traits, core::ops, Deref);
re_export_traits!(
"deref_mut", deref_mut_traits, core::ops, DerefMut);
re_export_traits!(
"display",
display_traits,
core::fmt,
Binary,
Display,
LowerExp,
LowerHex,
Octal,
Pointer,
UpperExp,
UpperHex,
);
#[cfg(not(feature =
"std"))]
re_export_traits!(
"error", error_traits, core::error, Error);
#[cfg(feature =
"std")]
re_export_traits!(
"error", error_traits, std::error, Error);
re_export_traits!(
"from", from_traits, core::convert, From);
re_export_traits!(
"from_str", from_str_traits, core::str, FromStr);
re_export_traits!(
"index", index_traits, core::ops, Index);
re_export_traits!(
"index_mut", index_mut_traits, core::ops, IndexMut);
re_export_traits!(
"into", into_traits, core::convert, Into);
re_export_traits!(
"into_iterator",
into_iterator_traits,
core::iter,
IntoIterator,
);
re_export_traits!(
"mul", mul_traits, core::ops, Div, Mul, Rem, Shl, Shr);
#[cfg(feature =
"mul_assign")]
re_export_traits!(
"mul_assign",
mul_assign_traits,
core::ops,
DivAssign,
MulAssign,
RemAssign,
ShlAssign,
ShrAssign,
);
re_export_traits!(
"not", not_traits, core::ops, Neg, Not);
re_export_traits!(
"sum", sum_traits, core::iter, Product, Sum);
re_export_traits!(
"try_from", try_from_traits, core::convert, TryFrom);
re_export_traits!(
"try_into", try_into_traits, core::convert, TryInto);
// Now re-export our own derives by their exact name to overwrite any derives that the trait
// re-exporting might inadvertently pull into scope.
#[cfg(feature =
"add")]
pub use derive_more_impl::{Add, BitAnd, BitOr, BitXor, Sub};
#[cfg(feature =
"add_assign")]
pub use derive_more_impl::{
AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign,
};
#[cfg(feature =
"as_ref")]
pub use derive_more_impl::{AsMut, AsRef};
#[cfg(feature =
"constructor")]
pub use derive_more_impl::Constructor;
#[cfg(feature =
"debug")]
pub use derive_more_impl::Debug;
#[cfg(feature =
"deref")]
pub use derive_more_impl::Deref;
#[cfg(feature =
"deref_mut")]
pub use derive_more_impl::DerefMut;
#[cfg(feature =
"display")]
pub use derive_more_impl::{
Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex,
};
#[cfg(feature =
"error")]
pub use derive_more_impl::Error;
#[cfg(feature =
"from")]
pub use derive_more_impl::From;
#[cfg(feature =
"from_str")]
pub use derive_more_impl::FromStr;
#[cfg(feature =
"index")]
pub use derive_more_impl::Index;
#[cfg(feature =
"index_mut")]
pub use derive_more_impl::IndexMut;
#[cfg(feature =
"into")]
pub use derive_more_impl::Into;
#[cfg(feature =
"into_iterator")]
pub use derive_more_impl::IntoIterator;
#[cfg(feature =
"is_variant")]
pub use derive_more_impl::IsVariant;
#[cfg(feature =
"mul")]
pub use derive_more_impl::{Div, Mul, Rem, Shl, Shr};
#[cfg(feature =
"mul_assign")]
pub use derive_more_impl::{
DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign,
};
#[cfg(feature =
"not")]
pub use derive_more_impl::{Neg, Not};
#[cfg(feature =
"sum")]
pub use derive_more_impl::{Product, Sum};
#[cfg(feature =
"try_from")]
pub use derive_more_impl::TryFrom;
#[cfg(feature =
"try_into")]
pub use derive_more_impl::TryInto;
#[cfg(feature =
"try_unwrap")]
pub use derive_more_impl::TryUnwrap;
#[cfg(feature =
"unwrap")]
pub use derive_more_impl::Unwrap;
}
// Now re-export our own derives and the std traits by their exact name to make rust-analyzer
// recognize the #[doc(hidden)] flag.
// See issues:
// 1. https://github.com/rust-lang/rust-analyzer/issues/11698
// 2. https://github.com/rust-lang/rust-analyzer/issues/14079
#[cfg(feature =
"add")]
#[doc(hidden)]
pub use all_traits_and_derives::{Add, BitAnd, BitOr, BitXor, Sub};
#[cfg(feature =
"add_assign")]
#[doc(hidden)]
pub use all_traits_and_derives::{
AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign,
};
#[cfg(feature =
"as_ref")]
#[doc(hidden)]
pub use all_traits_and_derives::{AsMut, AsRef};
#[cfg(feature =
"constructor")]
#[doc(hidden)]
pub use all_traits_and_derives::Constructor;
#[cfg(feature =
"debug")]
#[doc(hidden)]
pub use all_traits_and_derives::Debug;
#[cfg(feature =
"deref")]
#[doc(hidden)]
pub use all_traits_and_derives::Deref;
#[cfg(feature =
"deref_mut")]
#[doc(hidden)]
pub use all_traits_and_derives::DerefMut;
#[cfg(feature =
"display")]
#[doc(hidden)]
pub use all_traits_and_derives::{
Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex,
};
#[cfg(feature =
"error")]
#[doc(hidden)]
pub use all_traits_and_derives::Error;
#[cfg(feature =
"from")]
#[doc(hidden)]
pub use all_traits_and_derives::From;
#[cfg(feature =
"from_str")]
#[doc(hidden)]
pub use all_traits_and_derives::FromStr;
#[cfg(feature =
"index")]
#[doc(hidden)]
pub use all_traits_and_derives::Index;
#[cfg(feature =
"index_mut")]
#[doc(hidden)]
pub use all_traits_and_derives::IndexMut;
#[cfg(feature =
"into")]
#[doc(hidden)]
pub use all_traits_and_derives::Into;
#[cfg(feature =
"into_iterator")]
#[doc(hidden)]
pub use all_traits_and_derives::IntoIterator;
#[cfg(feature =
"is_variant")]
#[doc(hidden)]
pub use all_traits_and_derives::IsVariant;
#[cfg(feature =
"mul")]
#[doc(hidden)]
pub use all_traits_and_derives::{Div, Mul, Rem, Shl, Shr};
#[cfg(feature =
"mul_assign")]
#[doc(hidden)]
pub use all_traits_and_derives::{
DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign,
};
#[cfg(feature =
"not")]
#[doc(hidden)]
pub use all_traits_and_derives::{Neg, Not};
#[cfg(feature =
"sum")]
#[doc(hidden)]
pub use all_traits_and_derives::{Product, Sum};
#[cfg(feature =
"try_from")]
#[doc(hidden)]
pub use all_traits_and_derives::TryFrom;
#[cfg(feature =
"try_into")]
#[doc(hidden)]
pub use all_traits_and_derives::TryInto;
#[cfg(feature =
"try_unwrap")]
#[doc(hidden)]
pub use all_traits_and_derives::TryUnwrap;
#[cfg(feature =
"unwrap")]
#[doc(hidden)]
pub use all_traits_and_derives::Unwrap;
// Re-export the derive macros again to show docs for our derives (but not for traits). This is
// done using a glob import to not hit E0252.
#[allow(unused_imports)]
pub use derive_more_impl::*;
}
// Check if any feature is enabled
#[cfg(not(any(
feature =
"full",
feature =
"add",
feature =
"add_assign",
feature =
"as_ref",
feature =
"constructor",
feature =
"debug",
feature =
"deref",
feature =
"deref_mut",
feature =
"display",
feature =
"error",
feature =
"from",
feature =
"from_str",
feature =
"index",
feature =
"index_mut",
feature =
"into",
feature =
"into_iterator",
feature =
"is_variant",
feature =
"mul",
feature =
"mul_assign",
feature =
"not",
feature =
"sum",
feature =
"try_from",
feature =
"try_into",
feature =
"try_unwrap",
feature =
"unwrap",
)))]
compile_error!(
"at least one derive feature must be enabled (or the \"full\
" feature enabling all the derives)"
);