aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-02 23:16:57 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2020-07-02 23:18:22 +0000
commit13796be78dfa9d3a189ea6b482659c56b1301634 (patch)
treea3b333a8b23899083c45b65ba9a89ba3b5881246 /src
parenta7cd7425d9341cf8a2c3af80b84cc55e874515c6 (diff)
Have `splitPrefix` and `splitPrefixTo` parser helpers
Diffstat (limited to 'src')
-rw-r--r--src/libstore/content-address.cc8
-rw-r--r--src/libutil/hash.cc6
-rw-r--r--src/libutil/parser.hh10
3 files changed, 15 insertions, 9 deletions
diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc
index 02ab6710f..470cc62c9 100644
--- a/src/libstore/content-address.cc
+++ b/src/libstore/content-address.cc
@@ -46,14 +46,14 @@ ContentAddress parseContentAddress(std::string_view rawCa) {
std::string_view prefix;
{
- auto optPrefix = splitPrefix(rest, ':');
+ auto optPrefix = splitPrefixTo(rest, ':');
if (!optPrefix)
throw UsageError("not a content address because it is not in the form \"<prefix>:<rest>\": %s", rawCa);
prefix = *optPrefix;
}
auto parseHashType_ = [&](){
- auto hashTypeRaw = splitPrefix(rest, ':');
+ auto hashTypeRaw = splitPrefixTo(rest, ':');
if (!hashTypeRaw)
throw UsageError("content address hash must be in form \"<algo>:<hash>\", but found: %s", rawCa);
HashType hashType = parseHashType(*hashTypeRaw);
@@ -73,10 +73,8 @@ ContentAddress parseContentAddress(std::string_view rawCa) {
} else if (prefix == "fixed") {
// Parse method
auto method = FileIngestionMethod::Flat;
- if (rest.substr(0, 2) == "r:") {
+ if (splitPrefix(rest, "r:"))
method = FileIngestionMethod::Recursive;
- rest = rest.substr(2);
- }
HashType hashType = parseHashType_();
return FixedOutputHash {
.method = method,
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 76fa67086..35054462c 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -136,7 +136,7 @@ Hash Hash::parseSRI(std::string_view original) {
auto rest = original;
// Parse the has type before the separater, if there was one.
- auto hashRaw = splitPrefix(rest, '-');
+ auto hashRaw = splitPrefixTo(rest, '-');
if (!hashRaw)
throw BadHash("hash '%s' is not SRI", original);
HashType parsedType = parseHashType(*hashRaw);
@@ -151,10 +151,10 @@ static std::pair<std::optional<HashType>, bool> getParsedTypeAndSRI(std::string_
// Parse the has type before the separater, if there was one.
std::optional<HashType> optParsedType;
{
- auto hashRaw = splitPrefix(rest, ':');
+ auto hashRaw = splitPrefixTo(rest, ':');
if (!hashRaw) {
- hashRaw = splitPrefix(rest, '-');
+ hashRaw = splitPrefixTo(rest, '-');
if (hashRaw)
isSRI = true;
}
diff --git a/src/libutil/parser.hh b/src/libutil/parser.hh
index a6a83ce89..d19d7d8ed 100644
--- a/src/libutil/parser.hh
+++ b/src/libutil/parser.hh
@@ -3,13 +3,15 @@
#include <optional>
#include <string_view>
+#include "util.hh"
+
namespace nix {
// If `separator` is found, we return the portion of the string before the
// separator, and modify the string argument to contain only the part after the
// separator. Otherwise, wer return `std::nullopt`, and we leave the argument
// string alone.
-static inline std::optional<std::string_view> splitPrefix(std::string_view & string, char separator) {
+static inline std::optional<std::string_view> splitPrefixTo(std::string_view & string, char separator) {
auto sepInstance = string.find(separator);
if (sepInstance != std::string_view::npos) {
@@ -21,5 +23,11 @@ static inline std::optional<std::string_view> splitPrefix(std::string_view & str
return std::nullopt;
}
+static inline bool splitPrefix(std::string_view & string, std::string_view prefix) {
+ bool res = hasPrefix(string, prefix);
+ if (res)
+ string.remove_prefix(prefix.length());
+ return res;
+}
}