7
7
8
8
namespace kj_rs_io {
9
9
10
- // Forward declarations
10
+ // Forward declarations
11
+ namespace ffi {
11
12
struct CxxAsyncOutputStream ;
12
13
13
14
// Wrapper structs for KJ async stream types to provide controlled FFI interface
@@ -63,4 +64,71 @@ struct CxxAsyncIoStream {
63
64
void abort_read ();
64
65
};
65
66
67
+ } // namespace ffi
68
+
69
+ // C++ classes that wrap Rust FFI types and implement KJ interfaces
70
+ namespace ffi {
71
+
72
+ // Forward declarations for Rust FFI types
73
+ struct RustAsyncInputStream ;
74
+ struct RustAsyncOutputStream ;
75
+ struct RustAsyncIoStream ;
76
+
77
+ // C++ classes that wrap Rust FFI types and implement KJ interfaces
78
+
79
+ class RustInputStreamWrapper : public kj ::AsyncInputStream {
80
+ public:
81
+ explicit RustInputStreamWrapper (::rust::Box<RustAsyncInputStream> rust_stream);
82
+ virtual ~RustInputStreamWrapper () = default ;
83
+
84
+ // kj::AsyncInputStream interface
85
+ kj::Promise<size_t > tryRead (void * buffer, size_t minBytes, size_t maxBytes) override ;
86
+ kj::Maybe<uint64_t > tryGetLength () override ;
87
+ kj::Promise<uint64_t > pumpTo (kj::AsyncOutputStream& output, uint64_t amount) override ;
88
+
89
+ private:
90
+ ::rust::Box<RustAsyncInputStream> rust_stream_;
91
+ };
92
+
93
+ class RustOutputStreamWrapper : public kj ::AsyncOutputStream {
94
+ public:
95
+ explicit RustOutputStreamWrapper (::rust::Box<RustAsyncOutputStream> rust_stream);
96
+ virtual ~RustOutputStreamWrapper () = default ;
97
+
98
+ // kj::AsyncOutputStream interface
99
+ kj::Promise<void > write (kj::ArrayPtr<const kj::byte> buffer) override ;
100
+ kj::Promise<void > write (kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override ;
101
+ kj::Maybe<kj::Promise<uint64_t >> tryPumpFrom (kj::AsyncInputStream& input, uint64_t amount) override ;
102
+ kj::Promise<void > whenWriteDisconnected () override ;
103
+
104
+ private:
105
+ ::rust::Box<RustAsyncOutputStream> rust_stream_;
106
+ };
107
+
108
+ class RustIoStreamWrapper : public kj ::AsyncIoStream {
109
+ public:
110
+ explicit RustIoStreamWrapper (::rust::Box<RustAsyncIoStream> rust_stream);
111
+ virtual ~RustIoStreamWrapper () = default ;
112
+
113
+ // kj::AsyncInputStream interface
114
+ kj::Promise<size_t > tryRead (void * buffer, size_t minBytes, size_t maxBytes) override ;
115
+ kj::Maybe<uint64_t > tryGetLength () override ;
116
+ kj::Promise<uint64_t > pumpTo (kj::AsyncOutputStream& output, uint64_t amount) override ;
117
+
118
+ // kj::AsyncOutputStream interface
119
+ kj::Promise<void > write (kj::ArrayPtr<const kj::byte> buffer) override ;
120
+ kj::Promise<void > write (kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override ;
121
+ kj::Maybe<kj::Promise<uint64_t >> tryPumpFrom (kj::AsyncInputStream& input, uint64_t amount) override ;
122
+ kj::Promise<void > whenWriteDisconnected () override ;
123
+
124
+ // kj::AsyncIoStream interface
125
+ void shutdownWrite () override ;
126
+ void abortRead () override ;
127
+
128
+ private:
129
+ ::rust::Box<RustAsyncIoStream> rust_stream_;
130
+ };
131
+
132
+ } // namespace ffi
133
+
66
134
} // namespace kj_rs_io
0 commit comments