libindigo-rs

Client Strategies Architecture

Overview

The libindigo library implements a dual-strategy pattern for INDIGO client connectivity, allowing users to choose between FFI-based (C library) or pure Rust implementations.

Strategy Pattern

The client architecture uses the Strategy pattern to abstract the underlying implementation:

#[async_trait]
pub trait ClientStrategy: Send + Sync {
    async fn connect(&mut self, url: &str) -> Result<()>;
    async fn disconnect(&mut self) -> Result<()>;
    async fn enumerate_properties(&mut self, device: Option<&str>) -> Result<()>;
    async fn send_property(&mut self, property: Property) -> Result<()>;

    // Optional monitoring support
    #[cfg(feature = "monitoring")]
    fn set_monitoring_config(&mut self, config: MonitoringConfig);

    #[cfg(feature = "monitoring")]
    fn subscribe_status(&self) -> Option<mpsc::UnboundedReceiver<ClientEvent>>;
}

Available Strategies

1. Pure Rust Strategy (RS)

Location: src/strategies/rs/

Features:

Components:

Usage:

let mut client = ClientBuilder::new()
    .with_rs_strategy()
    .build()?;

2. FFI Strategy

Location: src/strategies/ffi.rs, src/strategies/async_ffi.rs

Features:

Components:

Usage:

let mut client = ClientBuilder::new()
    .with_ffi_strategy()
    .build()?;

Strategy Selection

Compile-Time Selection

Use Cargo features to select strategy:

# Default: client with async support
libindigo = "0.2"

# Pure Rust strategy (zero FFI dependencies)
libindigo = { version = "0.2", default-features = false, features = ["rs"] }

# FFI strategy
libindigo = { version = "0.2", default-features = false, features = ["ffi", "async"] }

Runtime Selection

Explicitly choose strategy in code:

// Pure Rust
let client = ClientBuilder::new()
    .with_rs_strategy()
    .build()?;

// FFI
let client = ClientBuilder::new()
    .with_ffi_strategy()
    .build()?;

Protocol Support

XML Protocol (Version 2.0)

JSON Protocol (Version 512)

Implementation Status

Feature RS Strategy FFI Strategy
XML Protocol ✅ Complete ✅ Complete
JSON Protocol ✅ Complete ❌ Not available
Protocol Negotiation ✅ Complete ✅ Complete
Async API ✅ Native ✅ Wrapped
Property Streaming ✅ Complete ✅ Complete
BLOB Support ✅ Complete ✅ Complete
Server Monitoring ✅ Complete 🚧 Partial (FFI types only)
Hardware Drivers ❌ N/A ✅ Complete

Performance Considerations

Pure Rust Strategy

Advantages:

Trade-offs:

FFI Strategy

Advantages:

Trade-offs:

Testing

Both strategies have comprehensive test coverage:

See tests/ directory for test implementations.

Monitoring Integration

Both strategies support optional server monitoring through the monitoring feature flag.

Pure Rust Strategy

The RS strategy has full monitoring support:

See Server Monitoring for details.

FFI Strategy

The FFI strategy provides monitoring types for C/C++ consumers:

Full monitoring implementation for FFI strategy is planned for a future release.

Future Enhancements

  1. WebSocket Transport - Add WebSocket support for web clients
  2. Protocol Extensions - Support for custom protocol extensions
  3. Connection Pooling - Reuse connections across clients
  4. Automatic Failover - Switch strategies on connection failure
  5. FFI Monitoring - Complete monitoring implementation for FFI strategy

References