Expand description
§LMRC Ports
Port trait definitions for LMRC Stack hexagonal architecture.
This library defines the core abstractions (ports) that separate business logic from infrastructure implementation details. Provider-specific implementations (adapters) implement these traits to enable easy swapping of cloud providers.
§Architecture
┌─────────────────────────────────────────┐
│ Business Logic (Pipeline Steps) │
└─────────────────┬───────────────────────┘
│ depends on
▼
┌─────────────────────────────────────────┐
│ Ports (This Library) │
│ - ServerProvider trait │
│ - DnsProvider trait │
│ - K8sInstaller trait │
│ - DatabaseProvider trait │
│ - GitProvider trait │
└─────────────────▲───────────────────────┘
│ implements
│
┌─────────────────┴───────────────────────┐
│ Adapters (Provider-Specific) │
│ - HetznerAdapter │
│ - AwsAdapter │
│ - CloudflareAdapter │
│ - etc. │
└─────────────────────────────────────────┘§Benefits
- Provider Independence: Business logic doesn’t depend on specific providers
- Easy Testing: Mock implementations for unit tests
- Flexibility: Swap providers without changing core logic
- Extensibility: Add new providers by implementing traits
§Example
use async_trait::async_trait;
use lmrc_ports::{ServerProvider, ProvisionRequest, ProvisionedServer, PortError};
// Implement the port for your provider
struct MyCloudProvider;
#[async_trait]
impl ServerProvider for MyCloudProvider {
async fn provision_server(&self, request: ProvisionRequest)
-> Result<ProvisionedServer, PortError> {
// Your implementation here
todo!()
}
async fn list_servers(&self) -> Result<Vec<ProvisionedServer>, PortError> {
todo!()
}
async fn delete_server(&self, server_id: &str) -> Result<(), PortError> {
todo!()
}
async fn get_server(&self, server_id: &str) -> Result<ProvisionedServer, PortError> {
todo!()
}
async fn get_server_by_name(&self, name: &str) -> Result<Option<ProvisionedServer>, PortError> {
todo!()
}
async fn power_on(&self, server_id: &str) -> Result<(), PortError> {
todo!()
}
async fn power_off(&self, server_id: &str) -> Result<(), PortError> {
todo!()
}
async fn reboot(&self, server_id: &str) -> Result<(), PortError> {
todo!()
}
}Re-exports§
pub use dns::DnsProvider;pub use error::PortError;pub use error::PortResult;pub use git::GitProvider;pub use k8s::K8sInstaller;pub use k8s::ClusterStatus;pub use server::ServerProvider;pub use database::DatabaseProvider;pub use models::*;