lmrc_ports/
lib.rs

1//! # LMRC Ports
2//!
3//! Port trait definitions for LMRC Stack hexagonal architecture.
4//!
5//! This library defines the core abstractions (ports) that separate business logic
6//! from infrastructure implementation details. Provider-specific implementations
7//! (adapters) implement these traits to enable easy swapping of cloud providers.
8//!
9//! ## Architecture
10//!
11//! ```text
12//! ┌─────────────────────────────────────────┐
13//! │  Business Logic (Pipeline Steps)       │
14//! └─────────────────┬───────────────────────┘
15//!                   │ depends on
16//!                   ▼
17//! ┌─────────────────────────────────────────┐
18//! │  Ports (This Library)                   │
19//! │  - ServerProvider trait                 │
20//! │  - DnsProvider trait                    │
21//! │  - K8sInstaller trait                   │
22//! │  - DatabaseProvider trait               │
23//! │  - GitProvider trait                    │
24//! └─────────────────▲───────────────────────┘
25//!                   │ implements
26//!                   │
27//! ┌─────────────────┴───────────────────────┐
28//! │  Adapters (Provider-Specific)           │
29//! │  - HetznerAdapter                       │
30//! │  - AwsAdapter                           │
31//! │  - CloudflareAdapter                    │
32//! │  - etc.                                 │
33//! └─────────────────────────────────────────┘
34//! ```
35//!
36//! ## Benefits
37//!
38//! - **Provider Independence**: Business logic doesn't depend on specific providers
39//! - **Easy Testing**: Mock implementations for unit tests
40//! - **Flexibility**: Swap providers without changing core logic
41//! - **Extensibility**: Add new providers by implementing traits
42//!
43//! ## Example
44//!
45//! ```no_run
46//! use async_trait::async_trait;
47//! use lmrc_ports::{ServerProvider, ProvisionRequest, ProvisionedServer, PortError};
48//!
49//! // Implement the port for your provider
50//! struct MyCloudProvider;
51//!
52//! #[async_trait]
53//! impl ServerProvider for MyCloudProvider {
54//!     async fn provision_server(&self, request: ProvisionRequest)
55//!         -> Result<ProvisionedServer, PortError> {
56//!         // Your implementation here
57//!         todo!()
58//!     }
59//!
60//!     async fn list_servers(&self) -> Result<Vec<ProvisionedServer>, PortError> {
61//!         todo!()
62//!     }
63//!
64//!     async fn delete_server(&self, server_id: &str) -> Result<(), PortError> {
65//!         todo!()
66//!     }
67//!
68//!     async fn get_server(&self, server_id: &str) -> Result<ProvisionedServer, PortError> {
69//!         todo!()
70//!     }
71//!
72//!     async fn get_server_by_name(&self, name: &str) -> Result<Option<ProvisionedServer>, PortError> {
73//!         todo!()
74//!     }
75//!
76//!     async fn power_on(&self, server_id: &str) -> Result<(), PortError> {
77//!         todo!()
78//!     }
79//!
80//!     async fn power_off(&self, server_id: &str) -> Result<(), PortError> {
81//!         todo!()
82//!     }
83//!
84//!     async fn reboot(&self, server_id: &str) -> Result<(), PortError> {
85//!         todo!()
86//!     }
87//! }
88//! ```
89
90pub mod dns;
91pub mod error;
92pub mod git;
93pub mod k8s;
94pub mod models;
95pub mod server;
96pub mod database;
97
98// Re-export commonly used types
99pub use dns::DnsProvider;
100pub use error::{PortError, PortResult};
101pub use git::GitProvider;
102pub use k8s::{K8sInstaller, ClusterStatus};
103pub use server::ServerProvider;
104pub use database::DatabaseProvider;
105
106// Re-export domain models
107pub use models::*;