chore: Move ADR helper files into folders with their corresponding ADR number
This commit is contained in:
129
adr/003-abstractions/topology/src/main_right.rs
Normal file
129
adr/003-abstractions/topology/src/main_right.rs
Normal file
@@ -0,0 +1,129 @@
|
||||
use std::marker::PhantomData;
|
||||
|
||||
// Capability Trait Hierarchy
|
||||
pub trait Capability {}
|
||||
|
||||
// Specific Capability Traits
|
||||
pub trait ShellAccess: Capability {}
|
||||
pub trait ContainerRuntime: Capability {}
|
||||
pub trait KubernetesAccess: Capability {}
|
||||
pub trait FileSystemAccess: Capability {}
|
||||
|
||||
// Topology Trait - Defines the core interface for infrastructure topologies
|
||||
pub trait Topology {
|
||||
type Capabilities: Capability;
|
||||
|
||||
fn name(&self) -> &str;
|
||||
}
|
||||
|
||||
// Score Trait - Defines the core interface for infrastructure transformation
|
||||
pub trait Score {
|
||||
type RequiredCapabilities: Capability;
|
||||
type OutputTopology: Topology;
|
||||
|
||||
fn apply<T: Topology>(&self, topology: T) -> Result<Self::OutputTopology, String>;
|
||||
}
|
||||
|
||||
// Linux Host Topology
|
||||
pub struct LinuxHostTopology;
|
||||
|
||||
impl Topology for LinuxHostTopology {
|
||||
type Capabilities = dyn ShellAccess + FileSystemAccess;
|
||||
|
||||
fn name(&self) -> &str {
|
||||
"Linux Host"
|
||||
}
|
||||
}
|
||||
|
||||
impl ShellAccess for LinuxHostTopology {}
|
||||
impl FileSystemAccess for LinuxHostTopology {}
|
||||
|
||||
// K3D Topology
|
||||
pub struct K3DTopology;
|
||||
|
||||
impl Topology for K3DTopology {
|
||||
type Capabilities = dyn ContainerRuntime + KubernetesAccess + ShellAccess;
|
||||
|
||||
fn name(&self) -> &str {
|
||||
"K3D Kubernetes Cluster"
|
||||
}
|
||||
}
|
||||
|
||||
impl ContainerRuntime for K3DTopology {}
|
||||
impl KubernetesAccess for K3DTopology {}
|
||||
impl ShellAccess for K3DTopology {}
|
||||
|
||||
// Command Score - A score that requires shell access
|
||||
pub struct CommandScore {
|
||||
command: String,
|
||||
}
|
||||
|
||||
impl Score for CommandScore {
|
||||
type RequiredCapabilities = dyn ShellAccess;
|
||||
type OutputTopology = LinuxHostTopology;
|
||||
|
||||
fn apply<T: Topology>(&self, _topology: T) -> Result<Self::OutputTopology, String>
|
||||
where
|
||||
T: ShellAccess
|
||||
{
|
||||
// Simulate command execution
|
||||
println!("Executing command: {}", self.command);
|
||||
Ok(LinuxHostTopology)
|
||||
}
|
||||
}
|
||||
|
||||
// Kubernetes Resource Score
|
||||
pub struct K8sResourceScore {
|
||||
resource_definition: String,
|
||||
}
|
||||
|
||||
impl Score for K8sResourceScore {
|
||||
type RequiredCapabilities = dyn KubernetesAccess;
|
||||
type OutputTopology = K3DTopology;
|
||||
|
||||
fn apply<T: Topology>(&self, _topology: T) -> Result<Self::OutputTopology, String>
|
||||
where
|
||||
T: dyn KubernetesAccess
|
||||
{
|
||||
// Simulate Kubernetes resource application
|
||||
println!("Applying K8s resource: {}", self.resource_definition);
|
||||
Ok(K3DTopology)
|
||||
}
|
||||
}
|
||||
|
||||
// Maestro - The orchestration coordinator
|
||||
pub struct Maestro;
|
||||
|
||||
impl Maestro {
|
||||
// Type-safe score application
|
||||
pub fn apply_score<T, S>(topology: T, score: S) -> Result<S::OutputTopology, String>
|
||||
where
|
||||
T: Topology,
|
||||
S: Score,
|
||||
T: S::RequiredCapabilities
|
||||
{
|
||||
score.apply(topology)
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Example usage demonstrating type-driven design
|
||||
let linux_host = LinuxHostTopology;
|
||||
let k3d_cluster = K3DTopology;
|
||||
|
||||
// Command score on Linux host
|
||||
let command_score = CommandScore {
|
||||
command: "echo 'Hello, World!'".to_string(),
|
||||
};
|
||||
|
||||
let result = Maestro::apply_score(linux_host, command_score)
|
||||
.expect("Command score application failed");
|
||||
|
||||
// K8s resource score on K3D cluster
|
||||
let k8s_score = K8sResourceScore {
|
||||
resource_definition: "apiVersion: v1\nkind: Pod\n...".to_string(),
|
||||
};
|
||||
|
||||
let k8s_result = Maestro::apply_score(k3d_cluster, k8s_score)
|
||||
.expect("K8s resource score application failed");
|
||||
}
|
||||
Reference in New Issue
Block a user