fn main() {}

trait Topology {}

struct DummyTopology {}

impl Topology for DummyTopology {}

impl Topology for LampTopology {}

struct LampTopology {}

struct Maestro {
    topology: Box<dyn Topology>,
}

trait Score {
    type Topology: Topology;
    fn execute(&self, topology: &Self::Topology);
}

struct K8sScore {}
impl Score for K8sScore {
    type Topology = LampTopology;
    fn execute(&self, topology: &Box<dyn Self::Topology>) {
        todo!()
    }
}

impl Maestro {
    pub fn execute<T: Topology>(&self, score: Box<dyn Score<Topology = T>>) {
        score.execute(&self.topology);
    }
}
