about summary refs log tree commit diff
path: root/src/nix-hash/nix-hash.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-hash/nix-hash.cc')
-rw-r--r--src/nix-hash/nix-hash.cc83
1 files changed, 41 insertions, 42 deletions
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 <iostream>
 
-
 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";
-