stamenStatic Menu Generator | 
          
| git clone git://git.dimitrijedobrota.com/stamen.git | 
| Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | 
| commit | 12c5ce88ce059481256dc028f9c672c1861655ca | 
| parent | e665a6f2bca782f688527dcf8232eeff412652a8 | 
| author | Dimitrije Dobrota < mail@dimitrijedobrota.com > | 
| date | Thu, 13 Jun 2024 23:00:28 +0200 | 
Use args library in generator for better usability
| M | CMakeLists.txt | | | ++ | 
| M | demo/CMakeLists.txt | | | ++ -- | 
| M | src/CMakeLists.txt | | | + - | 
| M | src/generate.cpp | | | +++++++++++++++++++++++++++++++++++++++++++++++++++ ---------------- | 
4 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/ CMakeLists.txt b/ CMakeLists.txt
          @@ -44,6 +44,8 @@ 
          foreach(p LIB BIN INCLUDE CMAKE)
        
        
          	unset(_path)
          endforeach()
          find_package(args 1 CONFIG REQUIRED)
          add_subdirectory(src)
          add_subdirectory(demo)
          diff --git a/ demo/CMakeLists.txt b/ demo/CMakeLists.txt
          @@ -4,7 +4,7 @@ 
          configure_file(demo_menu.conf ${GENERATE_OUT}/demo_menu.conf COPYONLY)
        
        
          add_custom_command(
              OUTPUT ${GENERATE_OUT}/demo_menu.hpp ${GENERATE_OUT}/demo_menu.cpp
              COMMAND ${GENERATE_OUT}/stamen-generate ${GENERATE_OUT}/demo_menu.conf
              COMMAND ${GENERATE_OUT}/stamen-generate --cpp ${GENERATE_OUT}/demo_menu.conf
              DEPENDS demo_menu.conf stamen-generate
              COMMENT "Generating menu files"
          )
        
        
          @@ -23,7 +23,7 @@ 
          set_target_properties(demo PROPERTIES
        
        
          add_custom_command(
              OUTPUT ${GENERATE_OUT}/demo_menu.h ${GENERATE_OUT}/demo_menu.c
              COMMAND ${GENERATE_OUT}/stamen-generate ${GENERATE_OUT}/demo_menu.conf c
              COMMAND ${GENERATE_OUT}/stamen-generate --c ${GENERATE_OUT}/demo_menu.conf
              DEPENDS demo_menu.conf stamen-generate
              COMMENT "Generating cmenu files"
          )
        
        diff --git a/ src/CMakeLists.txt b/ src/CMakeLists.txt
          @@ -13,7 +13,7 @@ 
          set_target_properties(stamen PROPERTIES
        
        
          )
          add_executable(stamen-generate generate.cpp)
          target_link_libraries(stamen-generate PRIVATE stamen)
          target_link_libraries(stamen-generate PRIVATE args stamen)
          target_include_directories(stamen-generate PRIVATE ../include)
          set_target_properties(stamen-generate PROPERTIES
        
        diff --git a/ src/generate.cpp b/ src/generate.cpp
@@ -1,3 +1,5 @@
#include <args/args.hpp>
          #include "menu.h"
          #include "stamen.h"
          
          @@ -53,31 +55,64 @@ 
          class Generator {
        
        
                  }
              }
          };
          } // namespace stamen
          using namespace stamen;
          int main(const int argc, const char *argv[]) {
              const auto args = std::span(argv, size_t(argc));
          struct arguments_t {
              std::string config;
              bool cpp = false;
          };
              if (argc != 2 && argc != 3) {
                  std::cout << argv[0] << " config_file [c/cpp]" << std::endl;
                  return 1;
          int parse_opt(int key, const char *arg, args::Parser *parser) {
              auto arguments = (arguments_t *)parser->input();
              switch (key) {
              case 666: arguments->cpp = false; break;
              case 777: arguments->cpp = true; break;
              case args::ARG:
                  if (!arguments->config.empty()) {
                      args::failure(parser, 1, 0, "Too many arguments");
                  }
                  arguments->config = arg;
                  break;
              case args::NO_ARGS:
                  args::failure(parser, 0, 0, "Missing an argument");
                  args::help(parser, stderr, args::STD_USAGE);
              }
              return 0;
          }
          static const args::option_t options[]{
              {0, 0, 0, 0, "Output mode", 1},
              {"c", 666, 0, 0, "Generate files for C"},
              {"cpp", 777, 0, 0, "Generate files for C++"},
              {0, 0, 0, 0, "Informational Options", -1},
              {0},
          };
              const bool cpp = argc == 2 || std::string(args[2]) == "cpp";
          static const args::argp_t argp{
              options,
              parse_opt,
              "config_file",
              "",
          };
          int main(int argc, char *argv[]) {
              arguments_t arguments;
              if (args::parse(&argp, argc, argv, 0, &arguments)) {
                  std::cerr << "There was an error while parsing arguments";
                  return 0;
              }
              std::string path = args[1];
              Menu::read(path);
              const auto &config = arguments.config;
              stamen::Menu::read(config);
              std::string::size_type pos = path.rfind('.');
              std::string base = pos != std::string::npos ? path.substr(0, pos) : path;
              std::string ext = cpp ? "pp" : "";
              std::string::size_type pos = arguments.config.rfind('.');
              std::string base =
                  pos != std::string::npos ? config.substr(0, pos) : config;
              std::string ext = arguments.cpp ? "pp" : "";
              std::ofstream source(base + ".c" + ext), include(base + ".h" + ext);
              Generator::generateSource(source, cpp);
              Generator::generateInclude(include, cpp);
              stamen::Generator::generateSource(source, arguments.cpp);
              stamen::Generator::generateInclude(include, arguments.cpp);
              return 0;
          }