1
1
#pragma once
2
2
3
+ #include " kj-rs/convert.h"
4
+ #include " kj-rs/kj-rs.h"
5
+
3
6
#include < rust/cxx.h>
4
7
5
8
#include < kj/async-io.h>
6
9
#include < kj/memory.h>
7
10
11
+ #include < cstdint>
12
+
13
+ using namespace kj_rs ;
14
+
8
15
namespace kj_rs_io {
9
16
10
- // Forward declarations
17
+ // Forward declarations
11
18
namespace ffi {
12
19
struct CxxAsyncOutputStream ;
13
20
@@ -64,71 +71,109 @@ struct CxxAsyncIoStream {
64
71
void abort_read ();
65
72
};
66
73
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
74
+ } // namespace ffi
78
75
79
- class RustInputStreamWrapper : public kj ::AsyncInputStream {
80
- public:
81
- explicit RustInputStreamWrapper (::rust::Box<RustAsyncInputStream> rust_stream);
82
- virtual ~RustInputStreamWrapper () = default ;
76
+ template <typename T>
77
+ class RustAsyncInputStream : public kj ::AsyncInputStream {
78
+ public:
79
+ explicit RustAsyncInputStream (T&& impl): impl(kj::mv(impl)) {}
80
+ virtual ~RustAsyncInputStream () = default ;
83
81
84
82
// 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_;
83
+ kj::Promise<size_t > tryRead (void * buffer, size_t minBytes, size_t maxBytes) override {
84
+ return impl->try_read (
85
+ kj::arrayPtr (reinterpret_cast <uint8_t *>(buffer), maxBytes).as <RustMutable>(), minBytes);
86
+ }
87
+
88
+ kj::Maybe<uint64_t > tryGetLength () override {
89
+ // todo
90
+ return kj::none;
91
+ }
92
+
93
+ // kj::Promise<uint64_t> pumpTo(kj::AsyncOutputStream& output, uint64_t amount) override {
94
+ // return impl->pumpTo(output, amount);
95
+ // }
96
+
97
+ private:
98
+ T impl;
91
99
};
92
100
93
- class RustOutputStreamWrapper : public kj ::AsyncOutputStream {
94
- public:
95
- explicit RustOutputStreamWrapper (::rust::Box<RustAsyncOutputStream> rust_stream);
96
- virtual ~RustOutputStreamWrapper () = default ;
101
+ template <typename T>
102
+ class RustAsyncOutputStream : public kj ::AsyncOutputStream {
103
+ public:
104
+ explicit RustAsyncOutputStream (T&& impl): impl(kj::mv(impl)) {}
105
+ virtual ~RustAsyncOutputStream () = default ;
97
106
98
107
// 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 ;
108
+ kj::Promise<void > write (kj::ArrayPtr<const kj::byte> buffer) override {
109
+ return impl->write (buffer);
110
+ }
111
+
112
+ kj::Promise<void > write (kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override {
113
+ return impl->write (pieces);
114
+ }
103
115
104
- private:
105
- ::rust::Box<RustAsyncOutputStream> rust_stream_;
116
+ kj::Maybe<kj::Promise<uint64_t >> tryPumpFrom (
117
+ kj::AsyncInputStream& input, uint64_t amount) override {
118
+ return impl->tryPumpFrom (input, amount);
119
+ }
120
+
121
+ kj::Promise<void > whenWriteDisconnected () override {
122
+ return impl->whenWriteDisconnected ();
123
+ }
124
+
125
+ private:
126
+ T impl;
106
127
};
107
128
108
- class RustIoStreamWrapper : public kj ::AsyncIoStream {
109
- public:
110
- explicit RustIoStreamWrapper (::rust::Box<RustAsyncIoStream> rust_stream);
111
- virtual ~RustIoStreamWrapper () = default ;
129
+ template <typename T>
130
+ class RustAsyncIoStream : public kj ::AsyncIoStream {
131
+ public:
132
+ explicit RustAsyncIoStream (T&& impl): impl(kj::mv(impl)) {}
133
+ virtual ~RustAsyncIoStream () = default ;
112
134
113
135
// 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 ;
136
+ kj::Promise<size_t > tryRead (void * buffer, size_t minBytes, size_t maxBytes) override {
137
+ return impl->tryRead (buffer, minBytes, maxBytes);
138
+ }
139
+
140
+ kj::Maybe<uint64_t > tryGetLength () override {
141
+ return impl->tryGetLength ();
142
+ }
143
+
144
+ kj::Promise<uint64_t > pumpTo (kj::AsyncOutputStream& output, uint64_t amount) override {
145
+ return impl->pumpTo (output, amount);
146
+ }
117
147
118
148
// 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 ;
149
+ kj::Promise<void > write (kj::ArrayPtr<const kj::byte> buffer) override {
150
+ return impl->write (buffer);
151
+ }
152
+
153
+ kj::Promise<void > write (kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override {
154
+ return impl->write (pieces);
155
+ }
156
+
157
+ kj::Maybe<kj::Promise<uint64_t >> tryPumpFrom (
158
+ kj::AsyncInputStream& input, uint64_t amount) override {
159
+ return impl->tryPumpFrom (input, amount);
160
+ }
161
+
162
+ kj::Promise<void > whenWriteDisconnected () override {
163
+ return impl->whenWriteDisconnected ();
164
+ }
123
165
124
166
// kj::AsyncIoStream interface
125
- void shutdownWrite () override ;
126
- void abortRead () override ;
167
+ void shutdownWrite () override {
168
+ impl->shutdownWrite ();
169
+ }
127
170
128
- private:
129
- ::rust::Box<RustAsyncIoStream> rust_stream_ ;
130
- };
171
+ void abortRead () override {
172
+ impl-> abortRead () ;
173
+ }
131
174
132
- } // namespace ffi
175
+ private:
176
+ T impl;
177
+ };
133
178
134
179
} // namespace kj_rs_io
0 commit comments