diff libpam-sys/src/lib.rs @ 110:2346fd501b7a

Add tests for constants and do other macro niceties. - Adds tests for all the constants. Pretty sweet. - Moves documentation for cfg-pam-impl macro to `libpam-sys`. - Renames `Illumos` to `Sun`. - other stuff
author Paul Fisher <paul@pfish.zone>
date Sun, 29 Jun 2025 02:15:46 -0400
parents bb465393621f
children
line wrap: on
line diff
--- a/libpam-sys/src/lib.rs	Sat Jun 28 02:49:35 2025 -0400
+++ b/libpam-sys/src/lib.rs	Sun Jun 29 02:15:46 2025 -0400
@@ -2,17 +2,54 @@
 //!
 //! ## PAM implementation
 //!
-#![doc = concat!("This documentation was built for the **", pam_impl_name!(), "** implementation.")]
+#![doc = concat!("This documentation was built for the **", __pam_impl_name__!(), "** implementation.")]
 
-#[doc(inline)]
-pub use libpam_sys_impls::cfg_pam_impl;
-use libpam_sys_impls::{pam_impl_enum, pam_impl_name};
+use libpam_sys_impls::{__pam_impl_enum__, __pam_impl_name__};
+
 mod constants;
-
-pam_impl_enum!();
-
 pub mod helpers;
 mod structs;
 
+/// A `cfg`-like attribute macro for code specific to one PAM implementation.
+///
+/// Different versions of PAM export different functions and have some
+/// meaningful internal implementation differences, like the way `pam_conv`
+/// is handled (see [the Linux-PAM man page for details][man7]).
+///
+/// This macro will let you figure out which PAM you're compiling
+/// (and eventually running) against so you can make those critical changes.
+///
+/// The implementation names are the same as those in the [`PamImpl`] enum.
+///
+/// ```
+/// use libpam_sys::cfg_pam_impl;
+///
+/// #[cfg_pam_impl("Sun")]
+/// fn do_something() { /* Illumos/Solaris-only code */ }
+///
+/// #[cfg_pam_impl(not("Sun"))]
+/// fn do_something() { /* non-Illumos code */ }
+///
+/// #[cfg_pam_impl(any("LinuxPam", "MinimalOpenPam"))]
+/// fn do_something_else() { /* Linux-PAM or minimal OpenPAM */ }
+///
+/// #[cfg_pam_impl(not(any("Sun", "OpenPam")))]
+/// fn do_a_third_thing() { /* Neither Sun nor OpenPAM */ }
+///
+/// #[cfg_pam_impl(any())]
+/// fn this_will_never_build() { /* why would you do this? */ }
+///
+/// #[cfg_pam_impl(not(any()))]
+/// fn this_will_always_build() { /* I, sure, whatever, you do you. */ }
+/// ```
+///
+/// [man7]: https://man7.org/linux/man-pages/man3/pam_conv.3.html
+#[doc(inline)]
+pub use libpam_sys_impls::cfg_pam_impl;
+
+// Looking for the actual code defining this enum?
+// It's in the build.rs file for libpam_sys_impls.
+__pam_impl_enum__!(#[non_exhaustive]);
+
 #[doc(inline)]
 pub use crate::{constants::*, structs::*};