synopsis:
std::unique_ptr<InputSource> inputFromPath(path);
std::unique_ptr<InputSource> inputFromStdin();
std::unique_ptr<InputSource> inputFromFile(FILE *file,
bool takeOwnership = false);
std::unique_ptr<InputSource> inputFromStream(std::istream &stream);
std::unique_ptr<InputSource> inputFromMemory(const void *data,
std::size_t size);
std::unique_ptr<OutputSink> outputToPath(path, bool truncate = true);
std::unique_ptr<OutputSink> outputToStdout();
std::unique_ptr<OutputSink> outputToFile(FILE *file,
bool takeOwnership = false);
std::unique_ptr<OutputSink> outputToStream(std::ostream &stream);
std::unique_ptr<OutputSink> outputToMemory(
std::vector<std::uint8_t> &data);