nautalid 0.1.0

Scratch container substrate — TLS 1.3 HTTP/2+3 kernel, LID/AetherDB, optional filter bus (GPL-3.0-or-later).
#[cfg(any(feature = "kwt", feature = "image-trust"))]
use std::sync::Arc;

#[cfg(feature = "kwt")]
use crate::kwt_access::KwtAccessConfig;
#[cfg(feature = "kwt")]
use crate::kwt_replay::AetherRuntime;

#[cfg(feature = "filter")]
use crate::filter::FilterStore;

/// Cheaply cloneable server state (`Arc` inside) for concurrent Axum handlers.
#[derive(Clone)]
pub struct AppState {
    /// Full signed JSON envelope for `GET /.well-known/nautalid-image-trust.json` (callers verify ECDSA offline).
    #[cfg(feature = "image-trust")]
    pub image_trust_attestation: Option<Arc<str>>,
    /// When set, `/v1/protected/*` requires a valid [KWT](https://github.com/TheMapleseed/KWT) (not a static bearer).
    #[cfg(feature = "kwt")]
    pub kwt_access: Option<Arc<KwtAccessConfig>>,
    /// Live LID runtime (topology, data plane, hot JTI reconnect).
    #[cfg(feature = "kwt")]
    pub aether_runtime: Option<Arc<AetherRuntime>>,
    /// Live filter policy (env at startup; reload via **`bus`** when **`filter-control`** is enabled).
    #[cfg(feature = "filter")]
    pub filter: FilterStore,
}

impl AppState {
    /// Empty/minimal state (tests and custom assembly).
    #[must_use]
    pub fn empty() -> Self {
        Self {
            #[cfg(feature = "image-trust")]
            image_trust_attestation: None,
            #[cfg(feature = "kwt")]
            kwt_access: None,
            #[cfg(feature = "kwt")]
            aether_runtime: None,
            #[cfg(feature = "filter")]
            filter: FilterStore::default(),
        }
    }

    #[cfg(feature = "filter")]
    #[must_use]
    pub fn with_filter(mut self, filter: FilterStore) -> Self {
        self.filter = filter;
        self
    }

    #[cfg(feature = "kwt")]
    #[must_use]
    pub fn with_kwt(mut self, kwt: KwtAccessConfig) -> Self {
        self.kwt_access = Some(Arc::new(kwt));
        self
    }

    #[must_use]
    pub fn new(
        #[cfg(feature = "image-trust")] image_trust_attestation: Option<Arc<str>>,
        #[cfg(feature = "kwt")] kwt_access: Option<KwtAccessConfig>,
        #[cfg(feature = "kwt")] aether_runtime: Option<Arc<AetherRuntime>>,
        #[cfg(feature = "filter")] filter: FilterStore,
    ) -> Self {
        Self {
            #[cfg(feature = "image-trust")]
            image_trust_attestation,
            #[cfg(feature = "kwt")]
            kwt_access: kwt_access.map(Arc::new),
            #[cfg(feature = "kwt")]
            aether_runtime,
            #[cfg(feature = "filter")]
            filter,
        }
    }
}