#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
#![warn(clippy::all, clippy::nursery, clippy::pedantic, clippy::cargo)]
pub use doc_for_derive::{doc_impl, DocDyn, DocFor};
pub trait DocFor {
const DOC: Option<&'static str>;
}
pub trait DocDyn {
fn doc_dyn(&self) -> Option<&'static str>;
}
#[doc(hidden)]
#[macro_export]
macro_rules! force_const {
($t:ty, $e:expr) => {{
const VALUE: $t = $e;
VALUE
}};
}
#[macro_export]
macro_rules! doc_for {
($t:ty) => {
<$t as $crate::DocFor>::DOC
};
($t:ty, $field:ident) => {
$crate::force_const!(
Option<&'static str>,
<$t>::doc_for_field(stringify!($field))
)
};
($t:ty, $index:expr) => {
$crate::force_const!(Option<&'static str>, <$t>::doc_for_field($index))
};
}
#[macro_export]
macro_rules! doc {
($t:ty) => {
$crate::force_const!(
&'static str,
$crate::doc_for!($t).expect("The type is not documented")
)
};
($t:ty, $field:ident) => {
$crate::force_const!(
&'static str,
$crate::doc_for!($t, $field).expect("The field or variant is not documented")
)
};
($t:ty, $index:expr) => {
$crate::force_const!(
&'static str,
$crate::doc_for!($t, $index).expect("The field or variant is not documented")
)
};
}