Skip to content

sample/example_introspection.c

#include <stdio.h>
#include <stdlib.h>

#include "argparse-c.h"

static void print_argument_summary(const ap_arg_info *info) {
  int i;

  if (!info) {
    return;
  }

  printf("dest=%s\n", info->dest ? info->dest : "(null)");
  printf("kind=%s\n",
         info->kind == AP_ARG_KIND_OPTIONAL ? "optional" : "positional");
  printf("required=%s\n", info->required ? "true" : "false");

  if (info->flag_count > 0) {
    printf("flags=");
    for (i = 0; i < info->flag_count; ++i) {
      printf("%s%s", i == 0 ? "" : ", ", info->flags[i]);
    }
    printf("\n");
  }
}

int main(void) {
  ap_error err = {0};
  ap_parser *parser = ap_parser_new("example_introspection",
                                    "inspect parser metadata at runtime.");
  ap_parser *config = NULL;
  ap_parser_info parser_info;
  ap_arg_info arg_info;
  ap_subcommand_info sub_info;
  ap_arg_options verbose = ap_arg_options_default();
  ap_arg_options input = ap_arg_options_default();

  if (!parser) {
    fprintf(stderr, "failed to initialize parser\n");
    return 1;
  }

  verbose.type = AP_TYPE_BOOL;
  verbose.action = AP_ACTION_STORE_TRUE;
  verbose.help = "enable verbose output";
  if (ap_add_argument(parser, "-v, --verbose", verbose, &err) != 0) {
    fprintf(stderr, "%s\n", err.message);
    ap_parser_free(parser);
    return 1;
  }

  input.required = true;
  input.help = "input file";
  if (ap_add_argument(parser, "input", input, &err) != 0) {
    fprintf(stderr, "%s\n", err.message);
    ap_parser_free(parser);
    return 1;
  }

  config = ap_add_subcommand(parser, "config", "configuration commands", &err);
  if (!config) {
    fprintf(stderr, "%s\n", err.message);
    ap_parser_free(parser);
    return 1;
  }
  (void)config;

  if (ap_parser_get_info(parser, &parser_info) != 0) {
    fprintf(stderr, "failed to inspect parser info\n");
    ap_parser_free(parser);
    return 1;
  }

  printf("prog=%s\n", parser_info.prog);
  printf("description=%s\n", parser_info.description);
  printf("argument_count=%d\n", parser_info.argument_count);
  printf("subcommand_count=%d\n", parser_info.subcommand_count);

  if (ap_parser_get_argument(parser, 0, &arg_info) == 0) {
    printf("first_argument:\n");
    print_argument_summary(&arg_info);
  }

  if (ap_parser_get_argument(parser, 1, &arg_info) == 0) {
    printf("second_argument:\n");
    print_argument_summary(&arg_info);
  }

  if (ap_parser_get_subcommand(parser, 0, &sub_info) == 0) {
    printf("first_subcommand=%s\n", sub_info.name ? sub_info.name : "(null)");
    printf("first_subcommand_description=%s\n",
           sub_info.description ? sub_info.description : "(null)");
  }

  ap_parser_free(parser);
  return 0;
}