Enums represent a closed set of options and prevents users from using their own synthesizers. Instead, the synthesizers should be passed as generic arguments. For instance,
pub struct PauliExponentialSynthesizer {
pauli_strategy: PauliPolynomialSynthStrategy,
clifford_strategy: CliffordTableauSynthStrategy,
}
should probably be
pub struct PauliExponentialSynthesizer<PS, CS> {
pauli_synthesizer: PS,
clifford_synthesizer: CS,
}