1*9dba64beSDimitry Andric //===-- OptionGroupPythonClassWithDict.cpp ----------------------------------*- C++ -*-===// 2*9dba64beSDimitry Andric // 3*9dba64beSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*9dba64beSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*9dba64beSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*9dba64beSDimitry Andric // 7*9dba64beSDimitry Andric //===----------------------------------------------------------------------===// 8*9dba64beSDimitry Andric 9*9dba64beSDimitry Andric #include "lldb/Interpreter/OptionGroupPythonClassWithDict.h" 10*9dba64beSDimitry Andric 11*9dba64beSDimitry Andric #include "lldb/Host/OptionParser.h" 12*9dba64beSDimitry Andric 13*9dba64beSDimitry Andric using namespace lldb; 14*9dba64beSDimitry Andric using namespace lldb_private; 15*9dba64beSDimitry Andric 16*9dba64beSDimitry Andric OptionGroupPythonClassWithDict::OptionGroupPythonClassWithDict 17*9dba64beSDimitry Andric (const char *class_use, 18*9dba64beSDimitry Andric int class_option, 19*9dba64beSDimitry Andric int key_option, 20*9dba64beSDimitry Andric int value_option, 21*9dba64beSDimitry Andric const char *class_long_option, 22*9dba64beSDimitry Andric const char *key_long_option, 23*9dba64beSDimitry Andric const char *value_long_option, 24*9dba64beSDimitry Andric bool required) { 25*9dba64beSDimitry Andric m_key_usage_text.assign("The key for a key/value pair passed to the class" 26*9dba64beSDimitry Andric " that implements a "); 27*9dba64beSDimitry Andric m_key_usage_text.append(class_use); 28*9dba64beSDimitry Andric m_key_usage_text.append(". Pairs can be specified more than once."); 29*9dba64beSDimitry Andric 30*9dba64beSDimitry Andric m_value_usage_text.assign("The value for a previous key in the pair passed to" 31*9dba64beSDimitry Andric " the class that implements a "); 32*9dba64beSDimitry Andric m_value_usage_text.append(class_use); 33*9dba64beSDimitry Andric m_value_usage_text.append(". Pairs can be specified more than once."); 34*9dba64beSDimitry Andric 35*9dba64beSDimitry Andric m_class_usage_text.assign("The name of the class that will manage a "); 36*9dba64beSDimitry Andric m_class_usage_text.append(class_use); 37*9dba64beSDimitry Andric m_class_usage_text.append("."); 38*9dba64beSDimitry Andric 39*9dba64beSDimitry Andric m_option_definition[0].usage_mask = LLDB_OPT_SET_1; 40*9dba64beSDimitry Andric m_option_definition[0].required = required; 41*9dba64beSDimitry Andric m_option_definition[0].long_option = class_long_option; 42*9dba64beSDimitry Andric m_option_definition[0].short_option = class_option; 43*9dba64beSDimitry Andric m_option_definition[0].validator = nullptr; 44*9dba64beSDimitry Andric m_option_definition[0].option_has_arg = OptionParser::eRequiredArgument; 45*9dba64beSDimitry Andric m_option_definition[0].enum_values = {}; 46*9dba64beSDimitry Andric m_option_definition[0].completion_type = 0; 47*9dba64beSDimitry Andric m_option_definition[0].argument_type = eArgTypePythonClass; 48*9dba64beSDimitry Andric m_option_definition[0].usage_text = m_class_usage_text.data(); 49*9dba64beSDimitry Andric 50*9dba64beSDimitry Andric m_option_definition[1].usage_mask = LLDB_OPT_SET_1; 51*9dba64beSDimitry Andric m_option_definition[1].required = required; 52*9dba64beSDimitry Andric m_option_definition[1].long_option = key_long_option; 53*9dba64beSDimitry Andric m_option_definition[1].short_option = key_option; 54*9dba64beSDimitry Andric m_option_definition[1].validator = nullptr; 55*9dba64beSDimitry Andric m_option_definition[1].option_has_arg = OptionParser::eRequiredArgument; 56*9dba64beSDimitry Andric m_option_definition[1].enum_values = {}; 57*9dba64beSDimitry Andric m_option_definition[1].completion_type = 0; 58*9dba64beSDimitry Andric m_option_definition[1].argument_type = eArgTypeNone; 59*9dba64beSDimitry Andric m_option_definition[1].usage_text = m_key_usage_text.data(); 60*9dba64beSDimitry Andric 61*9dba64beSDimitry Andric m_option_definition[2].usage_mask = LLDB_OPT_SET_1; 62*9dba64beSDimitry Andric m_option_definition[2].required = required; 63*9dba64beSDimitry Andric m_option_definition[2].long_option = value_long_option; 64*9dba64beSDimitry Andric m_option_definition[2].short_option = value_option; 65*9dba64beSDimitry Andric m_option_definition[2].validator = nullptr; 66*9dba64beSDimitry Andric m_option_definition[2].option_has_arg = OptionParser::eRequiredArgument; 67*9dba64beSDimitry Andric m_option_definition[2].enum_values = {}; 68*9dba64beSDimitry Andric m_option_definition[2].completion_type = 0; 69*9dba64beSDimitry Andric m_option_definition[2].argument_type = eArgTypeNone; 70*9dba64beSDimitry Andric m_option_definition[2].usage_text = m_value_usage_text.data(); 71*9dba64beSDimitry Andric } 72*9dba64beSDimitry Andric 73*9dba64beSDimitry Andric OptionGroupPythonClassWithDict::~OptionGroupPythonClassWithDict() {} 74*9dba64beSDimitry Andric 75*9dba64beSDimitry Andric Status OptionGroupPythonClassWithDict::SetOptionValue( 76*9dba64beSDimitry Andric uint32_t option_idx, 77*9dba64beSDimitry Andric llvm::StringRef option_arg, 78*9dba64beSDimitry Andric ExecutionContext *execution_context) { 79*9dba64beSDimitry Andric Status error; 80*9dba64beSDimitry Andric switch (option_idx) { 81*9dba64beSDimitry Andric case 0: { 82*9dba64beSDimitry Andric m_class_name.assign(option_arg); 83*9dba64beSDimitry Andric } break; 84*9dba64beSDimitry Andric case 1: { 85*9dba64beSDimitry Andric if (m_current_key.empty()) 86*9dba64beSDimitry Andric m_current_key.assign(option_arg); 87*9dba64beSDimitry Andric else 88*9dba64beSDimitry Andric error.SetErrorStringWithFormat("Key: \"%s\" missing value.", 89*9dba64beSDimitry Andric m_current_key.c_str()); 90*9dba64beSDimitry Andric 91*9dba64beSDimitry Andric } break; 92*9dba64beSDimitry Andric case 2: { 93*9dba64beSDimitry Andric if (!m_current_key.empty()) { 94*9dba64beSDimitry Andric m_dict_sp->AddStringItem(m_current_key, option_arg); 95*9dba64beSDimitry Andric m_current_key.clear(); 96*9dba64beSDimitry Andric } 97*9dba64beSDimitry Andric else 98*9dba64beSDimitry Andric error.SetErrorStringWithFormat("Value: \"%s\" missing matching key.", 99*9dba64beSDimitry Andric option_arg.str().c_str()); 100*9dba64beSDimitry Andric } break; 101*9dba64beSDimitry Andric default: 102*9dba64beSDimitry Andric llvm_unreachable("Unimplemented option"); 103*9dba64beSDimitry Andric } 104*9dba64beSDimitry Andric return error; 105*9dba64beSDimitry Andric } 106*9dba64beSDimitry Andric 107*9dba64beSDimitry Andric void OptionGroupPythonClassWithDict::OptionParsingStarting( 108*9dba64beSDimitry Andric ExecutionContext *execution_context) { 109*9dba64beSDimitry Andric m_current_key.erase(); 110*9dba64beSDimitry Andric m_dict_sp = std::make_shared<StructuredData::Dictionary>(); 111*9dba64beSDimitry Andric } 112*9dba64beSDimitry Andric 113*9dba64beSDimitry Andric Status OptionGroupPythonClassWithDict::OptionParsingFinished( 114*9dba64beSDimitry Andric ExecutionContext *execution_context) { 115*9dba64beSDimitry Andric Status error; 116*9dba64beSDimitry Andric // If we get here and there's contents in the m_current_key, somebody must 117*9dba64beSDimitry Andric // have provided a key but no value. 118*9dba64beSDimitry Andric if (!m_current_key.empty()) 119*9dba64beSDimitry Andric error.SetErrorStringWithFormat("Key: \"%s\" missing value.", 120*9dba64beSDimitry Andric m_current_key.c_str()); 121*9dba64beSDimitry Andric return error; 122*9dba64beSDimitry Andric } 123*9dba64beSDimitry Andric 124