//===-- MICmnMIResultRecord.cpp ---------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// Third Party Headers:
#include <assert.h>

// In-house headers:
#include "MICmnMIResultRecord.h"
#include "MICmnResources.h"

//++
//------------------------------------------------------------------------------------
// Details: Map a result class to the corresponding string.
// Args:    veType      - (R) A MI result class enumeration.
// Return:  const char* - The string corresponding to the result class.
// Throws:  None.
//--
static const char *
MapResultClassToResultClassText(CMICmnMIResultRecord::ResultClass_e veType) {
  switch (veType) {
  case CMICmnMIResultRecord::eResultClass_Done:
    return "done";
  case CMICmnMIResultRecord::eResultClass_Running:
    return "running";
  case CMICmnMIResultRecord::eResultClass_Connected:
    return "connected";
  case CMICmnMIResultRecord::eResultClass_Error:
    return "error";
  case CMICmnMIResultRecord::eResultClass_Exit:
    return "exit";
  }
  assert(false && "unknown CMICmnMIResultRecord::ResultClass_e");
  return NULL;
}

//++
//------------------------------------------------------------------------------------
// Details: Build the result record's mandatory data part. The part up to the
// first
//          (additional) result i.e. result-record ==>  [ token ] "^"
//          result-class.
// Args:    vrToken     - (R) The command's transaction ID or token.
//          veType      - (R) A MI result class enumeration.
// Return:  CMIUtilString & - MI result record mandatory data
// Throws:  None.
//--
static const CMIUtilString
BuildResultRecord(const CMIUtilString &vrToken,
                  CMICmnMIResultRecord::ResultClass_e veType) {
  const char *pStrResultRecord = MapResultClassToResultClassText(veType);
  return CMIUtilString::Format("%s^%s", vrToken.c_str(), pStrResultRecord);
}

//++
//------------------------------------------------------------------------------------
// Details: CMICmnMIResultRecord constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmnMIResultRecord::CMICmnMIResultRecord()
    : m_strResultRecord(MIRSRC(IDS_CMD_ERR_CMD_RUN_BUT_NO_ACTION)) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmnMIResultRecord constructor.
// Type:    Method.
// Args:    vrToken - (R) The command's transaction ID or token.
//          veType  - (R) A MI result class enumeration.
// Return:  None.
// Throws:  None.
//--
CMICmnMIResultRecord::CMICmnMIResultRecord(const CMIUtilString &vrToken,
                                           ResultClass_e veType)
    : m_strResultRecord(BuildResultRecord(vrToken, veType)) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmnMIResultRecord constructor.
// Type:    Method.
// Args:    vrToken     - (R) The command's transaction ID or token.
//          veType      - (R) A MI result class enumeration.
//          vMIResult   - (R) A MI result object.
// Return:  None.
// Throws:  None.
//--
CMICmnMIResultRecord::CMICmnMIResultRecord(const CMIUtilString &vrToken,
                                           ResultClass_e veType,
                                           const CMICmnMIValueResult &vValue)
    : m_strResultRecord(BuildResultRecord(vrToken, veType)) {
  Add(vValue);
}

//++
//------------------------------------------------------------------------------------
// Details: CMICmnMIResultRecord destructor.
// Type:    Overrideable.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmnMIResultRecord::~CMICmnMIResultRecord() {}

//++
//------------------------------------------------------------------------------------
// Details: Return the MI result record as a string. The string is a direct
// result of
//          work done on *this result record so if not enough data is added then
//          it is
//          possible to return a malformed result record. If nothing has been
//          set or
//          added to *this MI result record object then text "<Invalid>" will be
//          returned.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString & - MI output text.
// Throws:  None.
//--
const CMIUtilString &CMICmnMIResultRecord::GetString() const {
  return m_strResultRecord;
}

//++
//------------------------------------------------------------------------------------
// Details: Add to *this result record additional information.
// Type:    Method.
// Args:    vMIValue    - (R) A MI value derived object.
// Return:  None.
// Throws:  None.
//--
void CMICmnMIResultRecord::Add(const CMICmnMIValue &vMIValue) {
  m_strResultRecord += ",";
  m_strResultRecord += vMIValue.GetString();
}
