aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlo Nucera <carlo.nucera@protonmail.com>2020-06-30 11:57:46 -0400
committerCarlo Nucera <carlo.nucera@protonmail.com>2020-06-30 11:57:46 -0400
commit77b51f4598763f0b3a435ed0e4ce98178d9e99da (patch)
tree7b0569011ac4e2cf0d76851975e2a804e43455d8 /src
parent7ba0fae0ddc815d7d7b2c3a9cd3d60879baeab54 (diff)
Factor the prefix splitting in content-address
Diffstat (limited to 'src')
-rw-r--r--src/libstore/content-address.cc27
1 files changed, 12 insertions, 15 deletions
diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc
index 4599cd924..8152e5215 100644
--- a/src/libstore/content-address.cc
+++ b/src/libstore/content-address.cc
@@ -1,5 +1,6 @@
#include "args.hh"
#include "content-address.hh"
+#include "parser.hh"
namespace nix {
@@ -43,23 +44,19 @@ std::string renderContentAddress(ContentAddress ca) {
ContentAddress parseContentAddress(std::string_view rawCa) {
auto rest = rawCa;
- // Ensure prefix
- const auto prefixSeparator = rawCa.find(':');
- if (prefixSeparator == string::npos)
- throw UsageError("not a content address because it is not in the form \"<prefix>:<rest>\": %s", rawCa);
- auto prefix = rest.substr(0, prefixSeparator);
- rest = rest.substr(prefixSeparator + 1);
+ std::string_view prefix;
+ {
+ auto optPrefix = splitPrefix(rest, ':');
+ if (!optPrefix)
+ throw UsageError("not a content address because it is not in the form \"<prefix>:<rest>\": %s", rawCa);
+ prefix = *optPrefix;
+ }
auto parseHashType_ = [&](){
- // Parse hash type
- auto algoSeparator = rest.find(':');
- HashType hashType;
- if (algoSeparator == string::npos)
- throw UsageError("content address hash must be in form \"<algo>:<hash>\", but found: %s", rest);
- hashType = parseHashType(rest.substr(0, algoSeparator));
-
- rest = rest.substr(algoSeparator + 1);
-
+ auto hashTypeRaw = splitPrefix(rest, ':');
+ if (!hashTypeRaw)
+ throw UsageError("content address hash must be in form \"<algo>:<hash>\", but found: %s", rawCa);
+ HashType hashType = parseHashType(*hashTypeRaw);
return std::move(hashType);
};