Skip to content

Commit

Permalink
Add handling for invalid commands in main.cc (#750)
Browse files Browse the repository at this point in the history
* Add handling for invalid commands in main.cc

Added a default case to the switch statement in the main function to
handle invalid commands.
This improves user experience by providing guidance when an invalid
command is used.

* Fix Protobuf library shutdown placement

The protobuf shutdown was previously never called, given that all switch
cases returned before it.
This commit introduces a new variable to store the return value to store
the command execution, and returns after the proper shutdown of the Protobuf
library to prevent resource leaks
  • Loading branch information
fbarbe00 authored Feb 18, 2025
1 parent 0a5d9e6 commit 05be7ea
Showing 1 changed file with 27 additions and 11 deletions.
38 changes: 27 additions & 11 deletions exe/main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,14 @@ int main(int ac, char** av) {
--ac;
++av;

auto return_value = 0;

// Execute command.
auto const cmd = std::string_view{av[0]};
switch (cista::hash(cmd)) {
case cista::hash("generate"): return generate(ac, av);
case cista::hash("batch"): return batch(ac, av);
case cista::hash("compare"): return compare(ac, av);
case cista::hash("generate"): return_value = generate(ac, av); break;
case cista::hash("batch"): return_value = batch(ac, av); break;
case cista::hash("compare"): return_value = compare(ac, av); break;

case cista::hash("config"): {
auto paths = std::vector<std::string>{};
Expand All @@ -80,10 +82,12 @@ int main(int ac, char** av) {
"\n\n"
"Example: motis config germany-latest.osm.pbf "
"germany.gtfs.zip\n");
return paths.empty() ? 1 : 0;
return_value = paths.empty() ? 1 : 0;
break;
}
std::ofstream{"config.yml"} << config::read_simple(paths) << "\n";
return 0;
return_value = 0;
break;
}

case cista::hash("server"):
Expand All @@ -95,14 +99,17 @@ int main(int ac, char** av) {
auto vm = parse_opt(ac, av, desc);
if (vm.count("help")) {
std::cout << desc << "\n";
return 0;
return_value = 0;
break;
}

auto const c = config::read(data_path / "config.yml");
return server(data{data_path, c}, c);
return_value = server(data{data_path, c}, c);
break;
} catch (std::exception const& e) {
std::cerr << "unable to start server: " << e.what() << "\n";
return 1;
return_value = 1;
break;
}

case cista::hash("import"): {
Expand All @@ -117,21 +124,30 @@ int main(int ac, char** av) {
auto vm = parse_opt(ac, av, desc);
if (vm.count("help")) {
std::cout << desc << "\n";
return 0;
return_value = 0;
break;
}

c = config_path.extension() == ".ini" ? config::read_legacy(config_path)
: config::read(config_path);
auto const bars = utl::global_progress_bars{false};
import(c, std::move(data_path));
return 0;
return_value = 0;
break;
} catch (std::exception const& e) {
fmt::println("unable to import: {}", e.what());
fmt::println("config:\n{}", fmt::streamed(c));
return 1;
return_value = 1;
break;
}
}

default:
fmt::println("Invalid command. Type motis --help for a list of commands.");
return_value = 1;
break;
}

google::protobuf::ShutdownProtobufLibrary();
return return_value;
}

0 comments on commit 05be7ea

Please sign in to comment.