Я хочу встроить FileIO.FromFile
в график, чтобы можно было использовать вывод ByteString
этого источника.
В каждой попытке ниже я использую одну и ту же раковину:
Sink<ByteString, Task<IImmutableList<ByteString>>> sink = Sink
.Seq<ByteString>()
.Named("sink");
Чтобы проиллюстрировать свои трудности, я покажу серию попыток с полными типами:
Сначала - используя FileIO.FromFile
в качестве источника:
Source<ByteString, Task<IOResult>> source = FileIO
.FromFile(new FileInfo(fileName))
.Named("source");
IRunnableGraph<Task<IOResult>> runnableGraph = source.To(sink);
IOResult result = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());
Это компилируется.
Теперь я хочу использовать источник string
и создать из него ByteString
, используя FileIO.FromFile
:
Source<Source<ByteString, Task<IOResult>>, NotUsed> source = Source
.Single(fileName)
.Select(x => FileIO.FromFile(new FileInfo(x)))
.Named("source");
??? runnableGraph = source.To(sink);
??? result = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());
Это не компилируется, так как тип источника является источником (Source<Source<ByteString, Task<IOResult>>, NotUsed>)
, который не может быть подан в приемник.
Итак, я попытался использовать поток для передачи string
в FileIO.FromFile
:
Source<string, NotUsed> source = Source
.Single(fileName)
.Named("source");
Flow<string, Source<ByteString, Task<IOResult>>, NotUsed> flow = Flow
.FromFunction<string, Source<ByteString, Task<IOResult>>>(x => FileIO.FromFile(new FileInfo(x)));
??? runnableGraph = source.Via(flow).To(sink);
??? result = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());
Это тоже не удается скомпилировать (хотя оно становится ближе.) Тип вывода flow
равен Source<ByteString, Task<IOResult>>
, соответствует типу источника с первой попытки, но все еще не может быть передан в приемник!
Почему источник типа Source<ByteString, Task<IOResult>>
в первом примере может быть передан в приемник, но вывод потока в последнем примере не будет?