//! `@public` marker — the explicit opt-out of authentication.
//!
//! The security-by-default model: `@authenticate` is applied to EVERY function
//! by default. `@public` is the rare annotation that says "this endpoint
//! intentionally has no auth".
//!
//! `PublicMarker` is a zero-cost marker. When the compiler sees `@public` on a
//! function, it strips `AuthenticateAspect` from the chain for that function.
//! The chain-builder checks `is_public` before prepending default auth.

/// Zero-cost marker indicating that a function is intentionally public.
///
/// When `@public` is present, the default `AuthenticateAspect` is NOT added
/// to the function's aspect chain.
///
/// Usage in the el-ui compiler:
/// ```text
/// @public
/// fn health_check() -> Status { ... }
/// ```
///
/// In the AOP chain builder:
/// ```rust
/// use el_aop::{AspectChain, PublicMarker, AuthenticateAspect};
/// use std::sync::Arc;
///
/// fn build_chain(is_public: bool) -> AspectChain {
///     if is_public || PublicMarker::is_bypassing() {
///         AspectChain::new()
///     } else {
///         AspectChain::new().with_default_auth()
///     }
/// }
/// ```
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct PublicMarker;

impl PublicMarker {
    /// Returns `true` — always. Exists for use in match arms / conditional logic.
    ///
    /// The presence of a `PublicMarker` in the decorator list is the signal;
    /// this method is a convenience for procedural logic over decorator lists.
    pub const fn is_bypassing() -> bool {
        true
    }

    /// The decorator name this marker corresponds to.
    pub const fn decorator_name() -> &'static str {
        "public"
    }
}

impl std::fmt::Display for PublicMarker {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "@public")
    }
}
