Cleanups to content address types

This commit is contained in:
John Ericson 2023-05-09 13:05:38 -04:00
parent d3c125e5a8
commit 753fc1661d
2 changed files with 29 additions and 8 deletions

View file

@ -21,7 +21,8 @@ std::string makeFileIngestionPrefix(FileIngestionMethod m)
} }
} }
std::string ContentAddressMethod::renderPrefix() const { std::string ContentAddressMethod::renderPrefix() const
{
return std::visit(overloaded { return std::visit(overloaded {
[](TextIngestionMethod) -> std::string { return "text:"; }, [](TextIngestionMethod) -> std::string { return "text:"; },
[](FileIngestionMethod m2) { [](FileIngestionMethod m2) {
@ -113,7 +114,8 @@ static std::pair<ContentAddressMethod, HashType> parseContentAddressMethodPrefix
throw UsageError("content address prefix '%s' is unrecognized. Recogonized prefixes are 'text' or 'fixed'", prefix); throw UsageError("content address prefix '%s' is unrecognized. Recogonized prefixes are 'text' or 'fixed'", prefix);
} }
ContentAddress ContentAddress::parse(std::string_view rawCa) { ContentAddress ContentAddress::parse(std::string_view rawCa)
{
auto rest = rawCa; auto rest = rawCa;
auto [caMethod, hashType_] = parseContentAddressMethodPrefix(rest); auto [caMethod, hashType_] = parseContentAddressMethodPrefix(rest);
@ -155,7 +157,7 @@ std::string renderContentAddress(std::optional<ContentAddress> ca)
} }
ContentAddress ContentAddress::fromParts( ContentAddress ContentAddress::fromParts(
ContentAddressMethod method, Hash hash) ContentAddressMethod method, Hash hash) noexcept
{ {
return std::visit(overloaded { return std::visit(overloaded {
[&](TextIngestionMethod _) -> ContentAddress { [&](TextIngestionMethod _) -> ContentAddress {
@ -196,7 +198,8 @@ const Hash & ContentAddress::getHash() const
}, raw); }, raw);
} }
std::string ContentAddress::printMethodAlgo() const { std::string ContentAddress::printMethodAlgo() const
{
return getMethod().renderPrefix() return getMethod().renderPrefix()
+ printHashType(getHash().type); + printHashType(getHash().type);
} }
@ -211,7 +214,8 @@ size_t StoreReferences::size() const
return (self ? 1 : 0) + others.size(); return (self ? 1 : 0) + others.size();
} }
ContentAddressWithReferences ContentAddressWithReferences::withoutRefs(const ContentAddress & ca) { ContentAddressWithReferences ContentAddressWithReferences::withoutRefs(const ContentAddress & ca) noexcept
{
return std::visit(overloaded { return std::visit(overloaded {
[&](const TextHash & h) -> ContentAddressWithReferences { [&](const TextHash & h) -> ContentAddressWithReferences {
return TextInfo { return TextInfo {

View file

@ -81,17 +81,30 @@ struct ContentAddressMethod
* Parse the prefix tag which indicates how the files * Parse the prefix tag which indicates how the files
* were ingested, with the fixed output case not prefixed for back * were ingested, with the fixed output case not prefixed for back
* compat. * compat.
*
* @param [in] m A string that should begin with the prefix.
* @param [out] m The remainder of the string after the prefix.
*/ */
static ContentAddressMethod parsePrefix(std::string_view & m); static ContentAddressMethod parsePrefix(std::string_view & m);
/**
* Render the prefix tag which indicates how the files wre ingested.
*
* The rough inverse of `parsePrefix()`.
*/
std::string renderPrefix() const; std::string renderPrefix() const;
/** /**
* Parse and pretty print a content addressing method and hash type in a * Parse a content addressing method and hash type.
* nicer way, prefixing both cases.
*/ */
static std::pair<ContentAddressMethod, HashType> parse(std::string_view rawCaMethod); static std::pair<ContentAddressMethod, HashType> parse(std::string_view rawCaMethod);
/**
* Render a content addressing method and hash type in a
* nicer way, prefixing both cases.
*
* The rough inverse of `parse()`.
*/
std::string render(HashType ht) const; std::string render(HashType ht) const;
}; };
@ -178,7 +191,7 @@ struct ContentAddress
* @param hash Hash of ingested file system data. * @param hash Hash of ingested file system data.
*/ */
static ContentAddress fromParts( static ContentAddress fromParts(
ContentAddressMethod method, Hash hash); ContentAddressMethod method, Hash hash) noexcept;
ContentAddressMethod getMethod() const; ContentAddressMethod getMethod() const;
@ -187,6 +200,10 @@ struct ContentAddress
std::string printMethodAlgo() const; std::string printMethodAlgo() const;
}; };
/**
* Render the `ContentAddress` if it exists to a string, return empty
* string otherwise.
*/
std::string renderContentAddress(std::optional<ContentAddress> ca); std::string renderContentAddress(std::optional<ContentAddress> ca);