code: def _generate_struct_class_custom_annotations(self, ns, data_type):
          
          self.emit('def _process_custom_annotations(self, annotation_type, field_path, processor):')
  
          with self.indent(), emit_pass_if_nothing_emitted(self):
              self.emit(
                  (
                      'super({}, self)._process_custom_annotations(annotation_type, field_path, '
                      'processor)'
                  ).format(class_name_for_data_type(data_type))
              )
              self.emit()
  
              for field in data_type.fields:
                  field_name = fmt_var(field.name, check_reserved=True)
                  for annotation_type, processor in self._generate_custom_annotation_processors(
                          ns, field.data_type, field.custom_annotations):
                      annotation_class = class_name_for_annotation_type(annotation_type, ns)
                      self.emit('if annotation_type is {}:'.format(annotation_class))
                      with self.indent():
                          self.emit('self.{} = {}'.format(
                              field_name,
                              generate_func_call(
                                  processor,
                                  args=[
                                      "'{{}}.{}'.format(field_path)".format(field_name),
                                      'self.{}'.format(field_name),
                                  ])
                          ))
                      self.emit()
docs: The _process_custom_annotations function allows client code to access
          custom annotations defined in the spec.