fn generate_error_enum_types(
        &self,
        operation: &Operation,
        error_documentation: &BTreeMap<&String, &String>,
        service: &Service,
    ) -> Option<String> {
        let mut enum_types: Vec<String> = Vec::new();

        if operation.errors.is_some() {
            for error in operation.errors() {
                // some botocore definitions include Validation in every errors list, some take it as assumed
                // skip it if it's listed, as we implement it for all error types in the RusotoError enum.
                // Cloudsearch needs this, look into why.
                if error.idiomatic_error_name() != "Validation"
                    || service.service_id() == Some("CloudSearch")
                    || service.service_id() == Some("SNS")
                {
                    enum_types.push(format!(
                        "\n{}\n{}(String)",
                        crate::doco::Item(
                            error_documentation
                                .get(&error.shape)
                                .unwrap_or(&&String::from(""))
                        ),
                        error.idiomatic_error_name()
                    ));
                }
            }
        }

        Some(enum_types.join(","))
    }
generate an enum of all possible errors output by this operation
service_crategen/src/commands/generate/codegen/error_types.rs