code: def resolve_field(
          self,
          parent_type: GraphQLObjectType,
          source: Any,
          field_nodes: List[FieldNode],
          path: ResponsePath,
      ) -> AwaitableOrValue[Any]:
          
          field_node = field_nodes[0]
          field_name = field_node.name.value
  
          field_def = get_field_def(self.schema, parent_type, field_name)
          if not field_def:
              return INVALID
  
          resolve_fn = field_def.resolve or self.field_resolver
  
          if self.middleware_manager:
              resolve_fn = self.middleware_manager.get_field_resolver(resolve_fn)
  
          info = self.build_resolve_info(field_def, field_nodes, parent_type, path)
  
          # Get the resolve function, regardless of if its result is normal or abrupt
          # (error).
          result = self.resolve_field_value_or_error(
              field_def, field_nodes, resolve_fn, source, info
          )
  
          return self.complete_value_catching_error(
              field_def.type, field_nodes, info, path, result
          )
docs: Resolve the field on the given source object.
  
          In particular, this figures out the value that the field returns by calling its
          resolve function, then calls complete_value to await coroutine objects,
          serialize scalars, or execute the sub-selection-set for objects.