//===-- MICmdInterpreter.h --------------------------------------*- 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
//
//===----------------------------------------------------------------------===//

#pragma once

// In-house headers:
#include "MICmdData.h"
#include "MICmnBase.h"
#include "MIUtilSingletonBase.h"

// Declarations:
class CMICmdFactory;

//++
//============================================================================
// Details: MI command interpreter. It takes text data from the MI driver
//          (which got it from Stdin singleton) and validate the text to see if
//          matches Machine Interface (MI) format and commands defined in the
//          MI application.
//          A singleton class.
//--
class CMICmdInterpreter : public CMICmnBase,
                          public MI::ISingleton<CMICmdInterpreter> {
  friend MI::ISingleton<CMICmdInterpreter>;

  // Methods:
public:
  // Methods:
public:
  bool Initialize() override;
  bool Shutdown() override;
  bool ValidateIsMi(const CMIUtilString &vTextLine, bool &vwbYesValid,
                    bool &vwbCmdNotInCmdFactor, SMICmdData &rwCmdData);

  // Methods:
private:
  /* ctor */ CMICmdInterpreter();
  /* ctor */ CMICmdInterpreter(const CMICmdInterpreter &);
  void operator=(const CMICmdInterpreter &);

  bool HasCmdFactoryGotMiCmd(const SMICmdData &vCmdData) const;
  bool MiHasCmdTokenEndingHyphen(const CMIUtilString &vTextLine);
  bool MiHasCmdTokenEndingAlpha(const CMIUtilString &vTextLine);
  bool MiHasCmd(const CMIUtilString &vTextLine);
  bool MiHasCmdTokenPresent(const CMIUtilString &vTextLine);
  const SMICmdData &MiGetCmdData() const;

  // Overridden:
private:
  // From CMICmnBase
  /* dtor */ ~CMICmdInterpreter() override;

  // Attributes:
private:
  SMICmdData m_miCmdData; // Filled in on each new line being interpreted
  CMICmdFactory &m_rCmdFactory;
};
