1 | // These links overwrite the ones in `README.md` |
2 | // to become proper intra-doc links in Rust docs. |
3 | //! [`From`]: macro@crate::From |
4 | //! [`Into`]: macro@crate::Into |
5 | //! [`FromStr`]: macro@crate::FromStr |
6 | //! [`TryFrom`]: macro@crate::TryFrom |
7 | //! [`TryInto`]: macro@crate::TryInto |
8 | //! [`IntoIterator`]: macro@crate::IntoIterator |
9 | //! [`AsRef`]: macro@crate::AsRef |
10 | //! |
11 | //! [`Debug`]: macro@crate::Debug |
12 | //! [`Display`-like]: macro@crate::Display |
13 | //! |
14 | //! [`Error`]: macro@crate::Error |
15 | //! |
16 | //! [`Index`]: macro@crate::Index |
17 | //! [`Deref`]: macro@crate::Deref |
18 | //! [`Not`-like]: macro@crate::Not |
19 | //! [`Add`-like]: macro@crate::Add |
20 | //! [`Mul`-like]: macro@crate::Mul |
21 | //! [`Sum`-like]: macro@crate::Sum |
22 | //! [`IndexMut`]: macro@crate::IndexMut |
23 | //! [`DerefMut`]: macro@crate::DerefMut |
24 | //! [`AddAssign`-like]: macro@crate::AddAssign |
25 | //! [`MulAssign`-like]: macro@crate::MulAssign |
26 | //! |
27 | //! [`Constructor`]: macro@crate::Constructor |
28 | //! [`IsVariant`]: macro@crate::IsVariant |
29 | //! [`Unwrap`]: macro@crate::Unwrap |
30 | //! [`TryUnwrap`]: macro@crate::TryUnwrap |
31 | |
32 | // The README includes doctests requiring these features. To make sure that |
33 | // tests pass when not all features are provided we exclude it when the |
34 | // required features are not available. |
35 | #![cfg_attr ( |
36 | all( |
37 | feature = "add" , |
38 | feature = "display" , |
39 | feature = "from" , |
40 | feature = "into" |
41 | ), |
42 | doc = include_str!("../README.md" ) |
43 | )] |
44 | #![cfg_attr (not(feature = "std" ), no_std)] |
45 | #![cfg_attr (docsrs, feature(doc_auto_cfg))] |
46 | #![cfg_attr (any(not(docsrs), ci), deny(rustdoc::all))] |
47 | #![forbid (non_ascii_idents, unsafe_code)] |
48 | #![warn (clippy::nonstandard_macro_braces)] |
49 | |
50 | // For macro expansion internals only. |
51 | // Ensures better hygiene in case a local crate `core` is present in workspace of the user code, |
52 | // or some other crate is renamed as `core`. |
53 | #[doc (hidden)] |
54 | pub use core; |
55 | |
56 | // Not public, but exported API. For macro expansion internals only. |
57 | #[doc (hidden)] |
58 | pub mod __private { |
59 | #[cfg (feature = "as_ref" )] |
60 | pub use crate::r#as::{Conv, ExtractRef}; |
61 | |
62 | #[cfg (feature = "debug" )] |
63 | pub use crate::fmt::{debug_tuple, DebugTuple}; |
64 | |
65 | #[cfg (feature = "error" )] |
66 | pub use crate::vendor::thiserror::aserror::AsDynError; |
67 | } |
68 | |
69 | // The modules containing error types and other helpers. |
70 | |
71 | #[cfg (feature = "add" )] |
72 | mod add; |
73 | #[cfg (feature = "add" )] |
74 | pub use crate::add::{BinaryError, WrongVariantError}; |
75 | |
76 | #[cfg (any(feature = "add" , feature = "not" ))] |
77 | mod ops; |
78 | #[cfg (any(feature = "add" , feature = "not" ))] |
79 | pub use crate::ops::UnitError; |
80 | |
81 | #[cfg (feature = "as_ref" )] |
82 | mod r#as; |
83 | |
84 | #[cfg (feature = "debug" )] |
85 | mod fmt; |
86 | |
87 | #[cfg (feature = "error" )] |
88 | mod vendor; |
89 | |
90 | #[cfg (feature = "from_str" )] |
91 | mod r#str; |
92 | #[cfg (feature = "from_str" )] |
93 | #[doc (inline)] |
94 | pub use crate::r#str::FromStrError; |
95 | |
96 | #[cfg (any(feature = "try_into" , feature = "try_from" ))] |
97 | mod convert; |
98 | #[cfg (feature = "try_from" )] |
99 | #[doc (inline)] |
100 | pub use crate::convert::TryFromReprError; |
101 | #[cfg (feature = "try_into" )] |
102 | #[doc (inline)] |
103 | pub use crate::convert::TryIntoError; |
104 | |
105 | #[cfg (feature = "try_unwrap" )] |
106 | mod try_unwrap; |
107 | #[cfg (feature = "try_unwrap" )] |
108 | #[doc (inline)] |
109 | pub use crate::try_unwrap::TryUnwrapError; |
110 | |
111 | // This can be unused if no feature is enabled. We already error in that case, but this warning |
112 | // distracts from that error. So we suppress the warning. |
113 | #[allow (unused_imports)] |
114 | #[doc (inline)] |
115 | pub use derive_more_impl::*; |
116 | |
117 | /// Module containing derive definitions only, without their corresponding traits. |
118 | /// |
119 | /// Use it in your import paths, if you don't want to import traits, but only macros. |
120 | pub mod derive { |
121 | // This can be unused if no feature is enabled. We already error in that case, but this warning |
122 | // distracts from that error. So we suppress the warning. |
123 | #[allow (unused_imports)] |
124 | #[doc (inline)] |
125 | pub use derive_more_impl::*; |
126 | } |
127 | |
128 | /// Module containing derive definitions with their corresponding traits along. |
129 | /// |
130 | /// Use it in your import paths, if you do want to import derives along with their traits. |
131 | pub mod with_trait { |
132 | // When re-exporting traits from `std` we need to do a pretty crazy trick, because we ONLY want |
133 | // to re-export the traits and not derives that are called the same in the `std` module, because |
134 | // those would conflict with our own ones. The way we do this is by first importing both the |
135 | // trait and possible derive into a separate module and re-export them. Then, we wildcard-import |
136 | // all the things from that module into the main module, but we also import our own derive by |
137 | // its exact name. Due to the way wildcard imports work in Rust, that results in our own derive |
138 | // taking precedence over any derive from `std`. For some reason the named re-export of our own |
139 | // derive cannot be in this (or really any) macro too. It will somehow still consider it a |
140 | // wildcard then and will result in this warning `ambiguous_glob_reexports`, and not actually |
141 | // exporting of our derive. |
142 | macro_rules! re_export_traits(( |
143 | $feature:literal, $new_module_name:ident, $module:path $(, $traits:ident)* $(,)?) => { |
144 | #[cfg(all(feature = $feature, any(not(docsrs), ci)))] |
145 | mod $new_module_name { |
146 | #[doc(hidden)] |
147 | pub use $module::{$($traits),*}; |
148 | } |
149 | |
150 | #[cfg(all(feature = $feature, any(not(docsrs), ci)))] |
151 | #[doc(hidden)] |
152 | pub use crate::with_trait::all_traits_and_derives::$new_module_name::*; |
153 | } |
154 | ); |
155 | |
156 | mod all_traits_and_derives { |
157 | re_export_traits!( |
158 | "add" , |
159 | add_traits, |
160 | core::ops, |
161 | Add, |
162 | BitAnd, |
163 | BitOr, |
164 | BitXor, |
165 | Sub, |
166 | ); |
167 | re_export_traits!( |
168 | "add_assign" , |
169 | add_assign_traits, |
170 | core::ops, |
171 | AddAssign, |
172 | BitAndAssign, |
173 | BitOrAssign, |
174 | BitXorAssign, |
175 | SubAssign, |
176 | ); |
177 | re_export_traits!("as_ref" , as_ref_traits, core::convert, AsMut, AsRef); |
178 | re_export_traits!("debug" , debug_traits, core::fmt, Debug); |
179 | re_export_traits!("deref" , deref_traits, core::ops, Deref); |
180 | re_export_traits!("deref_mut" , deref_mut_traits, core::ops, DerefMut); |
181 | re_export_traits!( |
182 | "display" , |
183 | display_traits, |
184 | core::fmt, |
185 | Binary, |
186 | Display, |
187 | LowerExp, |
188 | LowerHex, |
189 | Octal, |
190 | Pointer, |
191 | UpperExp, |
192 | UpperHex, |
193 | ); |
194 | |
195 | #[cfg (not(feature = "std" ))] |
196 | re_export_traits!("error" , error_traits, core::error, Error); |
197 | #[cfg (feature = "std" )] |
198 | re_export_traits!("error" , error_traits, std::error, Error); |
199 | |
200 | re_export_traits!("from" , from_traits, core::convert, From); |
201 | |
202 | re_export_traits!("from_str" , from_str_traits, core::str, FromStr); |
203 | |
204 | re_export_traits!("index" , index_traits, core::ops, Index); |
205 | |
206 | re_export_traits!("index_mut" , index_mut_traits, core::ops, IndexMut); |
207 | |
208 | re_export_traits!("into" , into_traits, core::convert, Into); |
209 | |
210 | re_export_traits!( |
211 | "into_iterator" , |
212 | into_iterator_traits, |
213 | core::iter, |
214 | IntoIterator, |
215 | ); |
216 | |
217 | re_export_traits!("mul" , mul_traits, core::ops, Div, Mul, Rem, Shl, Shr); |
218 | |
219 | #[cfg (feature = "mul_assign" )] |
220 | re_export_traits!( |
221 | "mul_assign" , |
222 | mul_assign_traits, |
223 | core::ops, |
224 | DivAssign, |
225 | MulAssign, |
226 | RemAssign, |
227 | ShlAssign, |
228 | ShrAssign, |
229 | ); |
230 | |
231 | re_export_traits!("not" , not_traits, core::ops, Neg, Not); |
232 | |
233 | re_export_traits!("sum" , sum_traits, core::iter, Product, Sum); |
234 | |
235 | re_export_traits!("try_from" , try_from_traits, core::convert, TryFrom); |
236 | |
237 | re_export_traits!("try_into" , try_into_traits, core::convert, TryInto); |
238 | |
239 | // Now re-export our own derives by their exact name to overwrite any derives that the trait |
240 | // re-exporting might inadvertently pull into scope. |
241 | #[cfg (feature = "add" )] |
242 | pub use derive_more_impl::{Add, BitAnd, BitOr, BitXor, Sub}; |
243 | |
244 | #[cfg (feature = "add_assign" )] |
245 | pub use derive_more_impl::{ |
246 | AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign, |
247 | }; |
248 | |
249 | #[cfg (feature = "as_ref" )] |
250 | pub use derive_more_impl::{AsMut, AsRef}; |
251 | |
252 | #[cfg (feature = "constructor" )] |
253 | pub use derive_more_impl::Constructor; |
254 | |
255 | #[cfg (feature = "debug" )] |
256 | pub use derive_more_impl::Debug; |
257 | |
258 | #[cfg (feature = "deref" )] |
259 | pub use derive_more_impl::Deref; |
260 | |
261 | #[cfg (feature = "deref_mut" )] |
262 | pub use derive_more_impl::DerefMut; |
263 | |
264 | #[cfg (feature = "display" )] |
265 | pub use derive_more_impl::{ |
266 | Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex, |
267 | }; |
268 | |
269 | #[cfg (feature = "error" )] |
270 | pub use derive_more_impl::Error; |
271 | |
272 | #[cfg (feature = "from" )] |
273 | pub use derive_more_impl::From; |
274 | |
275 | #[cfg (feature = "from_str" )] |
276 | pub use derive_more_impl::FromStr; |
277 | |
278 | #[cfg (feature = "index" )] |
279 | pub use derive_more_impl::Index; |
280 | |
281 | #[cfg (feature = "index_mut" )] |
282 | pub use derive_more_impl::IndexMut; |
283 | |
284 | #[cfg (feature = "into" )] |
285 | pub use derive_more_impl::Into; |
286 | |
287 | #[cfg (feature = "into_iterator" )] |
288 | pub use derive_more_impl::IntoIterator; |
289 | |
290 | #[cfg (feature = "is_variant" )] |
291 | pub use derive_more_impl::IsVariant; |
292 | |
293 | #[cfg (feature = "mul" )] |
294 | pub use derive_more_impl::{Div, Mul, Rem, Shl, Shr}; |
295 | |
296 | #[cfg (feature = "mul_assign" )] |
297 | pub use derive_more_impl::{ |
298 | DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign, |
299 | }; |
300 | |
301 | #[cfg (feature = "not" )] |
302 | pub use derive_more_impl::{Neg, Not}; |
303 | |
304 | #[cfg (feature = "sum" )] |
305 | pub use derive_more_impl::{Product, Sum}; |
306 | |
307 | #[cfg (feature = "try_from" )] |
308 | pub use derive_more_impl::TryFrom; |
309 | |
310 | #[cfg (feature = "try_into" )] |
311 | pub use derive_more_impl::TryInto; |
312 | |
313 | #[cfg (feature = "try_unwrap" )] |
314 | pub use derive_more_impl::TryUnwrap; |
315 | |
316 | #[cfg (feature = "unwrap" )] |
317 | pub use derive_more_impl::Unwrap; |
318 | } |
319 | |
320 | // Now re-export our own derives and the std traits by their exact name to make rust-analyzer |
321 | // recognize the #[doc(hidden)] flag. |
322 | // See issues: |
323 | // 1. https://github.com/rust-lang/rust-analyzer/issues/11698 |
324 | // 2. https://github.com/rust-lang/rust-analyzer/issues/14079 |
325 | #[cfg (feature = "add" )] |
326 | #[doc (hidden)] |
327 | pub use all_traits_and_derives::{Add, BitAnd, BitOr, BitXor, Sub}; |
328 | |
329 | #[cfg (feature = "add_assign" )] |
330 | #[doc (hidden)] |
331 | pub use all_traits_and_derives::{ |
332 | AddAssign, BitAndAssign, BitOrAssign, BitXorAssign, SubAssign, |
333 | }; |
334 | |
335 | #[cfg (feature = "as_ref" )] |
336 | #[doc (hidden)] |
337 | pub use all_traits_and_derives::{AsMut, AsRef}; |
338 | |
339 | #[cfg (feature = "constructor" )] |
340 | #[doc (hidden)] |
341 | pub use all_traits_and_derives::Constructor; |
342 | |
343 | #[cfg (feature = "debug" )] |
344 | #[doc (hidden)] |
345 | pub use all_traits_and_derives::Debug; |
346 | |
347 | #[cfg (feature = "deref" )] |
348 | #[doc (hidden)] |
349 | pub use all_traits_and_derives::Deref; |
350 | |
351 | #[cfg (feature = "deref_mut" )] |
352 | #[doc (hidden)] |
353 | pub use all_traits_and_derives::DerefMut; |
354 | |
355 | #[cfg (feature = "display" )] |
356 | #[doc (hidden)] |
357 | pub use all_traits_and_derives::{ |
358 | Binary, Display, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex, |
359 | }; |
360 | |
361 | #[cfg (feature = "error" )] |
362 | #[doc (hidden)] |
363 | pub use all_traits_and_derives::Error; |
364 | |
365 | #[cfg (feature = "from" )] |
366 | #[doc (hidden)] |
367 | pub use all_traits_and_derives::From; |
368 | |
369 | #[cfg (feature = "from_str" )] |
370 | #[doc (hidden)] |
371 | pub use all_traits_and_derives::FromStr; |
372 | |
373 | #[cfg (feature = "index" )] |
374 | #[doc (hidden)] |
375 | pub use all_traits_and_derives::Index; |
376 | |
377 | #[cfg (feature = "index_mut" )] |
378 | #[doc (hidden)] |
379 | pub use all_traits_and_derives::IndexMut; |
380 | |
381 | #[cfg (feature = "into" )] |
382 | #[doc (hidden)] |
383 | pub use all_traits_and_derives::Into; |
384 | |
385 | #[cfg (feature = "into_iterator" )] |
386 | #[doc (hidden)] |
387 | pub use all_traits_and_derives::IntoIterator; |
388 | |
389 | #[cfg (feature = "is_variant" )] |
390 | #[doc (hidden)] |
391 | pub use all_traits_and_derives::IsVariant; |
392 | |
393 | #[cfg (feature = "mul" )] |
394 | #[doc (hidden)] |
395 | pub use all_traits_and_derives::{Div, Mul, Rem, Shl, Shr}; |
396 | |
397 | #[cfg (feature = "mul_assign" )] |
398 | #[doc (hidden)] |
399 | pub use all_traits_and_derives::{ |
400 | DivAssign, MulAssign, RemAssign, ShlAssign, ShrAssign, |
401 | }; |
402 | |
403 | #[cfg (feature = "not" )] |
404 | #[doc (hidden)] |
405 | pub use all_traits_and_derives::{Neg, Not}; |
406 | |
407 | #[cfg (feature = "sum" )] |
408 | #[doc (hidden)] |
409 | pub use all_traits_and_derives::{Product, Sum}; |
410 | |
411 | #[cfg (feature = "try_from" )] |
412 | #[doc (hidden)] |
413 | pub use all_traits_and_derives::TryFrom; |
414 | |
415 | #[cfg (feature = "try_into" )] |
416 | #[doc (hidden)] |
417 | pub use all_traits_and_derives::TryInto; |
418 | |
419 | #[cfg (feature = "try_unwrap" )] |
420 | #[doc (hidden)] |
421 | pub use all_traits_and_derives::TryUnwrap; |
422 | |
423 | #[cfg (feature = "unwrap" )] |
424 | #[doc (hidden)] |
425 | pub use all_traits_and_derives::Unwrap; |
426 | |
427 | // Re-export the derive macros again to show docs for our derives (but not for traits). This is |
428 | // done using a glob import to not hit E0252. |
429 | #[allow (unused_imports)] |
430 | pub use derive_more_impl::*; |
431 | } |
432 | |
433 | // Check if any feature is enabled |
434 | #[cfg (not(any( |
435 | feature = "full" , |
436 | feature = "add" , |
437 | feature = "add_assign" , |
438 | feature = "as_ref" , |
439 | feature = "constructor" , |
440 | feature = "debug" , |
441 | feature = "deref" , |
442 | feature = "deref_mut" , |
443 | feature = "display" , |
444 | feature = "error" , |
445 | feature = "from" , |
446 | feature = "from_str" , |
447 | feature = "index" , |
448 | feature = "index_mut" , |
449 | feature = "into" , |
450 | feature = "into_iterator" , |
451 | feature = "is_variant" , |
452 | feature = "mul" , |
453 | feature = "mul_assign" , |
454 | feature = "not" , |
455 | feature = "sum" , |
456 | feature = "try_from" , |
457 | feature = "try_into" , |
458 | feature = "try_unwrap" , |
459 | feature = "unwrap" , |
460 | )))] |
461 | compile_error!( |
462 | "at least one derive feature must be enabled (or the \"full \" feature enabling all the derives)" |
463 | ); |
464 | |