Nix 2.26.3
Nix, the purely functional package manager; unstable internal interfaces
 
Loading...
Searching...
No Matches
memory-source-accessor.hh
1#include "source-path.hh"
2#include "fs-sink.hh"
3#include "variant-wrapper.hh"
4
5namespace nix {
6
10struct MemorySourceAccessor : virtual SourceAccessor
11{
17 struct File {
18 bool operator == (const File &) const noexcept;
19 std::strong_ordering operator <=> (const File &) const noexcept;
20
21 struct Regular {
22 bool executable = false;
23 std::string contents;
24
25 bool operator == (const Regular &) const = default;
26 auto operator <=> (const Regular &) const = default;
27 };
28
29 struct Directory {
30 using Name = std::string;
31
32 std::map<Name, File, std::less<>> contents;
33
34 bool operator == (const Directory &) const noexcept;
35 // TODO libc++ 16 (used by darwin) missing `std::map::operator <=>`, can't do yet.
36 bool operator < (const Directory &) const noexcept;
37 };
38
39 struct Symlink {
40 std::string target;
41
42 bool operator == (const Symlink &) const = default;
43 auto operator <=> (const Symlink &) const = default;
44 };
45
46 using Raw = std::variant<Regular, Directory, Symlink>;
47 Raw raw;
48
49 MAKE_WRAPPER_CONSTRUCTOR(File);
50
51 Stat lstat() const;
52 };
53
54 File root { File::Directory {} };
55
56 bool operator == (const MemorySourceAccessor &) const noexcept = default;
57 bool operator < (const MemorySourceAccessor & other) const noexcept {
58 return root < other.root;
59 }
60
61 std::string readFile(const CanonPath & path) override;
62 bool pathExists(const CanonPath & path) override;
63 std::optional<Stat> maybeLstat(const CanonPath & path) override;
64 DirEntries readDirectory(const CanonPath & path) override;
65 std::string readLink(const CanonPath & path) override;
66
78 File * open(const CanonPath & path, std::optional<File> create);
79
80 SourcePath addFile(CanonPath path, std::string && contents);
81};
82
83
84inline bool MemorySourceAccessor::File::Directory::operator == (
85 const MemorySourceAccessor::File::Directory &) const noexcept = default;
86inline bool MemorySourceAccessor::File::Directory::operator < (
87 const MemorySourceAccessor::File::Directory & other) const noexcept
88{
89 return contents < other.contents;
90}
91
92inline bool MemorySourceAccessor::File::operator == (
93 const MemorySourceAccessor::File &) const noexcept = default;
94inline std::strong_ordering MemorySourceAccessor::File::operator <=> (
95 const MemorySourceAccessor::File &) const noexcept = default;
96
100struct MemorySink : FileSystemObjectSink
101{
103
104 MemorySink(MemorySourceAccessor & dst) : dst(dst) { }
105
106 void createDirectory(const CanonPath & path) override;
107
109 const CanonPath & path,
110 std::function<void(CreateRegularFileSink &)>) override;
111
112 void createSymlink(const CanonPath & path, const std::string & target) override;
113};
114
115}
Definition canon-path.hh:41
std::optional< SourceAccessor::Stat > maybeLstat() const
CanonPath(std::string_view raw)
std::string readFile() const
std::string readLink() const
SourceAccessor::DirEntries readDirectory() const
bool pathExists() const
SourcePath.
Definition fs-sink.hh:16
Definition fs-sink.hh:27
void createRegularFile(const CanonPath &path, std::function< void(CreateRegularFileSink &)>) override
Definition memory-source-accessor.cc:149
Definition memory-source-accessor.hh:29
Definition memory-source-accessor.hh:21
Definition memory-source-accessor.hh:17
Definition memory-source-accessor.hh:11
File * open(const CanonPath &path, std::optional< File > create)
Definition memory-source-accessor.cc:6
Definition source-accessor.hh:96