1*f9d8bbeeSJim Ingham //===-- OptionGroupPythonClassWithDict.cpp ----------------------------------*- C++ -*-===// 2943a2481SJim Ingham // 3943a2481SJim Ingham // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4943a2481SJim Ingham // See https://llvm.org/LICENSE.txt for license information. 5943a2481SJim Ingham // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6943a2481SJim Ingham // 7943a2481SJim Ingham //===----------------------------------------------------------------------===// 8943a2481SJim Ingham 9943a2481SJim Ingham #include "lldb/Interpreter/OptionGroupPythonClassWithDict.h" 10943a2481SJim Ingham 11943a2481SJim Ingham #include "lldb/Host/OptionParser.h" 12943a2481SJim Ingham 13943a2481SJim Ingham using namespace lldb; 14943a2481SJim Ingham using namespace lldb_private; 15943a2481SJim Ingham 16943a2481SJim Ingham OptionGroupPythonClassWithDict::OptionGroupPythonClassWithDict 17943a2481SJim Ingham (const char *class_use, 18943a2481SJim Ingham int class_option, 19943a2481SJim Ingham int key_option, 20943a2481SJim Ingham int value_option, 21943a2481SJim Ingham char *class_long_option, 22943a2481SJim Ingham const char *key_long_option, 23943a2481SJim Ingham const char *value_long_option, 24943a2481SJim Ingham bool required) { 25943a2481SJim Ingham m_key_usage_text.assign("The key for a key/value pair passed to the class" 26943a2481SJim Ingham " that implements a "); 27943a2481SJim Ingham m_key_usage_text.append(class_use); 28943a2481SJim Ingham m_key_usage_text.append(". Pairs can be specified more than once."); 29943a2481SJim Ingham 30943a2481SJim Ingham m_value_usage_text.assign("The value for a previous key in the pair passed to" 31943a2481SJim Ingham " the class that implements a "); 32943a2481SJim Ingham m_value_usage_text.append(class_use); 33943a2481SJim Ingham m_value_usage_text.append(". Pairs can be specified more than once."); 34943a2481SJim Ingham 35943a2481SJim Ingham m_class_usage_text.assign("The name of the class that will manage a "); 36943a2481SJim Ingham m_class_usage_text.append(class_use); 37943a2481SJim Ingham m_class_usage_text.append("."); 38943a2481SJim Ingham 39943a2481SJim Ingham m_option_definition[0].usage_mask = LLDB_OPT_SET_1; 40943a2481SJim Ingham m_option_definition[0].required = required; 41943a2481SJim Ingham m_option_definition[0].long_option = class_long_option; 42943a2481SJim Ingham m_option_definition[0].short_option = class_option; 43943a2481SJim Ingham m_option_definition[0].validator = nullptr; 44943a2481SJim Ingham m_option_definition[0].option_has_arg = OptionParser::eRequiredArgument; 45943a2481SJim Ingham m_option_definition[0].enum_values = {}; 46943a2481SJim Ingham m_option_definition[0].completion_type = 0; 47943a2481SJim Ingham m_option_definition[0].argument_type = eArgTypePythonClass; 48943a2481SJim Ingham m_option_definition[0].usage_text = m_class_usage_text.data(); 49943a2481SJim Ingham 50943a2481SJim Ingham m_option_definition[1].usage_mask = LLDB_OPT_SET_1; 51943a2481SJim Ingham m_option_definition[1].required = required; 52943a2481SJim Ingham m_option_definition[1].long_option = key_long_option; 53943a2481SJim Ingham m_option_definition[1].short_option = key_option; 54943a2481SJim Ingham m_option_definition[1].validator = nullptr; 55943a2481SJim Ingham m_option_definition[1].option_has_arg = OptionParser::eRequiredArgument; 56943a2481SJim Ingham m_option_definition[1].enum_values = {}; 57943a2481SJim Ingham m_option_definition[1].completion_type = 0; 58943a2481SJim Ingham m_option_definition[1].argument_type = eArgTypeNone; 59943a2481SJim Ingham m_option_definition[1].usage_text = m_key_usage_text.data(); 60943a2481SJim Ingham 61943a2481SJim Ingham m_option_definition[2].usage_mask = LLDB_OPT_SET_1; 62943a2481SJim Ingham m_option_definition[2].required = required; 63943a2481SJim Ingham m_option_definition[2].long_option = value_long_option; 64943a2481SJim Ingham m_option_definition[2].short_option = value_option; 65943a2481SJim Ingham m_option_definition[2].validator = nullptr; 66943a2481SJim Ingham m_option_definition[2].option_has_arg = OptionParser::eRequiredArgument; 67943a2481SJim Ingham m_option_definition[2].enum_values = {}; 68943a2481SJim Ingham m_option_definition[2].completion_type = 0; 69943a2481SJim Ingham m_option_definition[2].argument_type = eArgTypeNone; 70943a2481SJim Ingham m_option_definition[2].usage_text = m_value_usage_text.data(); 71943a2481SJim Ingham } 72943a2481SJim Ingham 73943a2481SJim Ingham OptionGroupPythonClassWithDict::~OptionGroupPythonClassWithDict() {} 74943a2481SJim Ingham 75943a2481SJim Ingham Status OptionGroupPythonClassWithDict::SetOptionValue( 76943a2481SJim Ingham uint32_t option_idx, 77943a2481SJim Ingham llvm::StringRef option_arg, 78943a2481SJim Ingham ExecutionContext *execution_context) { 79943a2481SJim Ingham Status error; 80943a2481SJim Ingham const int short_option = m_option_definition[option_idx].short_option; 81943a2481SJim Ingham switch (option_idx) { 82943a2481SJim Ingham case 0: { 83943a2481SJim Ingham m_class_name.assign(option_arg); 84943a2481SJim Ingham } break; 85943a2481SJim Ingham case 1: { 86943a2481SJim Ingham if (m_current_key.empty()) 87943a2481SJim Ingham m_current_key.assign(option_arg); 88943a2481SJim Ingham else 89943a2481SJim Ingham error.SetErrorStringWithFormat("Key: \"%s\" missing value.", 90943a2481SJim Ingham m_current_key.c_str()); 91943a2481SJim Ingham 92943a2481SJim Ingham } break; 93943a2481SJim Ingham case 2: { 94943a2481SJim Ingham if (!m_current_key.empty()) { 95943a2481SJim Ingham m_dict_sp->AddStringItem(m_current_key, option_arg); 96943a2481SJim Ingham m_current_key.clear(); 97943a2481SJim Ingham } 98943a2481SJim Ingham else 99943a2481SJim Ingham error.SetErrorStringWithFormat("Value: \"%s\" missing matching key.", 100943a2481SJim Ingham option_arg.str().c_str()); 101943a2481SJim Ingham } break; 102943a2481SJim Ingham default: 103943a2481SJim Ingham llvm_unreachable("Unimplemented option"); 104943a2481SJim Ingham } 105943a2481SJim Ingham return error; 106943a2481SJim Ingham } 107943a2481SJim Ingham 108943a2481SJim Ingham void OptionGroupPythonClassWithDict::OptionParsingStarting( 109943a2481SJim Ingham ExecutionContext *execution_context) { 110943a2481SJim Ingham m_current_key.erase(); 111943a2481SJim Ingham m_dict_sp = std::make_shared<StructuredData::Dictionary>(); 112943a2481SJim Ingham } 113943a2481SJim Ingham 114943a2481SJim Ingham Status OptionGroupPythonClassWithDict::OptionParsingFinished( 115943a2481SJim Ingham ExecutionContext *execution_context) { 116943a2481SJim Ingham Status error; 117943a2481SJim Ingham // If we get here and there's contents in the m_current_key, somebody must 118943a2481SJim Ingham // have provided a key but no value. 119943a2481SJim Ingham if (!m_current_key.empty()) 120943a2481SJim Ingham error.SetErrorStringWithFormat("Key: \"%s\" missing value.", 121943a2481SJim Ingham m_current_key.c_str()); 122943a2481SJim Ingham return error; 123943a2481SJim Ingham } 124943a2481SJim Ingham 125