340 const std::vector<ResourceSchema>& schemas)
const {
341 std::vector<std::string> entries;
342 entries.reserve(schemas.size());
343 for (
const auto& resource : schemas) {
344 std::vector<std::string> action_entries;
345 action_entries.reserve(resource.actions.size());
346 for (
const auto& action : resource.actions) {
347 std::vector<std::string> arg_entries;
348 arg_entries.reserve(action.arguments.size());
349 for (
const auto& arg : action.arguments) {
350 arg_entries.push_back(absl::StrCat(
351 "{\"flag\":\"",
EscapeJson(arg.flag),
"\",\"type\":\"",
353 "\",\"required\":", arg.required ?
"true" :
"false",
354 ",\"description\":\"",
EscapeJson(arg.description),
"\"}"));
356 std::vector<std::string> effect_entries;
357 effect_entries.reserve(action.effects.size());
358 for (
const auto& effect : action.effects) {
359 effect_entries.push_back(absl::StrCat(
"\"",
EscapeJson(effect),
"\""));
361 std::vector<std::string> return_entries;
362 return_entries.reserve(action.returns.size());
363 for (
const auto& ret : action.returns) {
364 return_entries.push_back(absl::StrCat(
365 "{\"field\":\"",
EscapeJson(ret.field),
"\",\"type\":\"",
366 EscapeJson(ret.type),
"\",\"description\":\"",
369 action_entries.push_back(absl::StrCat(
370 "{\"name\":\"",
EscapeJson(action.name),
"\",\"synopsis\":\"",
371 EscapeJson(action.synopsis),
"\",\"stability\":\"",
372 EscapeJson(action.stability),
"\",\"arguments\":[",
373 absl::StrJoin(arg_entries,
","),
"],",
"\"effects\":[",
374 absl::StrJoin(effect_entries,
","),
"],",
"\"returns\":[",
375 absl::StrJoin(return_entries,
","),
"]}"));
377 entries.push_back(absl::StrCat(
378 "{\"resource\":\"",
EscapeJson(resource.resource),
379 "\",\"description\":\"",
EscapeJson(resource.description),
380 "\",\"actions\":[", absl::StrJoin(action_entries,
","),
"]}"));
382 return absl::StrCat(
"{\"resources\":[", absl::StrJoin(entries,
","),
"]}");
414 const std::vector<ResourceSchema>& schemas, absl::string_view version,
415 absl::string_view last_updated)
const {
417 absl::StrAppend(&out,
"# Auto-generated resource catalogue\n");
418 absl::StrAppend(&out,
"version: ",
EscapeYaml(version),
"\n");
419 absl::StrAppend(&out,
"last_updated: ",
EscapeYaml(last_updated),
"\n");
420 absl::StrAppend(&out,
"resources:\n");
422 for (
const auto& resource : schemas) {
423 absl::StrAppend(&out,
" - name: ",
EscapeYaml(resource.resource),
"\n");
424 absl::StrAppend(&out,
" description: ",
EscapeYaml(resource.description),
427 if (resource.actions.empty()) {
428 absl::StrAppend(&out,
" actions: []\n");
432 absl::StrAppend(&out,
" actions:\n");
433 for (
const auto& action : resource.actions) {
434 absl::StrAppend(&out,
" - name: ",
EscapeYaml(action.name),
"\n");
435 absl::StrAppend(&out,
" synopsis: ",
EscapeYaml(action.synopsis),
437 absl::StrAppend(&out,
" stability: ",
EscapeYaml(action.stability),
440 if (action.arguments.empty()) {
441 absl::StrAppend(&out,
" args: []\n");
443 absl::StrAppend(&out,
" args:\n");
444 for (
const auto& arg : action.arguments) {
445 absl::StrAppend(&out,
" - flag: ",
EscapeYaml(arg.flag),
447 absl::StrAppend(&out,
" type: ",
EscapeYaml(arg.type),
449 absl::StrAppend(&out,
" required: ",
450 arg.required ?
"true\n" :
"false\n");
451 absl::StrAppend(&out,
" description: ",
456 if (action.effects.empty()) {
457 absl::StrAppend(&out,
" effects: []\n");
459 absl::StrAppend(&out,
" effects:\n");
460 for (
const auto& effect : action.effects) {
461 absl::StrAppend(&out,
" - ",
EscapeYaml(effect),
"\n");
465 if (action.returns.empty()) {
466 absl::StrAppend(&out,
" returns: []\n");
468 absl::StrAppend(&out,
" returns:\n");
469 for (
const auto& ret : action.returns) {
470 absl::StrAppend(&out,
" - field: ",
EscapeYaml(ret.field),
472 absl::StrAppend(&out,
" type: ",
EscapeYaml(ret.type),
474 absl::StrAppend(&out,
" description: ",