aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/content-address.cc
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-05 18:53:44 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-07 07:30:01 -0400
commit903700c5e168e2ab5bd6bee5e09b5908cb2908d6 (patch)
treea9b92b2a5e04cfae03a02b5d92aaa2719d8d30b8 /src/libstore/content-address.cc
parent6db66ebfc55769edd0c6bc70fcbd76246d4d26e0 (diff)
Simplify `ContentAddress`
Whereas `ContentAddressWithReferences` is a sum type complex because different varieties support different notions of reference, and `ContentAddressMethod` is a nested enum to support that, `ContentAddress` can be a simple pair of a method and hash. `ContentAddress` does not need to be a sum type on the outside because the choice of method doesn't effect what type of hashes we can use. Co-Authored-By: Cale Gibbard <cgibbard@gmail.com>
Diffstat (limited to 'src/libstore/content-address.cc')
-rw-r--r--src/libstore/content-address.cc125
1 files changed, 33 insertions, 92 deletions
diff --git a/src/libstore/content-address.cc b/src/libstore/content-address.cc
index 04f7ac214..080456e18 100644
--- a/src/libstore/content-address.cc
+++ b/src/libstore/content-address.cc
@@ -4,11 +4,6 @@
namespace nix {
-std::string FixedOutputHash::printMethodAlgo() const
-{
- return makeFileIngestionPrefix(method) + printHashType(hash.type);
-}
-
std::string makeFileIngestionPrefix(FileIngestionMethod m)
{
switch (m) {
@@ -42,21 +37,6 @@ ContentAddressMethod ContentAddressMethod::parsePrefix(std::string_view & m)
return method;
}
-std::string ContentAddress::render() const
-{
- return std::visit(overloaded {
- [](const TextHash & th) {
- return "text:"
- + th.hash.to_string(Base32, true);
- },
- [](const FixedOutputHash & fsh) {
- return "fixed:"
- + makeFileIngestionPrefix(fsh.method)
- + fsh.hash.to_string(Base32, true);
- }
- }, raw);
-}
-
std::string ContentAddressMethod::render(HashType ht) const
{
return std::visit(overloaded {
@@ -69,6 +49,20 @@ std::string ContentAddressMethod::render(HashType ht) const
}, raw);
}
+std::string ContentAddress::render() const
+{
+ return std::visit(overloaded {
+ [](const TextIngestionMethod &) -> std::string {
+ return "text:";
+ },
+ [](const FileIngestionMethod & method) {
+ return "fixed:"
+ + makeFileIngestionPrefix(method);
+ },
+ }, method.raw)
+ + this->hash.to_string(Base32, true);
+}
+
/**
* Parses content address strings up to the hash.
*/
@@ -118,22 +112,12 @@ ContentAddress ContentAddress::parse(std::string_view rawCa)
{
auto rest = rawCa;
- auto [caMethod, hashType_] = parseContentAddressMethodPrefix(rest);
- auto hashType = hashType_; // work around clang bug
+ auto [caMethod, hashType] = parseContentAddressMethodPrefix(rest);
- return std::visit(overloaded {
- [&](TextIngestionMethod &) {
- return ContentAddress(TextHash {
- .hash = Hash::parseNonSRIUnprefixed(rest, hashType)
- });
- },
- [&](FileIngestionMethod & fim) {
- return ContentAddress(FixedOutputHash {
- .method = fim,
- .hash = Hash::parseNonSRIUnprefixed(rest, hashType),
- });
- },
- }, caMethod.raw);
+ return ContentAddress {
+ .method = std::move(caMethod).raw,
+ .hash = Hash::parseNonSRIUnprefixed(rest, hashType),
+ };
}
std::pair<ContentAddressMethod, HashType> ContentAddressMethod::parse(std::string_view caMethod)
@@ -156,52 +140,10 @@ std::string renderContentAddress(std::optional<ContentAddress> ca)
return ca ? ca->render() : "";
}
-ContentAddress ContentAddress::fromParts(
- ContentAddressMethod method, Hash hash) noexcept
-{
- return std::visit(overloaded {
- [&](TextIngestionMethod _) -> ContentAddress {
- return TextHash {
- .hash = std::move(hash),
- };
- },
- [&](FileIngestionMethod m2) -> ContentAddress {
- return FixedOutputHash {
- .method = std::move(m2),
- .hash = std::move(hash),
- };
- },
- }, method.raw);
-}
-
-ContentAddressMethod ContentAddress::getMethod() const
-{
- return std::visit(overloaded {
- [](const TextHash & th) -> ContentAddressMethod {
- return TextIngestionMethod {};
- },
- [](const FixedOutputHash & fsh) -> ContentAddressMethod {
- return fsh.method;
- },
- }, raw);
-}
-
-const Hash & ContentAddress::getHash() const
-{
- return std::visit(overloaded {
- [](const TextHash & th) -> auto & {
- return th.hash;
- },
- [](const FixedOutputHash & fsh) -> auto & {
- return fsh.hash;
- },
- }, raw);
-}
-
std::string ContentAddress::printMethodAlgo() const
{
- return getMethod().renderPrefix()
- + printHashType(getHash().type);
+ return method.renderPrefix()
+ + printHashType(hash.type);
}
bool StoreReferences::empty() const
@@ -217,19 +159,20 @@ size_t StoreReferences::size() const
ContentAddressWithReferences ContentAddressWithReferences::withoutRefs(const ContentAddress & ca) noexcept
{
return std::visit(overloaded {
- [&](const TextHash & h) -> ContentAddressWithReferences {
+ [&](const TextIngestionMethod &) -> ContentAddressWithReferences {
return TextInfo {
- .hash = h,
+ .hash = ca.hash,
.references = {},
};
},
- [&](const FixedOutputHash & h) -> ContentAddressWithReferences {
+ [&](const FileIngestionMethod & method) -> ContentAddressWithReferences {
return FixedOutputInfo {
- .hash = h,
+ .method = method,
+ .hash = ca.hash,
.references = {},
};
},
- }, ca.raw);
+ }, ca.method.raw);
}
std::optional<ContentAddressWithReferences> ContentAddressWithReferences::fromPartsOpt(
@@ -241,7 +184,7 @@ std::optional<ContentAddressWithReferences> ContentAddressWithReferences::fromPa
return std::nullopt;
return ContentAddressWithReferences {
TextInfo {
- .hash = { .hash = std::move(hash) },
+ .hash = std::move(hash),
.references = std::move(refs.others),
}
};
@@ -249,10 +192,8 @@ std::optional<ContentAddressWithReferences> ContentAddressWithReferences::fromPa
[&](FileIngestionMethod m2) -> std::optional<ContentAddressWithReferences> {
return ContentAddressWithReferences {
FixedOutputInfo {
- .hash = {
- .method = m2,
- .hash = std::move(hash),
- },
+ .method = m2,
+ .hash = std::move(hash),
.references = std::move(refs),
}
};
@@ -267,7 +208,7 @@ ContentAddressMethod ContentAddressWithReferences::getMethod() const
return TextIngestionMethod {};
},
[](const FixedOutputInfo & fsh) -> ContentAddressMethod {
- return fsh.hash.method;
+ return fsh.method;
},
}, raw);
}
@@ -276,10 +217,10 @@ Hash ContentAddressWithReferences::getHash() const
{
return std::visit(overloaded {
[](const TextInfo & th) {
- return th.hash.hash;
+ return th.hash;
},
[](const FixedOutputInfo & fsh) {
- return fsh.hash.hash;
+ return fsh.hash;
},
}, raw);
}