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