本文整理汇总了C++中json_ref类的典型用法代码示例。如果您正苦于以下问题:C++ json_ref类的具体用法?C++ json_ref怎么用?C++ json_ref使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了json_ref类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: w_query_expr_parse
/* parse an expression term. It can be one of:
* "term"
* ["term" <parameters>]
*/
std::unique_ptr<QueryExpr> w_query_expr_parse(
w_query* query,
const json_ref& exp) {
w_string name;
if (exp.isString()) {
name = json_to_w_string(exp);
} else if (exp.isArray() && json_array_size(exp) > 0) {
const auto& first = exp.at(0);
if (!first.isString()) {
throw QueryParseError("first element of an expression must be a string");
}
name = json_to_w_string(first);
} else {
throw QueryParseError("expected array or string for an expression");
}
auto it = term_hash().find(name);
if (it == term_hash().end()) {
throw QueryParseError(
watchman::to<std::string>("unknown expression term '", name, "'"));
}
return it->second(query, exp);
}
开发者ID:facebook,项目名称:watchman,代码行数:29,代码来源:parse.cpp
示例2: cfg_pretty_print_root_files
// Produces a string like: "`foo`, `bar`, and `baz`"
std::string cfg_pretty_print_root_files(const json_ref& root_files) {
std::string result;
for (unsigned int i = 0; i < root_files.array().size(); ++i) {
const auto& r = root_files.array()[i];
if (i > 1 && i == root_files.array().size() - 1) {
// We are last in a list of multiple items
result.append(", and ");
} else if (i > 0) {
result.append(", ");
}
result.append("`");
result.append(json_string_value(r));
result.append("`");
}
return result;
}
开发者ID:facebook,项目名称:watchman,代码行数:17,代码来源:cfg.cpp
示例3: w_cmd_realpath_root
bool w_cmd_realpath_root(json_ref& args, char** errmsg) {
const char *path;
if (json_array_size(args) < 2) {
ignore_result(asprintf(errmsg, "wrong number of arguments"));
return false;
}
path = json_string_value(json_array_get(args, 1));
if (!path) {
ignore_result(asprintf(errmsg, "second argument must be a string"));
return false;
}
try {
auto resolved = realPath(path);
args.array()[1] = w_string_to_json(resolved);
return true;
} catch (const std::exception &exc) {
watchman::log(watchman::DBG, "w_cmd_realpath_root: path ", path,
" does not resolve: ", exc.what(), "\n");
// We don't treat this as an error; the caller will subsequently
// fail and perform their usual error handling
return true;
}
}
开发者ID:facebook,项目名称:watchman,代码行数:26,代码来源:watch.cpp
示例4: parse_suffixes
static void parse_suffixes(w_query* res, const json_ref& query) {
size_t i;
auto suffixes = query.get_default("suffix");
if (!suffixes) {
return;
}
if (suffixes.isString()) {
auto suff = parse_suffix(suffixes);
res->suffixes.emplace_back(std::move(suff));
return;
}
if (!suffixes.isArray()) {
throw QueryParseError("'suffix' must be a string or an array of strings");
}
res->suffixes.reserve(json_array_size(suffixes));
for (i = 0; i < json_array_size(suffixes); i++) {
const auto& ele = suffixes.at(i);
if (!ele.isString()) {
throw QueryParseError("'suffix' must be a string or an array of strings");
}
auto suff = parse_suffix(ele);
res->suffixes.emplace_back(std::move(suff));
}
}
开发者ID:facebook,项目名称:watchman,代码行数:31,代码来源:parse.cpp
示例5: parse_suffix
static w_string parse_suffix(const json_ref& ele) {
if (!ele.isString()) {
throw QueryParseError("'suffix' must be a string or an array of strings");
}
auto str = json_to_w_string(ele);
return str.piece().asLowerCase(str.type());
}
开发者ID:facebook,项目名称:watchman,代码行数:9,代码来源:parse.cpp
示例6: parse_query_expression
static void parse_query_expression(w_query* res, const json_ref& query) {
auto exp = query.get_default("expression");
if (!exp) {
// Empty expression means that we emit all generated files
return;
}
res->expr = w_query_expr_parse(res, exp);
}
开发者ID:facebook,项目名称:watchman,代码行数:9,代码来源:parse.cpp
示例7: json_args_to_string_vec
static std::vector<w_string_piece> json_args_to_string_vec(
const json_ref& args) {
std::vector<w_string_piece> vec;
for (auto& arg : args.array()) {
vec.emplace_back(json_to_w_string(arg));
}
return vec;
}
开发者ID:otrempe,项目名称:watchman,代码行数:10,代码来源:ChildProcess.cpp
示例8: parse_benchmark
static void parse_benchmark(w_query* res, const json_ref& query) {
// Preserve behavior by supporting a boolean value. Also support int values.
auto bench = query.get_default("bench");
if (bench) {
if (bench.isBool()) {
res->bench_iterations = 100;
} else {
res->bench_iterations = json_integer_value(bench);
}
}
}
开发者ID:facebook,项目名称:watchman,代码行数:11,代码来源:parse.cpp
示例9: parse_request_id
static void parse_request_id(w_query* res, const json_ref& query) {
auto request_id = query.get_default("request_id");
if (!request_id) {
return;
}
if (!request_id.isString()) {
throw QueryParseError("'request_id' must be a string");
}
res->request_id = json_to_w_string(request_id);
}
开发者ID:facebook,项目名称:watchman,代码行数:12,代码来源:parse.cpp
示例10: is_array_of_strings
// Return true if the json ref is an array of string values
static bool is_array_of_strings(const json_ref& ref) {
uint32_t i;
if (!ref.isArray()) {
return false;
}
for (i = 0; i < json_array_size(ref); i++) {
if (!json_array_get(ref, i).isString()) {
return false;
}
}
return true;
}
开发者ID:facebook,项目名称:watchman,代码行数:15,代码来源:cfg.cpp
示例11: query_caps
static bool query_caps(
json_ref& response,
json_ref& result,
const json_ref& arr,
bool required) {
size_t i;
bool have_all = true;
for (i = 0; i < json_array_size(arr); i++) {
const auto& ele = arr.at(i);
const char* capname = json_string_value(ele);
bool have = w_capability_supported(json_to_w_string(ele));
if (!have) {
have_all = false;
}
if (!capname) {
break;
}
result.set(capname, json_boolean(have));
if (required && !have) {
char *buf = NULL;
ignore_result(asprintf(
&buf,
"client required capability `%s` is not supported by this server",
capname));
response.set("error", typed_string_to_json(buf, W_STRING_UNICODE));
w_log(W_LOG_ERR, "version: %s\n", buf);
free(buf);
// Only trigger the error on the first one we hit. Ideally
// we'd tell the user about all of them, but it is a PITA to
// join and print them here in C :-/
required = false;
}
}
return have_all;
}
开发者ID:facebook,项目名称:watchman,代码行数:37,代码来源:info.cpp
示例12: QueryParseError
LocalSavedStateInterface::LocalSavedStateInterface(
const json_ref& savedStateConfig,
const SCM* scm)
: SavedStateInterface(savedStateConfig), scm_(scm) {
// Max commits to search in source control history for a saved state
auto maxCommits = savedStateConfig.get_default("max-commits");
if (maxCommits) {
if (!maxCommits.isInt()) {
throw QueryParseError("'max-commits' must be an integer");
}
maxCommits_ = json_integer_value(maxCommits);
if (maxCommits_ < 1) {
throw QueryParseError("'max-commits' must be a positive integer");
}
} else {
maxCommits_ = kDefaultMaxCommits;
}
// Local path to search for saved states. This path will only ever be read,
// never written.
auto localStoragePath = savedStateConfig.get_default("local-storage-path");
if (!localStoragePath) {
throw QueryParseError(
"'local-storage-path' must be present in saved state config");
}
if (!localStoragePath.isString()) {
throw QueryParseError("'local-storage-path' must be a string");
}
localStoragePath_ = json_to_w_string(localStoragePath);
if (!w_string_path_is_absolute(localStoragePath_)) {
throw QueryParseError("'local-storage-path' must be an absolute path");
}
// The saved state project must be a sub-directory in the local storage
// path.
if (w_string_path_is_absolute(project_)) {
throw QueryParseError("'project' must be a relative path");
}
}
开发者ID:facebook,项目名称:watchman,代码行数:37,代码来源:LocalSavedStateInterface.cpp
示例13: parse_since
static bool parse_since(w_query* res, const json_ref& query) {
auto since = query.get_default("since");
if (!since) {
return true;
}
auto spec = ClockSpec::parseOptionalClockSpec(since);
if (spec) {
// res owns the ref to spec
res->since_spec = std::move(spec);
return true;
}
throw QueryParseError("invalid value for 'since'");
}
开发者ID:facebook,项目名称:watchman,代码行数:15,代码来源:parse.cpp
示例14: parse_relative_root
static void parse_relative_root(
const std::shared_ptr<w_root_t>& root,
w_query* res,
const json_ref& query) {
auto relative_root = query.get_default("relative_root");
if (!relative_root) {
return;
}
if (!relative_root.isString()) {
throw QueryParseError("'relative_root' must be a string");
}
auto path = json_to_w_string(relative_root).normalizeSeparators();
auto canon_path = w_string_canon_path(path);
res->relative_root = w_string::pathCat({root->root_path, canon_path});
res->relative_root_slash =
w_string::printf("%s/", res->relative_root.c_str());
}
开发者ID:facebook,项目名称:watchman,代码行数:19,代码来源:parse.cpp
示例15: cmd_debug_set_subscriptions_paused
static void cmd_debug_set_subscriptions_paused(
struct watchman_client* clientbase,
const json_ref& args) {
auto client = (struct watchman_user_client*)clientbase;
const auto& paused = args.at(1);
auto& paused_map = paused.object();
for (auto& it : paused_map) {
auto sub_iter = client->subscriptions.find(it.first);
if (sub_iter == client->subscriptions.end()) {
send_error_response(
client,
"this client does not have a subscription named '%s'",
it.first.c_str());
return;
}
if (!json_is_boolean(it.second)) {
send_error_response(
client,
"new value for subscription '%s' not a boolean",
it.first.c_str());
return;
}
}
auto states = json_object();
for (auto& it : paused_map) {
auto sub_iter = client->subscriptions.find(it.first);
bool old_paused = sub_iter->second->debug_paused;
bool new_paused = json_is_true(it.second);
sub_iter->second->debug_paused = new_paused;
states.set(
it.first,
json_object({{"old", json_boolean(old_paused)}, {"new", it.second}}));
}
auto resp = make_response();
resp.set("paused", std::move(states));
send_and_dispose_response(clientbase, std::move(resp));
}
开发者ID:niclasr,项目名称:watchman,代码行数:41,代码来源:debug.cpp
示例16: parse_paths
static bool parse_paths(w_query* res, const json_ref& query) {
size_t i;
auto paths = query.get_default("path");
if (!paths) {
return true;
}
if (!paths.isArray()) {
throw QueryParseError("'path' must be an array");
}
res->paths.resize(json_array_size(paths));
for (i = 0; i < json_array_size(paths); i++) {
const auto& ele = paths.at(i);
w_string name;
res->paths[i].depth = -1;
if (ele.isString()) {
name = json_to_w_string(ele);
} else if (ele.isObject()) {
name = json_to_w_string(ele.get("path"));
auto depth = ele.get("depth");
if (!depth.isInt()) {
throw QueryParseError("path.depth must be an integer");
}
res->paths[i].depth = json_integer_value(depth);
} else {
throw QueryParseError(
"expected object with 'path' and 'depth' properties");
}
res->paths[i].name = name.normalizeSeparators();
}
return true;
}
开发者ID:facebook,项目名称:watchman,代码行数:41,代码来源:parse.cpp
示例17: parse_globs
void parse_globs(w_query* res, const json_ref& query) {
size_t i;
int noescape = 0;
int includedotfiles = 0;
auto globs = query.get_default("glob");
if (!globs) {
return;
}
if (!json_is_array(globs)) {
throw QueryParseError("'glob' must be an array");
}
// Globs implicitly enable dedup_results mode
res->dedup_results = true;
if (json_unpack(query, "{s?b}", "glob_noescape", &noescape) != 0) {
throw QueryParseError("glob_noescape must be a boolean");
}
if (json_unpack(query, "{s?b}", "glob_includedotfiles", &includedotfiles) !=
0) {
throw QueryParseError("glob_includedotfiles must be a boolean");
}
res->glob_flags =
(includedotfiles ? 0 : WM_PERIOD) | (noescape ? WM_NOESCAPE : 0);
res->glob_tree = watchman::make_unique<watchman_glob_tree>("", 0);
for (i = 0; i < json_array_size(globs); i++) {
const auto& ele = globs.at(i);
const auto& pattern = json_to_w_string(ele);
if (!add_glob(res->glob_tree.get(), pattern)) {
throw QueryParseError("failed to compile multi-glob");
}
}
}
开发者ID:otrempe,项目名称:watchman,代码行数:39,代码来源:glob.cpp
示例18: w_query_parse
std::shared_ptr<w_query> w_query_parse(
const std::shared_ptr<w_root_t>& root,
const json_ref& query) {
auto result = std::make_shared<w_query>();
auto res = result.get();
parse_benchmark(res, query);
parse_case_sensitive(res, root, query);
parse_sync(res, query);
parse_dedup(res, query);
parse_lock_timeout(res, query);
parse_relative_root(root, res, query);
parse_empty_on_fresh_instance(res, query);
/* Look for path generators */
parse_paths(res, query);
/* Look for glob generators */
parse_globs(res, query);
/* Look for suffix generators */
parse_suffixes(res, query);
/* Look for since generator */
parse_since(res, query);
parse_query_expression(res, query);
parse_request_id(res, query);
parse_field_list(query.get_default("fields"), &res->fieldList);
res->query_spec = query;
return result;
}
开发者ID:facebook,项目名称:watchman,代码行数:36,代码来源:parse.cpp
示例19: cmd_version
/* version */
static void cmd_version(struct watchman_client* client, const json_ref& args) {
auto resp = make_response();
#ifdef WATCHMAN_BUILD_INFO
resp.set(
"buildinfo", typed_string_to_json(WATCHMAN_BUILD_INFO, W_STRING_UNICODE));
#endif
/* ["version"]
* -> just returns the basic version information.
* ["version", {"required": ["foo"], "optional": ["bar"]}]
* -> includes capability matching information
*/
if (json_array_size(args) == 2) {
const auto& arg_obj = args.at(1);
auto req_cap = arg_obj.get_default("required");
auto opt_cap = arg_obj.get_default("optional");
auto cap_res = json_object_of_size(
(opt_cap ? json_array_size(opt_cap) : 0) +
(req_cap ? json_array_size(req_cap) : 0));
if (opt_cap && opt_cap.isArray()) {
query_caps(resp, cap_res, opt_cap, false);
}
if (req_cap && req_cap.isArray()) {
query_caps(resp, cap_res, req_cap, true);
}
resp.set("capabilities", std::move(cap_res));
}
send_and_dispose_response(client, std::move(resp));
}
开发者ID:facebook,项目名称:watchman,代码行数:37,代码来源:info.cpp
示例20: parse
static std::unique_ptr<QueryExpr>
parse(w_query*, const json_ref& term, CaseSensitivity caseSensitive) {
const char *pattern = nullptr, *scope = "basename";
const char *which =
caseSensitive == CaseSensitivity::CaseInSensitive ? "iname" : "name";
std::unordered_set<w_string> set;
if (!term.isArray()) {
throw QueryParseError("Expected array for '", which, "' term");
}
if (json_array_size(term) > 3) {
throw QueryParseError(
"Invalid number of arguments for '", which, "' term");
}
if (json_array_size(term) == 3) {
const auto& jscope = term.at(2);
if (!jscope.isString()) {
throw QueryParseError("Argument 3 to '", which, "' must be a string");
}
scope = json_string_value(jscope);
if (strcmp(scope, "basename") && strcmp(scope, "wholename")) {
throw QueryParseError(
"Invalid scope '", scope, "' for ", which, " expression");
}
}
const auto& name = term.at(1);
if (name.isArray()) {
uint32_t i;
for (i = 0; i < json_array_size(name); i++) {
if (!json_array_get(name, i).isString()) {
throw QueryParseError(
"Argument 2 to '",
which,
"' must be either a string or an array of string");
}
}
set.reserve(json_array_size(name));
for (i = 0; i < json_array_size(name); i++) {
w_string element;
const auto& jele = name.at(i);
auto ele = json_to_w_string(jele);
if (caseSensitive == CaseSensitivity::CaseInSensitive) {
element = ele.piece().asLowerCase(ele.type()).normalizeSeparators();
} else {
element = ele.normalizeSeparators();
}
set.insert(element);
}
} else if (name.isString()) {
pattern = json_string_value(name);
} else {
throw QueryParseError(
"Argument 2 to '",
which,
"' must be either a string or an array of string");
}
auto data = new NameExpr(std::move(set), caseSensitive,
!strcmp(scope, "wholename"));
if (pattern) {
data->name = json_to_w_string(name).normalizeSeparators();
}
return std::unique_ptr<QueryExpr>(data);
}
开发者ID:facebook,项目名称:watchman,代码行数:77,代码来源:name.cpp
注:本文中的json_ref类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论