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

#ifndef LLDB_INTERPRETER_OPTIONVALUEREGEX_H
#define LLDB_INTERPRETER_OPTIONVALUEREGEX_H

#include "lldb/Interpreter/OptionValue.h"
#include "lldb/Utility/RegularExpression.h"

namespace lldb_private {

class OptionValueRegex : public OptionValue {
public:
  OptionValueRegex(const char *value = nullptr)
      : OptionValue(), m_regex(llvm::StringRef::withNullAsEmpty(value)),
        m_default_regex_str(llvm::StringRef::withNullAsEmpty(value).str()) {}

  ~OptionValueRegex() override = default;

  // Virtual subclass pure virtual overrides

  OptionValue::Type GetType() const override { return eTypeRegex; }

  void DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
                 uint32_t dump_mask) override;

  Status
  SetValueFromString(llvm::StringRef value,
                     VarSetOperationType op = eVarSetOperationAssign) override;

  void Clear() override {
    m_regex = RegularExpression(m_default_regex_str);
    m_value_was_set = false;
  }

  lldb::OptionValueSP DeepCopy() const override;

  // Subclass specific functions
  const RegularExpression *GetCurrentValue() const {
    return (m_regex.IsValid() ? &m_regex : nullptr);
  }

  void SetCurrentValue(const char *value) {
    if (value && value[0])
      m_regex = RegularExpression(llvm::StringRef(value));
    else
      m_regex = RegularExpression();
  }

  bool IsValid() const { return m_regex.IsValid(); }

protected:
  RegularExpression m_regex;
  std::string m_default_regex_str;
};

} // namespace lldb_private

#endif // LLDB_INTERPRETER_OPTIONVALUEREGEX_H
