//===-- MICmdArgValBase.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

#include "MICmdArgSet.h"
#include "MIUtilString.h"

//++
//============================================================================
// Details: MI common code class. Command argument base class. Arguments objects
//          needing specialization derived from *this class. An argument knows
//          what type of argument it is and how it is to interpret the options
//          (context) string to find and validate a matching argument and so
//          extract a value from it.
//          Argument objects are added to the CMICmdArgSet container object.
//          Once added the container they belong to that contain and will be
//          deleted when the container goes out of scope. Allocate argument
//          objects on the heap and pass in to the Add().
//          Note the code is written such that a command will produce an error
//          should it be presented with arguments or options it does not
//          understand.
//          A command can recognise an option or argument then ignore if it
//          wishes (a warning is sent to the MI's Log file). This is so it is
//          hardwired to fail and catch arguments or options that presented by
//          different driver clients.
//          Based on the Interpreter pattern.
//--
class CMICmdArgValBase : public CMICmdArgSet::IArg {
  // Methods:
public:
  CMICmdArgValBase();
  CMICmdArgValBase(const CMIUtilString &vrArgName, const bool vbMandatory,
                   const bool vbHandleByCmd);

  // Overrideable:
  ~CMICmdArgValBase() override = default;

  // Overridden:
  // From CMICmdArgSet::IArg
  bool GetFound() const override;
  bool GetIsHandledByCmd() const override;
  bool GetIsMandatory() const override;
  bool GetIsMissingOptions() const override;
  const CMIUtilString &GetName() const override;
  bool GetValid() const override;
  bool Validate(CMICmdArgContext &vwArgContext) override;

  // Attributes:
protected:
  bool
      m_bFound; // True = yes found in arguments options text, false = not found
  bool m_bValid; // True = yes argument parsed and valid, false = not valid
  bool
      m_bMandatory; // True = yes arg must be present, false = optional argument
  CMIUtilString m_strArgName;
  bool m_bHandled; // True = Command processes *this option, false = not handled
  bool m_bIsMissingOptions; // True = Command needs more information, false = ok
};

//++
//============================================================================
// Details: MI common code class. Templated command argument base class.
//--
template <class T> class CMICmdArgValBaseTemplate : public CMICmdArgValBase {
  // Methods:
public:
  CMICmdArgValBaseTemplate() = default;
  CMICmdArgValBaseTemplate(const CMIUtilString &vrArgName,
                           const bool vbMandatory, const bool vbHandleByCmd);
  //
  const T &GetValue() const;

  // Overrideable:
  ~CMICmdArgValBaseTemplate() override = default;

  // Attributes:
protected:
  T m_argValue;
};

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValBaseTemplate constructor.
// Type:    Method.
// Args:    vrArgName       - (R) Argument's name to search by.
//          vbMandatory     - (R) True = Yes must be present, false = optional
//          argument.
//          vbHandleByCmd   - (R) True = Command processes *this option, false =
//          not handled.
// Return:  None.
// Throws:  None.
//--
template <class T>
CMICmdArgValBaseTemplate<T>::CMICmdArgValBaseTemplate(
    const CMIUtilString &vrArgName, const bool vbMandatory,
    const bool vbHandleByCmd)
    : CMICmdArgValBase(vrArgName, vbMandatory, vbHandleByCmd) {}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the value the argument parsed from the command's argument /
// options
//          text string.
// Type:    Method.
// Args:    None.
// Return:  Template type & - The arg value of *this object.
// Throws:  None.
//--
template <class T> const T &CMICmdArgValBaseTemplate<T>::GetValue() const {
  return m_argValue;
}
