Skip to content

Commit 266a205

Browse files
committed
rust wrappers
1 parent 73b9de4 commit 266a205

File tree

5 files changed

+533
-99
lines changed

5 files changed

+533
-99
lines changed

kj-rs/io/bridge.c++

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using namespace kj_rs;
99

1010
namespace kj_rs_io {
11+
namespace ffi {
1112

1213
CxxAsyncInputStream::CxxAsyncInputStream(kj::Own<kj::AsyncInputStream> stream)
1314
: stream(kj::mv(stream)) {}
@@ -127,4 +128,5 @@ void CxxAsyncIoStream::abort_read() {
127128
stream->abortRead();
128129
}
129130

131+
} // namespace ffi
130132
} // namespace kj_rs_io

kj-rs/io/bridge.h

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
namespace kj_rs_io {
99

10-
// Forward declarations
10+
// Forward declarations
11+
namespace ffi {
1112
struct CxxAsyncOutputStream;
1213

1314
// Wrapper structs for KJ async stream types to provide controlled FFI interface
@@ -63,4 +64,71 @@ struct CxxAsyncIoStream {
6364
void abort_read();
6465
};
6566

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+
66134
} // namespace kj_rs_io

0 commit comments

Comments
 (0)