WIP initial design

This commit is contained in:
Carlo Nucera 2020-06-30 14:10:30 -04:00
parent a1f66d1d9e
commit b798efb829
3 changed files with 19 additions and 10 deletions

View file

@ -132,10 +132,13 @@ std::string Hash::to_string(Base base, bool includeType) const
return s; return s;
} }
Hash::Hash(std::string_view s, HashType type) : Hash(s, std::optional { type }) { } Hash fromSRI(std::string_view original) {
Hash::Hash(std::string_view s) : Hash(s, std::optional<HashType>{}) { }
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; auto rest = original;
@ -161,13 +164,17 @@ Hash::Hash(std::string_view original, std::optional<HashType> optType)
if (!optParsedType && !optType) { if (!optParsedType && !optType) {
throw BadHash("hash '%s' does not include a type, nor is the type otherwise known from context.", rest); throw BadHash("hash '%s' does not include a type, nor is the type otherwise known from context.", rest);
} else { } else {
this->type = optParsedType ? *optParsedType : *optType;
if (optParsedType && optType && *optParsedType != *optType) if (optParsedType && optType && *optParsedType != *optType)
throw BadHash("hash '%s' should have type '%s'", original, printHashType(*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()) { if (!isSRI && rest.size() == base16Len()) {
auto parseHexDigit = [&](char c) { auto parseHexDigit = [&](char c) {

View file

@ -40,13 +40,16 @@ struct Hash
is not present, then the hash type must be specified in the is not present, then the hash type must be specified in the
string. */ string. */
Hash(std::string_view s, std::optional<HashType> type); 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 type must be part of string
Hash(std::string_view s); 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(); void init();
public:
/* Check whether a hash is set. */ /* Check whether a hash is set. */
operator bool () const { return (bool) type; } operator bool () const { return (bool) type; }

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <optional> #include <optional>
#include <string_view>
namespace nix { namespace nix {
@ -8,9 +9,7 @@ namespace nix {
// separator, and modify the string argument to contain only the part after 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 // separator. Otherwise, wer return `std::nullopt`, and we leave the argument
// string alone. // string alone.
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) {
std::optional<std::string_view> splitPrefix(std::string_view & string, char separator) {
auto sepInstance = string.find(separator); auto sepInstance = string.find(separator);
if (sepInstance != std::string_view::npos) { if (sepInstance != std::string_view::npos) {