Skip to content

Commit 9e10a8f

Browse files
committed
calling rust works
1 parent 266a205 commit 9e10a8f

File tree

6 files changed

+391
-174
lines changed

6 files changed

+391
-174
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+
1112
namespace ffi {
1213

1314
CxxAsyncInputStream::CxxAsyncInputStream(kj::Own<kj::AsyncInputStream> stream)
@@ -129,4 +130,5 @@ void CxxAsyncIoStream::abort_read() {
129130
}
130131

131132
} // namespace ffi
133+
132134
} // namespace kj_rs_io

kj-rs/io/bridge.h

Lines changed: 94 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
#pragma once
22

3+
#include "kj-rs/convert.h"
4+
#include "kj-rs/kj-rs.h"
5+
36
#include <rust/cxx.h>
47

58
#include <kj/async-io.h>
69
#include <kj/memory.h>
710

11+
#include <cstdint>
12+
13+
using namespace kj_rs;
14+
815
namespace kj_rs_io {
916

10-
// Forward declarations
17+
// Forward declarations
1118
namespace ffi {
1219
struct CxxAsyncOutputStream;
1320

@@ -64,71 +71,109 @@ struct CxxAsyncIoStream {
6471
void abort_read();
6572
};
6673

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
7875

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;
8381

8482
// 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;
9199
};
92100

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;
97106

98107
// 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+
}
103115

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;
106127
};
107128

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;
112134

113135
// 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+
}
117147

118148
// 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+
}
123165

124166
// kj::AsyncIoStream interface
125-
void shutdownWrite() override;
126-
void abortRead() override;
167+
void shutdownWrite() override {
168+
impl->shutdownWrite();
169+
}
127170

128-
private:
129-
::rust::Box<RustAsyncIoStream> rust_stream_;
130-
};
171+
void abortRead() override {
172+
impl->abortRead();
173+
}
131174

132-
} // namespace ffi
175+
private:
176+
T impl;
177+
};
133178

134179
} // namespace kj_rs_io

0 commit comments

Comments
 (0)