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