code: def _RunClientAction(self, action, request, parser_factory, path_type):
      
      responses = list(action(request))
  
      if parser_factory is None:
        return responses
  
      # parse the responses
      parsed_responses = []
  
      for response in responses:
        for parser in parser_factory.SingleResponseParsers():
          parsed_responses.extend(
              parser.ParseResponse(self.knowledge_base, response, path_type))
  
        for parser in parser_factory.SingleFileParsers():
          precondition.AssertType(response, rdf_client_fs.StatEntry)
          pathspec = response.pathspec
          with vfs.VFSOpen(pathspec) as filedesc:
            parsed_responses.extend(
                parser.ParseFile(self.knowledge_base, pathspec, filedesc))
  
      for parser in parser_factory.MultiResponseParsers():
        parsed_responses.extend(
            parser.ParseResponses(self.knowledge_base, responses))
  
      for parser in parser_factory.MultiFileParsers():
        precondition.AssertIterableType(responses, rdf_client_fs.StatEntry)
        pathspecs = [response.pathspec for response in responses]
        with vfs.VFSMultiOpen(pathspecs) as filedescs:
          parsed_responses.extend(
              parser.ParseFiles(self.knowledge_base, pathspecs, filedescs))
  
      return parsed_responses
docs: Runs the client action  with the request and parses the result.