mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-26 07:46:21 +02:00
Create MemorySink
This is for writing to a `MemorySourceAccessor`.
This commit is contained in:
parent
d1a1888a3e
commit
3d9d5dc189
2 changed files with 81 additions and 0 deletions
|
@ -121,4 +121,60 @@ CanonPath MemorySourceAccessor::addFile(CanonPath path, std::string && contents)
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
using File = MemorySourceAccessor::File;
|
||||||
|
|
||||||
|
void MemorySink::createDirectory(const Path & path)
|
||||||
|
{
|
||||||
|
auto * f = dst.open(CanonPath{path}, File { File::Directory { } });
|
||||||
|
if (!f)
|
||||||
|
throw Error("file '%s' cannot be made because some parent file is not a directory", path);
|
||||||
|
|
||||||
|
if (!std::holds_alternative<File::Directory>(f->raw))
|
||||||
|
throw Error("file '%s' is not a directory", path);
|
||||||
|
};
|
||||||
|
|
||||||
|
void MemorySink::createRegularFile(const Path & path)
|
||||||
|
{
|
||||||
|
auto * f = dst.open(CanonPath{path}, File { File::Regular {} });
|
||||||
|
if (!f)
|
||||||
|
throw Error("file '%s' cannot be made because some parent file is not a directory", path);
|
||||||
|
if (!(r = std::get_if<File::Regular>(&f->raw)))
|
||||||
|
throw Error("file '%s' is not a regular file", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemorySink::closeRegularFile()
|
||||||
|
{
|
||||||
|
r = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemorySink::isExecutable()
|
||||||
|
{
|
||||||
|
assert(r);
|
||||||
|
r->executable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemorySink::preallocateContents(uint64_t len)
|
||||||
|
{
|
||||||
|
assert(r);
|
||||||
|
r->contents.reserve(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemorySink::receiveContents(std::string_view data)
|
||||||
|
{
|
||||||
|
assert(r);
|
||||||
|
r->contents += data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MemorySink::createSymlink(const Path & path, const std::string & target)
|
||||||
|
{
|
||||||
|
auto * f = dst.open(CanonPath{path}, File { File::Symlink { } });
|
||||||
|
if (!f)
|
||||||
|
throw Error("file '%s' cannot be made because some parent file is not a directory", path);
|
||||||
|
if (auto * s = std::get_if<File::Symlink>(&f->raw))
|
||||||
|
s->target = target;
|
||||||
|
else
|
||||||
|
throw Error("file '%s' is not a symbolic link", path);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "source-accessor.hh"
|
#include "source-accessor.hh"
|
||||||
|
#include "fs-sink.hh"
|
||||||
#include "variant-wrapper.hh"
|
#include "variant-wrapper.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
@ -71,4 +72,28 @@ struct MemorySourceAccessor : virtual SourceAccessor
|
||||||
CanonPath addFile(CanonPath path, std::string && contents);
|
CanonPath addFile(CanonPath path, std::string && contents);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write to a `MemorySourceAccessor` at the given path
|
||||||
|
*/
|
||||||
|
struct MemorySink : ParseSink
|
||||||
|
{
|
||||||
|
MemorySourceAccessor & dst;
|
||||||
|
|
||||||
|
MemorySink(MemorySourceAccessor & dst) : dst(dst) { }
|
||||||
|
|
||||||
|
void createDirectory(const Path & path) override;
|
||||||
|
|
||||||
|
void createRegularFile(const Path & path) override;
|
||||||
|
void receiveContents(std::string_view data) override;
|
||||||
|
void isExecutable() override;
|
||||||
|
void closeRegularFile() override;
|
||||||
|
|
||||||
|
void createSymlink(const Path & path, const std::string & target) override;
|
||||||
|
|
||||||
|
void preallocateContents(uint64_t size) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
MemorySourceAccessor::File::Regular * r;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue