libutil: move SizedSource into its only user

we should not encourage this kind of framing. in the future we will have
to do this on async streams, which we *absolutely* should not encourage.

Change-Id: Ib89e144afb564284db64fc7367cba7fffc18fdaf
This commit is contained in:
eldritch horrors
2025-07-29 10:42:00 +00:00
parent 5c2ee71c61
commit db7c3a88b2
2 changed files with 28 additions and 35 deletions
+28
View File
@@ -1074,6 +1074,34 @@ opServe(std::shared_ptr<Store> store, AsyncIoRoot & aio, Strings opFlags, String
if (info.narSize == 0)
throw Error("narInfo is too old and missing the narSize field");
struct SizedSource : Source
{
Source & orig;
size_t remain;
SizedSource(Source & orig, size_t size) : orig(orig), remain(size) {}
size_t read(char * data, size_t len) override
{
if (this->remain <= 0) {
throw EndOfFile("sized: unexpected end-of-file");
}
len = std::min(len, this->remain);
size_t n = this->orig.read(data, len);
this->remain -= n;
return n;
}
size_t drainAll()
{
std::vector<char> buf(8192);
size_t sum = 0;
while (this->remain > 0) {
size_t n = read(buf.data(), buf.size());
sum += n;
}
return sum;
}
};
SizedSource sizedSource(in, info.narSize);
AsyncSourceInputStream stream{sizedSource};
-35
View File
@@ -226,41 +226,6 @@ struct TeeSource : Source
}
};
/**
* A reader that consumes the original Source until 'size'.
*/
struct SizedSource : Source
{
Source & orig;
size_t remain;
SizedSource(Source & orig, size_t size)
: orig(orig), remain(size) { }
size_t read(char * data, size_t len) override
{
if (this->remain <= 0) {
throw EndOfFile("sized: unexpected end-of-file");
}
len = std::min(len, this->remain);
size_t n = this->orig.read(data, len);
this->remain -= n;
return n;
}
/**
* Consume the original source until no remain data is left to consume.
*/
size_t drainAll()
{
std::vector<char> buf(8192);
size_t sum = 0;
while (this->remain > 0) {
size_t n = read(buf.data(), buf.size());
sum += n;
}
return sum;
}
};
/**
* A sink that that just counts the number of bytes given to it
*/