use std::sync::Arc; use serde::Deserialize; #[derive(Deserialize, Clone, Debug, Default)] /// Nats configuration pub struct NatsConfig { /// Hosts dsn #[serde(default = "nats")] pub hosts: Arc<[String]>, } pub(crate) fn nats() -> Arc<[String]> { let hosts = vec!["nats://localhost:4222".to_string()]; hosts.into() } impl NatsConfig { fn hosts(&self) -> Vec { self.hosts.iter().map(ToString::to_string).collect() } } use crate::{ ServiceError, ServicesBuilder, services_builder::{IsUnset, State}, }; #[cfg(feature = "nats-jetstream")] impl ServicesBuilder { /// create a Jetstream Context using the provided [NatsConfig] pub async fn nats_jetstream( self, config: &NatsConfig, ) -> Result>, ServiceError> where S::Jetstream: IsUnset, { let hosts = config.hosts(); let client = async_nats::connect(hosts).await?; Ok(self.jetstream_internal(async_nats::jetstream::new(client))) } } #[cfg(feature = "nats-core")] impl ServicesBuilder { /// create a NATS connection using the provided [NatsConfig] pub async fn nats( self, config: &NatsConfig, ) -> Result>, ServiceError> where S::Nats: IsUnset, { let hosts = config.hosts(); let client = async_nats::connect(hosts).await?; Ok(self.nats_internal(client)) } }