aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlo Nucera <carlo.nucera@protonmail.com>2020-06-30 14:10:30 -0400
committerCarlo Nucera <carlo.nucera@protonmail.com>2020-06-30 14:10:30 -0400
commitb798efb829415eb47a532e9479523afdff74eca7 (patch)
treee683c5de61bd6db343f8a8222d0653f2899952fc /src
parenta1f66d1d9e70d4204a3686002b02277465a6b7ab (diff)
WIP initial design
Diffstat (limited to 'src')
-rw-r--r--src/libutil/hash.cc17
-rw-r--r--src/libutil/hash.hh7
-rw-r--r--src/libutil/parser.hh5
3 files changed, 19 insertions, 10 deletions
diff --git a/src/libutil/hash.cc b/src/libutil/hash.cc
index 26ab5a110..36de293bb 100644
--- a/src/libutil/hash.cc
+++ b/src/libutil/hash.cc
@@ -132,10 +132,13 @@ std::string Hash::to_string(Base base, bool includeType) const
return s;
}
-Hash::Hash(std::string_view s, HashType type) : Hash(s, std::optional { type }) { }
-Hash::Hash(std::string_view s) : Hash(s, std::optional<HashType>{}) { }
+Hash fromSRI(std::string_view original) {
-Hash::Hash(std::string_view original, std::optional<HashType> optType)
+}
+
+Hash::Hash(std::string_view s) : Hash(s, std::nullopt) { }
+
+static HashType newFunction(std::string_view & rest, std::optional<HashType> optType)
{
auto rest = original;
@@ -161,13 +164,17 @@ Hash::Hash(std::string_view original, std::optional<HashType> optType)
if (!optParsedType && !optType) {
throw BadHash("hash '%s' does not include a type, nor is the type otherwise known from context.", rest);
} else {
- this->type = optParsedType ? *optParsedType : *optType;
if (optParsedType && optType && *optParsedType != *optType)
throw BadHash("hash '%s' should have type '%s'", original, printHashType(*optType));
+ return optParsedType ? *optParsedType : *optType;
}
+}
- init();
+// mutates the string_view
+Hash::Hash(std::string_view original, std::optional<HashType> optType)
+ : Hash(original, newFunction(original, optType))
+Hash::Hash(std::string_view original, HashType type) : Hash(type) {
if (!isSRI && rest.size() == base16Len()) {
auto parseHexDigit = [&](char c) {
diff --git a/src/libutil/hash.hh b/src/libutil/hash.hh
index a55295912..42bd585a2 100644
--- a/src/libutil/hash.hh
+++ b/src/libutil/hash.hh
@@ -40,13 +40,16 @@ struct Hash
is not present, then the hash type must be specified in the
string. */
Hash(std::string_view s, std::optional<HashType> type);
- // type must be provided
- Hash(std::string_view s, HashType type);
// hash type must be part of string
Hash(std::string_view s);
+private:
+ // type must be provided, s must not include <type> prefix
+ Hash(std::string_view s, HashType type);
+
void init();
+public:
/* Check whether a hash is set. */
operator bool () const { return (bool) type; }
diff --git a/src/libutil/parser.hh b/src/libutil/parser.hh
index 64689e283..d3bfafe75 100644
--- a/src/libutil/parser.hh
+++ b/src/libutil/parser.hh
@@ -1,6 +1,7 @@
#pragma once
#include <optional>
+#include <string_view>
namespace nix {
@@ -8,9 +9,7 @@ namespace nix {
// 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.
-std::optional<std::string_view> splitPrefix(std::string_view & string, char separator);
-
-std::optional<std::string_view> splitPrefix(std::string_view & string, char separator) {
+static inline std::optional<std::string_view> splitPrefix(std::string_view & string, char separator) {
auto sepInstance = string.find(separator);
if (sepInstance != std::string_view::npos) {