allora_runtime/spec/
http_inbound_adapters_spec.rs

1//! HttpInboundAdaptersSpec: collection of HttpInboundAdapterSpec entries sharing a single version.
2//!
3//! Mirrors ServiceActivatorsSpec / FiltersSpec semantics for ordered aggregation, preserving
4//! declaration order and deferring uniqueness / auto-id concerns to builder logic.
5//!
6//! # Responsibilities
7//! * Store version (validated by YAML parser).
8//! * Preserve adapter declaration order (Vec internally).
9//! * Allow optional / duplicate ids (uniqueness enforced later).
10//!
11//! # Auto-ID Strategy (Builder Level - FUTURE)
12//! * Missing `http-inbound-adapter.id` values assigned deterministic `http-inbound-adapter:auto.N`.
13//! * Duplicate explicit ids -> build error.
14//!
15//! # Example
16//! ```rust
17//! use allora_runtime::spec::{HttpInboundAdapterSpec, HttpInboundAdaptersSpec};
18//! let spec = HttpInboundAdaptersSpec::new(1)
19//!     .add(HttpInboundAdapterSpec::with_id("http.recv", "0.0.0.0", 8080, "/recv", vec!["POST".into()], "inbound.recv"))
20//!     .add(HttpInboundAdapterSpec::new("127.0.0.1", 8081, "/health", vec!["GET".into()], "inbound.health"));
21//! assert_eq!(spec.adapters().len(), 2);
22//! assert_eq!(spec.adapters()[0].id(), Some("http.recv"));
23//! assert!(spec.adapters()[1].id().is_none());
24//! ```
25
26use crate::spec::HttpInboundAdapterSpec;
27
28#[derive(Debug, Clone)]
29pub struct HttpInboundAdaptersSpec {
30    version: u32,
31    adapters: Vec<HttpInboundAdapterSpec>,
32}
33
34impl HttpInboundAdaptersSpec {
35    pub fn new(version: u32) -> Self {
36        Self {
37            version,
38            adapters: Vec::new(),
39        }
40    }
41    pub fn add(mut self, a: HttpInboundAdapterSpec) -> Self {
42        self.adapters.push(a);
43        self
44    }
45    pub fn push(&mut self, a: HttpInboundAdapterSpec) {
46        self.adapters.push(a);
47    }
48    pub fn version(&self) -> u32 {
49        self.version
50    }
51    pub fn adapters(&self) -> &[HttpInboundAdapterSpec] {
52        &self.adapters
53    }
54    pub fn into_adapters(self) -> Vec<HttpInboundAdapterSpec> {
55        self.adapters
56    }
57}