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}