import std.getopt; import std.string : format; import std.stdio: stderr, writeln; import cipher : Cipher; import actions; int main(string[] args) { bool[string] actions = [ "genKey" : false, "encrypt" : false, "decrypt" : false ]; Cipher cipher = Cipher.chacha20; string keyFileName = "symkey.asc"; bool armor; auto helpInformation = getopt( args, std.getopt.config.bundling, "gen-key|g", "Generate a new 256 bit key.", &actions["genKey"], "encrypt|e", "Encrypt a message.", &actions["encrypt"], "decrypt|d", "Decrypt a message.", &actions["decrypt"], "cipher|c", "The cipher to use (default: %s).".format(cipher), &cipher, "key|k", "The file which contains the key (default: %s).".format(keyFileName), &keyFileName, "armor|a", "use ascii-armored I/O.", &armor); size_t numberOfActions; foreach(value; actions.values) numberOfActions += value; if(numberOfActions == 1) { try { if(actions["genKey"]) { generateKey(armor); } else if(actions["encrypt"]) { encrypt(keyFileName, cipher, armor); } else if(actions["decrypt"]) { decrypt(keyFileName, cipher, armor); } } catch(Exception e) { stderr.writeln(e.msg); return 1; } } else { helpInformation.helpWanted = true; } if(helpInformation.helpWanted) { defaultGetoptPrinter("Usage: mycrypt [options]\n\nCommon options:", helpInformation.options[$-1..$]); defaultGetoptPrinter("\nGlobal options:", helpInformation.options[$-2..$-1]); defaultGetoptPrinter("\nActions:", helpInformation.options[0..3]); defaultGetoptPrinter("\nAction options:", helpInformation.options[3..5]); } return 0; }