mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "lib/core/globals.h"
 | |
| #include "lib/config/proto.h"
 | |
| #include "lib/config/flags.h"
 | |
| #include "fmt/format.h"
 | |
| 
 | |
| extern const std::map<std::string, const ConfigProto*> formats;
 | |
| 
 | |
| static const ConfigProto& findConfig(std::string name)
 | |
| {
 | |
|     return *formats.at(name);
 | |
| }
 | |
| 
 | |
| static void addExample(std::vector<std::string>& examples,
 | |
|     bool write,
 | |
|     std::string name,
 | |
|     ConfigProto config,
 | |
|     const OptionProto* format)
 | |
| {
 | |
|     std::string r;
 | |
| 
 | |
|     if (format)
 | |
|         config.MergeFrom(format->config());
 | |
| 
 | |
|     if (write && config.has_encoder())
 | |
|         r += fmt::format("fluxengine write");
 | |
|     else if (!write && config.has_decoder())
 | |
|         r += fmt::format("fluxengine read");
 | |
|     else
 | |
|         return;
 | |
| 
 | |
|     r += fmt::format(" {}", name);
 | |
|     if (format)
 | |
|         r += fmt::format(" --{}", format->name());
 | |
| 
 | |
|     std::string filename = write ? config.image_reader().filename()
 | |
|                                  : config.image_writer().filename();
 | |
|     if (filename.empty())
 | |
|         filename = fmt::format("{}.img", name);
 | |
| 
 | |
|     if (write)
 | |
|         r += fmt::format(" -d drive:0 -i {}", filename);
 | |
|     else
 | |
|         r += fmt::format(" -s drive:0 -o {}", filename);
 | |
| 
 | |
|     examples.push_back(r);
 | |
| }
 | |
| 
 | |
| int main(int argc, const char* argv[])
 | |
| {
 | |
|     auto config = findConfig(argv[1]);
 | |
| 
 | |
|     fmt::print("{}\n====\n", argv[1]);
 | |
|     fmt::print("## {}\n", config.comment());
 | |
|     fmt::print(
 | |
|         "<!-- This file is automatically generated. Do not edit. -->\n\n");
 | |
| 
 | |
|     const auto& documentation = config.documentation();
 | |
|     auto it = documentation.begin();
 | |
|     if (it != documentation.end())
 | |
|     {
 | |
|         fmt::print("{}\n", *it++);
 | |
| 
 | |
|         if (!config.is_extension())
 | |
|         {
 | |
|             fmt::print("## Options\n\n");
 | |
| 
 | |
|             const OptionGroupProto* formatGroup = nullptr;
 | |
|             if (!config.option().empty() || !config.option_group().empty())
 | |
|             {
 | |
|                 for (const auto& option_group : config.option_group())
 | |
|                 {
 | |
|                     auto groupName = option_group.comment();
 | |
|                     if (groupName == "$formats")
 | |
|                     {
 | |
|                         groupName = "Format variants";
 | |
|                         formatGroup = &option_group;
 | |
|                     }
 | |
| 
 | |
|                     fmt::print("  - {}:\n", groupName);
 | |
|                     for (const auto& option : option_group.option())
 | |
|                         fmt::print("      - `{}`: {}\n",
 | |
|                             option.name(),
 | |
|                             option.comment());
 | |
|                 }
 | |
| 
 | |
|                 for (const auto& option : config.option())
 | |
|                     fmt::print(
 | |
|                         "  - `{}`: {}\n", option.name(), option.comment());
 | |
|             }
 | |
|             else
 | |
|                 fmt::print("(no options)\n");
 | |
|             fmt::print("\n");
 | |
| 
 | |
|             fmt::print("## Examples\n\n");
 | |
| 
 | |
|             std::vector<std::string> examples;
 | |
|             if (formatGroup)
 | |
|             {
 | |
|                 for (const auto& option : formatGroup->option())
 | |
|                     addExample(examples, false, argv[1], config, &option);
 | |
|             }
 | |
|             else
 | |
|                 addExample(examples, false, argv[1], config, nullptr);
 | |
| 
 | |
|             if (!examples.empty())
 | |
|             {
 | |
|                 fmt::print("To read:\n\n");
 | |
|                 for (const std::string& e : examples)
 | |
|                     fmt::print("  - `{}`\n", e);
 | |
|                 fmt::print("\n");
 | |
|             }
 | |
| 
 | |
|             examples.clear();
 | |
|             if (formatGroup)
 | |
|             {
 | |
|                 for (const auto& option : formatGroup->option())
 | |
|                     addExample(examples, true, argv[1], config, &option);
 | |
|             }
 | |
|             else
 | |
|                 addExample(examples, true, argv[1], config, nullptr);
 | |
| 
 | |
|             if (!examples.empty())
 | |
|             {
 | |
|                 fmt::print("To write:\n\n");
 | |
|                 for (const std::string& e : examples)
 | |
|                     fmt::print("  - `{}`\n", e);
 | |
|                 fmt::print("\n");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         while (it != documentation.end())
 | |
|             fmt::print("{}\n", *it++);
 | |
|     }
 | |
|     else
 | |
|         fmt::print("(This format has no documentation. Please file a bug.)\n");
 | |
| 
 | |
|     return 0;
 | |
| }
 |