migrate from dynamic::Value to dv::value & total erase namespace 'dynamic'
This commit is contained in:
@@ -59,7 +59,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
dynamic::Value parseValue() {
|
||||
dv::value parseValue() {
|
||||
char c = peek();
|
||||
if (is_cmd_identifier_start(c) || c == '@') {
|
||||
auto str = parseIdentifier(true);
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
} else if (str == "false") {
|
||||
return false;
|
||||
} else if (str == "none" || str == "nil" || str == "null") {
|
||||
return dynamic::NONE;
|
||||
return nullptr;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
@@ -116,8 +116,8 @@ public:
|
||||
enumname = parseEnum();
|
||||
}
|
||||
bool optional = false;
|
||||
dynamic::Value def {};
|
||||
dynamic::Value origin {};
|
||||
dv::value def;
|
||||
dv::value origin;
|
||||
bool loop = true;
|
||||
while (hasNext() && loop) {
|
||||
char c = peek();
|
||||
@@ -173,18 +173,17 @@ public:
|
||||
inline parsing_error typeError(
|
||||
const std::string& argname,
|
||||
const std::string& expected,
|
||||
const dynamic::Value& value
|
||||
const dv::value& value
|
||||
) {
|
||||
return argumentError(
|
||||
argname, expected + " expected, got " + dynamic::type_name(value)
|
||||
argname, expected + " expected, got " + dv::type_name(value)
|
||||
);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline bool typeCheck(
|
||||
Argument* arg, const dynamic::Value& value, const std::string& tname
|
||||
Argument* arg, dv::value_type type, const dv::value& value, const std::string& tname
|
||||
) {
|
||||
if (!std::holds_alternative<T>(value)) {
|
||||
if (value.getType() != type) {
|
||||
if (arg->optional) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -194,10 +193,11 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool selectorCheck(Argument* arg, const dynamic::Value& value) {
|
||||
if (auto string = std::get_if<std::string>(&value)) {
|
||||
if ((*string)[0] == '@') {
|
||||
if (!util::is_integer((*string).substr(1))) {
|
||||
inline bool selectorCheck(Argument* arg, const dv::value& value) {
|
||||
if (value.isString()) {
|
||||
const auto& string = value.asString();
|
||||
if (string[0] == '@') {
|
||||
if (!util::is_integer(string.substr(1))) {
|
||||
throw argumentError(arg->name, "invalid selector");
|
||||
}
|
||||
return true;
|
||||
@@ -210,12 +210,13 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
bool typeCheck(Argument* arg, const dynamic::Value& value) {
|
||||
bool typeCheck(Argument* arg, const dv::value& value) {
|
||||
switch (arg->type) {
|
||||
case ArgType::enumvalue: {
|
||||
if (auto* string = std::get_if<std::string>(&value)) {
|
||||
if (value.getType() == dv::value_type::string) {
|
||||
const auto& string = value.asString();
|
||||
auto& enumname = arg->enumname;
|
||||
if (enumname.find("|" + *string + "|") ==
|
||||
if (enumname.find("|" + string + "|") ==
|
||||
std::string::npos) {
|
||||
throw error(
|
||||
"argument " + util::quote(arg->name) +
|
||||
@@ -231,7 +232,7 @@ public:
|
||||
break;
|
||||
}
|
||||
case ArgType::number:
|
||||
if (!dynamic::is_numeric(value)) {
|
||||
if (!dv::is_numeric(value)) {
|
||||
if (arg->optional) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -242,9 +243,9 @@ public:
|
||||
case ArgType::selector:
|
||||
return selectorCheck(arg, value);
|
||||
case ArgType::integer:
|
||||
return typeCheck<integer_t>(arg, value, "integer");
|
||||
return typeCheck(arg, dv::value_type::integer, value, "integer");
|
||||
case ArgType::string:
|
||||
if (!std::holds_alternative<std::string>(value)) {
|
||||
if (!value.isString()) {
|
||||
return !arg->optional;
|
||||
}
|
||||
break;
|
||||
@@ -252,36 +253,35 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
dynamic::Value fetchOrigin(
|
||||
dv::value fetchOrigin(
|
||||
CommandsInterpreter* interpreter, Argument* arg
|
||||
) {
|
||||
if (dynamic::is_numeric(arg->origin)) {
|
||||
if (dv::is_numeric(arg->origin)) {
|
||||
return arg->origin;
|
||||
} else if (auto string = std::get_if<std::string>(&arg->origin)) {
|
||||
return (*interpreter)[*string];
|
||||
} else if (arg->origin.getType() == dv::value_type::string) {
|
||||
return (*interpreter)[arg->origin.asString()];
|
||||
}
|
||||
return dynamic::NONE;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
dynamic::Value applyRelative(
|
||||
Argument* arg, dynamic::Value value, const dynamic::Value& origin
|
||||
dv::value applyRelative(
|
||||
Argument* arg, dv::value value, const dv::value& origin
|
||||
) {
|
||||
if (origin.index() == 0) {
|
||||
if (origin == nullptr) {
|
||||
return value;
|
||||
}
|
||||
try {
|
||||
if (arg->type == ArgType::number) {
|
||||
return dynamic::get_number(origin) + dynamic::get_number(value);
|
||||
return origin.asNumber() + value.asNumber();
|
||||
} else {
|
||||
return dynamic::get_integer(origin) +
|
||||
dynamic::get_integer(value);
|
||||
return origin.asInteger() + value.asInteger();
|
||||
}
|
||||
} catch (std::runtime_error& err) {
|
||||
throw argumentError(arg->name, err.what());
|
||||
}
|
||||
}
|
||||
|
||||
dynamic::Value parseRelativeValue(
|
||||
dv::value parseRelativeValue(
|
||||
CommandsInterpreter* interpreter, Argument* arg
|
||||
) {
|
||||
if (arg->type != ArgType::number && arg->type != ArgType::integer) {
|
||||
@@ -293,13 +293,13 @@ public:
|
||||
return origin;
|
||||
}
|
||||
auto value = parseValue();
|
||||
if (origin.index() == 0) {
|
||||
if (origin == nullptr) {
|
||||
return value;
|
||||
}
|
||||
return applyRelative(arg, value, origin);
|
||||
}
|
||||
|
||||
inline dynamic::Value performKeywordArg(
|
||||
inline dv::value performKeywordArg(
|
||||
CommandsInterpreter* interpreter,
|
||||
Command* command,
|
||||
const std::string& key
|
||||
@@ -322,14 +322,14 @@ public:
|
||||
if (command == nullptr) {
|
||||
throw error("unknown command " + util::quote(name));
|
||||
}
|
||||
auto args = dynamic::create_list();
|
||||
auto kwargs = dynamic::create_map();
|
||||
auto args = dv::list();
|
||||
auto kwargs = dv::object();
|
||||
|
||||
int arg_index = 0;
|
||||
|
||||
while (hasNext()) {
|
||||
bool relative = false;
|
||||
dynamic::Value value = dynamic::NONE;
|
||||
dv::value value;
|
||||
if (peek() == '~') {
|
||||
relative = true;
|
||||
value = static_cast<integer_t>(0);
|
||||
@@ -338,18 +338,17 @@ public:
|
||||
|
||||
if (hasNext() && peekNoJump() != ' ') {
|
||||
value = parseValue();
|
||||
if (auto string = std::get_if<std::string>(&value)) {
|
||||
if ((*string)[0] == '$') {
|
||||
value = (*interpreter)[string->substr(1)];
|
||||
if (value.isString()) {
|
||||
const auto& string = value.asString();
|
||||
if (string[0] == '$') {
|
||||
value = (*interpreter)[string.substr(1)];
|
||||
}
|
||||
}
|
||||
|
||||
// keyword argument
|
||||
if (!relative && hasNext() && peek() == '=') {
|
||||
auto key = std::get<std::string>(value);
|
||||
kwargs->put(
|
||||
key, performKeywordArg(interpreter, command, key)
|
||||
);
|
||||
if (value.isString() && !relative && hasNext() && peek() == '=') {
|
||||
const auto& key = value.asString();
|
||||
kwargs[key] = performKeywordArg(interpreter, command, key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -357,21 +356,22 @@ public:
|
||||
Argument* arg = nullptr;
|
||||
do {
|
||||
if (arg) {
|
||||
if (auto string = std::get_if<std::string>(&arg->def)) {
|
||||
if ((*string)[0] == '$') {
|
||||
args->put((*interpreter)[string->substr(1)]);
|
||||
if (arg->def.isString()) {
|
||||
const auto& string = arg->def.asString();
|
||||
if (string[0] == '$') {
|
||||
args.add((*interpreter)[string.substr(1)]);
|
||||
} else {
|
||||
args->put(arg->def);
|
||||
args.add(arg->def);
|
||||
}
|
||||
} else {
|
||||
args->put(arg->def);
|
||||
args.add(arg->def);
|
||||
}
|
||||
}
|
||||
arg = command->getArgument(arg_index++);
|
||||
if (arg == nullptr) {
|
||||
throw error("extra positional argument");
|
||||
}
|
||||
if (arg->origin.index() && relative) {
|
||||
if (arg->origin != nullptr && relative) {
|
||||
break;
|
||||
}
|
||||
} while (!typeCheck(arg, value));
|
||||
@@ -380,20 +380,21 @@ public:
|
||||
value =
|
||||
applyRelative(arg, value, fetchOrigin(interpreter, arg));
|
||||
}
|
||||
args->put(value);
|
||||
args.add(value);
|
||||
}
|
||||
|
||||
while (auto arg = command->getArgument(arg_index++)) {
|
||||
if (!arg->optional) {
|
||||
throw error("missing argument " + util::quote(arg->name));
|
||||
} else {
|
||||
if (auto string = std::get_if<std::string>(&arg->def)) {
|
||||
if ((*string)[0] == '$') {
|
||||
args->put((*interpreter)[string->substr(1)]);
|
||||
if (arg->def.isString()) {
|
||||
const auto& string = arg->def.asString();
|
||||
if (string[0] == '$') {
|
||||
args.add((*interpreter)[string.substr(1)]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
args->put(arg->def);
|
||||
args.add(arg->def);
|
||||
}
|
||||
}
|
||||
return Prompt {command, args, kwargs};
|
||||
|
||||
Reference in New Issue
Block a user