xref: /freebsd-src/contrib/llvm-project/lldb/source/Interpreter/OptionGroupPythonClassWithDict.cpp (revision 9dba64be9536c28e4800e06512b7f29b43ade345)
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