Crate lmrc_ports

Crate lmrc_ports 

Source
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::*;

Modules§

database
Database management port trait
dns
DNS management port trait
error
Error types for port operations
git
Git and CI/CD provider port trait
k8s
Kubernetes cluster installation port trait
models
Provider-agnostic domain models
server
Server provisioning port trait