317 std::vector<std::string> entries;
318 entries.reserve(schemas.size());
319 for (
const auto& resource : schemas) {
320 std::vector<std::string> action_entries;
321 action_entries.reserve(resource.actions.size());
322 for (
const auto& action : resource.actions) {
323 std::vector<std::string> arg_entries;
324 arg_entries.reserve(action.arguments.size());
325 for (
const auto& arg : action.arguments) {
326 arg_entries.push_back(absl::StrCat(
329 "\",\"required\":", arg.required ?
"true" :
"false",
330 ",\"description\":\"",
EscapeJson(arg.description),
"\"}"));
332 std::vector<std::string> effect_entries;
333 effect_entries.reserve(action.effects.size());
334 for (
const auto& effect : action.effects) {
335 effect_entries.push_back(absl::StrCat(
"\"",
EscapeJson(effect),
"\""));
337 std::vector<std::string> return_entries;
338 return_entries.reserve(action.returns.size());
339 for (
const auto& ret : action.returns) {
340 return_entries.push_back(absl::StrCat(
343 "\",\"description\":\"",
EscapeJson(ret.description),
"\"}"));
345 action_entries.push_back(absl::StrCat(
347 "\",\"synopsis\":\"",
EscapeJson(action.synopsis),
348 "\",\"stability\":\"",
EscapeJson(action.stability),
349 "\",\"arguments\":[", absl::StrJoin(arg_entries,
","),
"],",
350 "\"effects\":[", absl::StrJoin(effect_entries,
","),
"],",
351 "\"returns\":[", absl::StrJoin(return_entries,
","),
"]}"));
353 entries.push_back(absl::StrCat(
354 "{\"resource\":\"",
EscapeJson(resource.resource),
355 "\",\"description\":\"",
EscapeJson(resource.description),
356 "\",\"actions\":[", absl::StrJoin(action_entries,
","),
"]}"));
358 return absl::StrCat(
"{\"resources\":[", absl::StrJoin(entries,
","),
"]}");
390 const std::vector<ResourceSchema>& schemas,
391 absl::string_view version,
392 absl::string_view last_updated)
const {
394 absl::StrAppend(&out,
"# Auto-generated resource catalogue\n");
395 absl::StrAppend(&out,
"version: ",
EscapeYaml(version),
"\n");
396 absl::StrAppend(&out,
"last_updated: ",
EscapeYaml(last_updated),
"\n");
397 absl::StrAppend(&out,
"resources:\n");
399 for (
const auto& resource : schemas) {
400 absl::StrAppend(&out,
" - name: ",
EscapeYaml(resource.resource),
"\n");
401 absl::StrAppend(&out,
" description: ",
EscapeYaml(resource.description),
"\n");
403 if (resource.actions.empty()) {
404 absl::StrAppend(&out,
" actions: []\n");
408 absl::StrAppend(&out,
" actions:\n");
409 for (
const auto& action : resource.actions) {
410 absl::StrAppend(&out,
" - name: ",
EscapeYaml(action.name),
"\n");
411 absl::StrAppend(&out,
" synopsis: ",
EscapeYaml(action.synopsis),
"\n");
412 absl::StrAppend(&out,
" stability: ",
EscapeYaml(action.stability),
"\n");
414 if (action.arguments.empty()) {
415 absl::StrAppend(&out,
" args: []\n");
417 absl::StrAppend(&out,
" args:\n");
418 for (
const auto& arg : action.arguments) {
419 absl::StrAppend(&out,
" - flag: ",
EscapeYaml(arg.flag),
"\n");
420 absl::StrAppend(&out,
" type: ",
EscapeYaml(arg.type),
"\n");
421 absl::StrAppend(&out,
" required: ", arg.required ?
"true\n" :
"false\n");
422 absl::StrAppend(&out,
" description: ",
EscapeYaml(arg.description),
"\n");
426 if (action.effects.empty()) {
427 absl::StrAppend(&out,
" effects: []\n");
429 absl::StrAppend(&out,
" effects:\n");
430 for (
const auto& effect : action.effects) {
431 absl::StrAppend(&out,
" - ",
EscapeYaml(effect),
"\n");
435 if (action.returns.empty()) {
436 absl::StrAppend(&out,
" returns: []\n");
438 absl::StrAppend(&out,
" returns:\n");
439 for (
const auto& ret : action.returns) {
440 absl::StrAppend(&out,
" - field: ",
EscapeYaml(ret.field),
"\n");
441 absl::StrAppend(&out,
" type: ",
EscapeYaml(ret.type),
"\n");
442 absl::StrAppend(&out,
" description: ",
EscapeYaml(ret.description),
"\n");