mirror of
https://github.com/NixOS/nix
synced 2025-06-29 19:03:16 +02:00
Revert "Revert "Use template structs instead of phantoms""
This is the more typically way to do [Argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)-leveraging generic serializers in C++. It makes the relationship between the `read` and `write` methods more clear and rigorous, and also looks more familiar to users coming from other languages that do not have C++'s libertine ad-hoc overloading. I am returning to this because during the review in https://github.com/NixOS/nix/pull/6223, it came up as something that would make the code easier to read --- easier today hopefully already, but definitely easier if we were have multiple codified protocols with code sharing between them as that PR seeks to accomplish. If I recall correctly, the main criticism of this the first time around (in 2020) was that having to specify the type when writing, e.g. `WorkerProto<MyType>::write`, was too verbose and cumbersome. This is now addressed with the `workerProtoWrite` wrapper function. This method is also the way `nlohmann::json`, which we have used for a number of years now, does its serializers, for what its worth. This reverts commit45a0ed82f0
. That commit in turn reverted9ab07e99f5
.
This commit is contained in:
parent
684e9be8b9
commit
cb5052d98f
10 changed files with 182 additions and 151 deletions
|
@ -849,7 +849,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
case cmdQueryValidPaths: {
|
||||
bool lock = readInt(in);
|
||||
bool substitute = readInt(in);
|
||||
auto paths = worker_proto::read(*store, in, Phantom<StorePathSet> {});
|
||||
auto paths = WorkerProto<StorePathSet>::read(*store, in);
|
||||
if (lock && writeAllowed)
|
||||
for (auto & path : paths)
|
||||
store->addTempRoot(path);
|
||||
|
@ -858,19 +858,19 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
store->substitutePaths(paths);
|
||||
}
|
||||
|
||||
worker_proto::write(*store, out, store->queryValidPaths(paths));
|
||||
workerProtoWrite(*store, out, store->queryValidPaths(paths));
|
||||
break;
|
||||
}
|
||||
|
||||
case cmdQueryPathInfos: {
|
||||
auto paths = worker_proto::read(*store, in, Phantom<StorePathSet> {});
|
||||
auto paths = WorkerProto<StorePathSet>::read(*store, in);
|
||||
// !!! Maybe we want a queryPathInfos?
|
||||
for (auto & i : paths) {
|
||||
try {
|
||||
auto info = store->queryPathInfo(i);
|
||||
out << store->printStorePath(info->path)
|
||||
<< (info->deriver ? store->printStorePath(*info->deriver) : "");
|
||||
worker_proto::write(*store, out, info->references);
|
||||
workerProtoWrite(*store, out, info->references);
|
||||
// !!! Maybe we want compression?
|
||||
out << info->narSize // downloadSize
|
||||
<< info->narSize;
|
||||
|
@ -898,7 +898,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
|
||||
case cmdExportPaths: {
|
||||
readInt(in); // obsolete
|
||||
store->exportPaths(worker_proto::read(*store, in, Phantom<StorePathSet> {}), out);
|
||||
store->exportPaths(WorkerProto<StorePathSet>::read(*store, in), out);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -944,7 +944,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
DrvOutputs builtOutputs;
|
||||
for (auto & [output, realisation] : status.builtOutputs)
|
||||
builtOutputs.insert_or_assign(realisation.id, realisation);
|
||||
worker_proto::write(*store, out, builtOutputs);
|
||||
workerProtoWrite(*store, out, builtOutputs);
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -953,9 +953,9 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
case cmdQueryClosure: {
|
||||
bool includeOutputs = readInt(in);
|
||||
StorePathSet closure;
|
||||
store->computeFSClosure(worker_proto::read(*store, in, Phantom<StorePathSet> {}),
|
||||
store->computeFSClosure(WorkerProto<StorePathSet>::read(*store, in),
|
||||
closure, false, includeOutputs);
|
||||
worker_proto::write(*store, out, closure);
|
||||
workerProtoWrite(*store, out, closure);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -970,7 +970,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
|||
};
|
||||
if (deriver != "")
|
||||
info.deriver = store->parseStorePath(deriver);
|
||||
info.references = worker_proto::read(*store, in, Phantom<StorePathSet> {});
|
||||
info.references = WorkerProto<StorePathSet>::read(*store, in);
|
||||
in >> info.registrationTime >> info.narSize >> info.ultimate;
|
||||
info.sigs = readStrings<StringSet>(in);
|
||||
info.ca = ContentAddress::parseOpt(readString(in));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue