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

#include "MICmdArgValBase.h"
#include "MICmdArgContext.h"
#include "MIUtilString.h"

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValBase constructor.
// Type:    Method.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmdArgValBase::CMICmdArgValBase()
    : m_bFound(false), m_bValid(false), m_bMandatory(false), m_bHandled(false),
      m_bIsMissingOptions(false) {}

//++
//------------------------------------------------------------------------------------
// Details: CMICmdArgValBase 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.
//--
CMICmdArgValBase::CMICmdArgValBase(const CMIUtilString &vrArgName,
                                   const bool vbMandatory,
                                   const bool vbHandleByCmd)
    : m_bFound(false), m_bValid(false), m_bMandatory(vbMandatory),
      m_strArgName(vrArgName), m_bHandled(vbHandleByCmd),
      m_bIsMissingOptions(false) {}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the state flag of whether the argument is handled by the
// command or
//          not.
// Type:    Method.
// Args:    None.
// Return:  True - Command needs more information.
//          False - All information is present as expected.
// Throws:  None.
//--
bool CMICmdArgValBase::GetIsMissingOptions() const {
  return m_bIsMissingOptions;
}

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the state flag of whether the argument is handled by the
// command or
//          not.
// Type:    Method.
// Args:    None.
// Return:  True - Command handles *this argument or option.
//          False - Not handled (argument specified but ignored).
// Throws:  None.
//--
bool CMICmdArgValBase::GetIsHandledByCmd() const { return m_bHandled; }

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the name of *this argument.
// Type:    Method.
// Args:    None.
// Return:  CMIUtilString & - Return the text name.
// Throws:  None.
//--
const CMIUtilString &CMICmdArgValBase::GetName() const { return m_strArgName; }

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the state flag of whether the argument was found in the
// command's
//          argument / options string.
// Type:    Method.
// Args:    None.
// Return:  True - Argument found.
//          False - Argument not found.
// Throws:  None.
//--
bool CMICmdArgValBase::GetFound() const { return m_bFound; }

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the state flag indicating whether the value was obtained
// from the
//          text arguments string and is valid.
// Type:    Method.
// Args:    None.
// Return:  True - Argument valid.
//          False - Argument not valid.
// Throws:  None.
//--
bool CMICmdArgValBase::GetValid() const { return m_bValid; }

//++
//------------------------------------------------------------------------------------
// Details: Retrieve the state flag indicating whether *this argument is a
// mandatory
//          argument for the command or is optional to be present.
// Type:    Method.
// Args:    None.
// Return:  True - Mandatory.
//          False - Optional.
// Throws:  None.
//--
bool CMICmdArgValBase::GetIsMandatory() const { return m_bMandatory; }

//++
//------------------------------------------------------------------------------------
// Details: Parse the command's argument options string and try to extract the
// value *this
//          argument is looking for.
// Type:    Overrideable.
// Args:    vArgContext - (RW) The command's argument options string.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool CMICmdArgValBase::Validate(CMICmdArgContext &vwArgContext) {
  MIunused(vwArgContext);

  // Override to implement

  return MIstatus::failure;
}
