<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def recv_trailing_metadata(self):
 """Coroutine to wait for trailers with trailing metadata from the server. .. note:: This coroutine will be called implicitly at exit from this call (context manager's exit), if not called before explicitly. May raise :py:class:`~grpclib.exceptions.GRPCError` if server returned non-:py:attr:`Status.OK <grpclib.const.Status.OK>` in trailers. When this coroutine finishes, you can access received trailing metadata by using :py:attr:`trailing_metadata` attribute. """

        if not self._end_done:
            raise ProtocolError('Outgoing stream was not ended')

        if (
            not self._cardinality.server_streaming
            and not self._recv_message_count
        ):
            raise ProtocolError('No messages were received before waiting '
                                'for trailing metadata')

        if self._recv_trailing_metadata_done:
            raise ProtocolError('Trailing metadata was already received')

        with self._wrapper:
            headers = await self._stream.recv_headers()
            self._recv_trailing_metadata_done = True

            metadata = decode_metadata(headers)
            metadata, = await self._dispatch.recv_trailing_metadata(metadata)
            self.trailing_metadata = metadata

            self._raise_for_grpc_status(dict(headers))