From 47e185847e729d49e6aa376e8299fd66ef834a0a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 13 Aug 2014 03:50:44 +0200 Subject: Refactor option handling --- src/nix-hash/nix-hash.cc | 83 ++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 42 deletions(-) (limited to 'src/nix-hash/nix-hash.cc') diff --git a/src/nix-hash/nix-hash.cc b/src/nix-hash/nix-hash.cc index af3dda4ad7b8..b08f0b0b142b 100644 --- a/src/nix-hash/nix-hash.cc +++ b/src/nix-hash/nix-hash.cc @@ -3,17 +3,10 @@ #include - using namespace nix; -void printHelp() -{ - showManPage("nix-hash"); -} - - -void run(Strings args) +int main(int argc, char * * argv) { HashType ht = htMD5; bool flat = false; @@ -23,42 +16,48 @@ void run(Strings args) Strings ss; - for (Strings::iterator i = args.begin(); - i != args.end(); i++) - { - if (*i == "--flat") flat = true; - else if (*i == "--base32") base32 = true; - else if (*i == "--truncate") truncate = true; - else if (*i == "--type") { - ++i; - if (i == args.end()) throw UsageError("`--type' requires an argument"); - ht = parseHashType(*i); - if (ht == htUnknown) - throw UsageError(format("unknown hash type `%1%'") % *i); + return handleExceptions(argv[0], [&]() { + initNix(); + + parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) { + if (*arg == "--help") + showManPage("nix-hash"); + else if (*arg == "--version") + printVersion("nix-hash"); + else if (*arg == "--flat") flat = true; + else if (*arg == "--base32") base32 = true; + else if (*arg == "--truncate") truncate = true; + else if (*arg == "--type") { + string s = getArg(*arg, arg, end); + ht = parseHashType(s); + if (ht == htUnknown) + throw UsageError(format("unknown hash type `%1%'") % s); + } + else if (*arg == "--to-base16") op = opTo16; + else if (*arg == "--to-base32") op = opTo32; + else if (*arg != "" && arg->at(0) == '-') + return false; + else + ss.push_back(*arg); + return true; + }); + + if (op == opHash) { + for (auto & i : ss) { + Hash h = flat ? hashFile(ht, i) : hashPath(ht, i).first; + if (truncate && h.hashSize > 20) h = compressHash(h, 20); + std::cout << format("%1%\n") % + (base32 ? printHash32(h) : printHash(h)); + } } - else if (*i == "--to-base16") op = opTo16; - else if (*i == "--to-base32") op = opTo32; - else ss.push_back(*i); - } - if (op == opHash) { - foreach (Strings::iterator, i, ss) { - Hash h = flat ? hashFile(ht, *i) : hashPath(ht, *i).first; - if (truncate && h.hashSize > 20) h = compressHash(h, 20); - std::cout << format("%1%\n") % - (base32 ? printHash32(h) : printHash(h)); + else { + for (auto & i : ss) { + Hash h = parseHash16or32(ht, i); + std::cout << format("%1%\n") % + (op == opTo16 ? printHash(h) : printHash32(h)); + } } - } - - else { - foreach (Strings::iterator, i, ss) { - Hash h = parseHash16or32(ht, *i); - std::cout << format("%1%\n") % - (op == opTo16 ? printHash(h) : printHash32(h)); - } - } + }); } - -string programId = "nix-hash"; - -- cgit 1.4.1