Start of new Nix command-line interface
This commit is contained in:
		
							parent
							
								
									0db9e6cd1a
								
							
						
					
					
						commit
						cd2196b089
					
				
					 14 changed files with 362 additions and 74 deletions
				
			
		
							
								
								
									
										65
									
								
								src/nix/command.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/nix/command.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| #include "command.hh" | ||||
| #include "store-api.hh" | ||||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| Commands * RegisterCommand::commands = 0; | ||||
| 
 | ||||
| MultiCommand::MultiCommand(const Commands & _commands) | ||||
|     : commands(_commands) | ||||
| { | ||||
|     expectedArgs.push_back(ExpectedArg{"command", 1, [=](Strings ss) { | ||||
|         assert(!command); | ||||
|         auto i = commands.find(ss.front()); | ||||
|         if (i == commands.end()) | ||||
|             throw UsageError(format("‘%1%’ is not a recognised command") % ss.front()); | ||||
|         command = i->second; | ||||
|     }}); | ||||
| } | ||||
| 
 | ||||
| void MultiCommand::printHelp(const string & programName, std::ostream & out) | ||||
| { | ||||
|     if (command) { | ||||
|         command->printHelp(programName + " " + command->name(), out); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     out << "Usage: " << programName << " <COMMAND> <FLAGS>... <ARGS>...\n"; | ||||
| 
 | ||||
|     out << "\n"; | ||||
|     out << "Common flags:\n"; | ||||
|     printFlags(out); | ||||
| 
 | ||||
|     out << "\n"; | ||||
|     out << "Available commands:\n"; | ||||
| 
 | ||||
|     Table2 table; | ||||
|     for (auto & command : commands) | ||||
|         table.push_back(std::make_pair(command.second->name(), command.second->description())); | ||||
|     printTable(out, table); | ||||
| 
 | ||||
|     out << "\n"; | ||||
|     out << "For full documentation, run ‘man " << programName << "’ or ‘man " << programName << "-<COMMAND>’.\n"; | ||||
| } | ||||
| 
 | ||||
| bool MultiCommand::processFlag(Strings::iterator & pos, Strings::iterator end) | ||||
| { | ||||
|     if (Args::processFlag(pos, end)) return true; | ||||
|     if (command && command->processFlag(pos, end)) return true; | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool MultiCommand::processArgs(const Strings & args, bool finish) | ||||
| { | ||||
|     if (command) | ||||
|         return command->processArgs(args, finish); | ||||
|     else | ||||
|         return Args::processArgs(args, finish); | ||||
| } | ||||
| 
 | ||||
| void StoreCommand::run() | ||||
| { | ||||
|     run(openStore(reserveSpace)); | ||||
| } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue