Skip to main content

ldp_protocol/
plugin.rs

1//! LDP plugin registration.
2//!
3//! Provides registration for the LDP adapter with a `ProtocolRegistry`.
4//!
5//! # Standalone Usage
6//!
7//! ```rust,ignore
8//! use ldp_protocol::plugin::register_ldp;
9//! use ldp_protocol::protocol::ProtocolRegistry;
10//!
11//! let mut registry = ProtocolRegistry::new();
12//! register_ldp(&mut registry, None);
13//! ```
14//!
15//! # JamJet Usage (with `jamjet` feature)
16//!
17//! ```rust,ignore
18//! use ldp_protocol::plugin::register_ldp_jamjet;
19//! use jamjet_protocols::ProtocolRegistry;
20//!
21//! let mut registry = ProtocolRegistry::new();
22//! register_ldp_jamjet(&mut registry, None);
23//! ```
24
25use crate::config::LdpAdapterConfig;
26use crate::protocol::ProtocolRegistry;
27use crate::LdpAdapter;
28use std::sync::Arc;
29
30/// Register the LDP adapter with a `ProtocolRegistry`.
31///
32/// # Arguments
33///
34/// * `registry` — The protocol registry to register with.
35/// * `config` — Optional LDP configuration. Uses defaults if `None`.
36///
37/// # URL Routing
38///
39/// Registers `"ldp://"` as the URL prefix. Any URL starting with `ldp://`
40/// will be routed to the LDP adapter.
41pub fn register_ldp(registry: &mut ProtocolRegistry, config: Option<LdpAdapterConfig>) {
42    let config = config.unwrap_or_default();
43    let adapter = Arc::new(LdpAdapter::new(config));
44    registry.register("ldp", adapter, vec!["ldp://"]);
45}
46
47/// Register the LDP adapter with JamJet's `ProtocolRegistry`.
48///
49/// This bridges LDP into JamJet's runtime without modifying JamJet source code.
50/// Only available when the `jamjet` feature is enabled.
51#[cfg(feature = "jamjet")]
52pub fn register_ldp_jamjet(
53    registry: &mut jamjet_protocols::ProtocolRegistry,
54    config: Option<LdpAdapterConfig>,
55) {
56    let config = config.unwrap_or_default();
57    let adapter = Arc::new(LdpAdapter::new(config));
58    registry.register("ldp", adapter, vec!["ldp://"]);
59}
60
61/// Create a standalone LDP adapter instance.
62///
63/// Useful for direct usage without a registry.
64pub fn create_adapter(config: Option<LdpAdapterConfig>) -> Arc<LdpAdapter> {
65    Arc::new(LdpAdapter::new(config.unwrap_or_default()))
66}
67
68#[cfg(test)]
69mod tests {
70    use super::*;
71
72    #[test]
73    fn register_ldp_in_registry() {
74        let mut registry = ProtocolRegistry::new();
75        register_ldp(&mut registry, None);
76
77        assert!(registry.adapter("ldp").is_some());
78        assert!(registry.protocols().contains(&"ldp"));
79    }
80
81    #[test]
82    fn url_routing_matches_ldp_prefix() {
83        let mut registry = ProtocolRegistry::new();
84        register_ldp(&mut registry, None);
85
86        assert!(registry
87            .adapter_for_url("ldp://delegate.example.com")
88            .is_some());
89        assert!(registry.adapter_for_url("https://not-ldp.com").is_none());
90    }
91
92    #[tokio::test]
93    async fn create_standalone_adapter() {
94        let adapter = create_adapter(None);
95        assert_eq!(adapter.session_manager().active_count().await, 0);
96    }
97}