1use std::hash::{DefaultHasher, Hash, Hasher};
2
3use futures::{AsyncBufRead, AsyncRead, AsyncSeek, AsyncWrite};
4use pyo3::prelude::*;
5
6mod utils;
7pub use utils::*;
8
9#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
11#[pyclass(frozen)]
12#[repr(u8)]
13pub enum Whence {
14 Start = 0,
15 End = 1,
16 Current = 2,
17}
18
19#[pymethods]
20impl Whence {
21 #[staticmethod]
23 pub fn start() -> Self {
24 Self::Start
25 }
26
27 #[staticmethod]
29 pub fn end() -> Self {
30 Self::End
31 }
32
33 #[staticmethod]
35 pub fn current() -> Self {
36 Self::Current
37 }
38
39 pub fn __str__(&self) -> &'static str {
40 match self {
41 Self::Start => "start",
42 Self::End => "end",
43 Self::Current => "current",
44 }
45 }
46
47 pub fn __repr__(&self) -> &'static str {
48 match self {
49 Self::Start => "Whence::Start",
50 Self::End => "Whence::End",
51 Self::Current => "Whence::Current",
52 }
53 }
54
55 pub fn __eq__(&self, other: Self) -> bool {
56 *self == other
57 }
58
59 pub fn __ne__(&self, other: Self) -> bool {
60 *self != other
61 }
62
63 pub fn __hash__(&self) -> u64 {
64 (*self as u8) as u64
65 }
66
67 pub fn __int__(&self) -> u8 {
68 *self as u8
69 }
70}
71
72#[derive(Copy, Clone, Eq, PartialEq, Hash)]
75#[pyclass]
76pub struct SeekFrom {
77 #[pyo3(get, set)]
79 whence: Whence,
80 #[pyo3(get, set)]
82 offset: i64,
83}
84
85impl From<std::io::SeekFrom> for SeekFrom {
86 fn from(seek_from: std::io::SeekFrom) -> Self {
87 match seek_from {
88 std::io::SeekFrom::Start(offset) => Self::start(offset),
89 std::io::SeekFrom::End(offset) => Self::end(offset),
90 std::io::SeekFrom::Current(offset) => Self::current(offset),
91 }
92 }
93}
94
95impl From<SeekFrom> for std::io::SeekFrom {
96 fn from(seek_from: SeekFrom) -> Self {
97 match seek_from.whence {
98 Whence::Start => Self::Start(seek_from.offset as u64),
99 Whence::End => Self::End(seek_from.offset),
100 Whence::Current => Self::Current(seek_from.offset),
101 }
102 }
103}
104
105#[pymethods]
106impl SeekFrom {
107 #[new]
108 pub fn new(offset: i64, whence: Whence) -> Self {
109 Self { whence, offset }
110 }
111
112 #[staticmethod]
114 pub fn start(offset: u64) -> Self {
115 Self::new(offset as i64, Whence::Start)
116 }
117
118 #[staticmethod]
120 pub fn end(offset: i64) -> Self {
121 Self::new(offset, Whence::End)
122 }
123
124 #[staticmethod]
126 pub fn current(offset: i64) -> Self {
127 Self::new(offset, Whence::Current)
128 }
129
130 pub fn __str__(&self) -> ::std::string::String {
131 match self.whence {
132 Whence::Start => format!("start({})", self.offset),
133 Whence::End => format!("end({})", self.offset),
134 Whence::Current => format!("current({})", self.offset),
135 }
136 }
137
138 pub fn __repr__(&self) -> ::std::string::String {
139 match self.whence {
140 Whence::Start => format!("SeekFrom::Start({})", self.offset),
141 Whence::End => format!("SeekFrom::End({})", self.offset),
142 Whence::Current => format!("SeekFrom::Current({})", self.offset),
143 }
144 }
145
146 pub fn __eq__(&self, other: Self) -> bool {
147 self.whence == other.whence && self.offset == other.offset
148 }
149
150 pub fn __ne__(&self, other: Self) -> bool {
151 self.whence != other.whence || self.offset != other.offset
152 }
153
154 pub fn __hash__(&self) -> u64 {
155 let mut hasher = DefaultHasher::new();
156 self.hash(&mut hasher);
157 hasher.finish()
158 }
159}
160
161#[doc(hidden)]
162pub enum State<T> {
163 Ok(T),
164 Closed,
165}
166
167#[doc(hidden)]
168pub mod __private {
169 pub use super::*;
170 pub use ::smallvec;
171 pub use futures;
172 pub use futures::lock::Mutex;
173 pub use paste;
174 pub use pyo3;
175}
176
177#[doc(hidden)]
178pub trait AsyncReadWrite: AsyncRead + AsyncWrite + Send + Sync + Unpin + 'static {}
179
180impl<T> AsyncReadWrite for T where T: AsyncRead + AsyncWrite + Send + Sync + Unpin + 'static {}
181
182#[doc(hidden)]
183pub trait AsyncBufReadWrite: AsyncBufRead + AsyncWrite + Send + Sync + Unpin + 'static {}
184
185impl<T> AsyncBufReadWrite for T where T: AsyncBufRead + AsyncWrite + Send + Sync + Unpin + 'static {}
186
187#[doc(hidden)]
188pub trait AsyncSeekRead: AsyncRead + AsyncSeek + Send + Sync + Unpin + 'static {}
189
190impl<T> AsyncSeekRead for T where T: AsyncRead + AsyncSeek + Send + Sync + Unpin + 'static {}
191
192#[doc(hidden)]
193pub trait AsyncSeekBufRead: AsyncBufRead + AsyncSeek + Send + Sync + Unpin + 'static {}
194
195impl<T> AsyncSeekBufRead for T where T: AsyncBufRead + AsyncSeek + Send + Sync + Unpin + 'static {}
196
197#[doc(hidden)]
198pub trait AsyncSeekWrite: AsyncWrite + AsyncSeek + Send + Sync + Unpin + 'static {}
199
200impl<T> AsyncSeekWrite for T where T: AsyncWrite + AsyncSeek + Send + Sync + Unpin + 'static {}
201
202#[doc(hidden)]
203pub trait AsyncSeekReadWrite: AsyncReadWrite + AsyncSeek + Send + Sync + Unpin + 'static {}
204
205impl<T> AsyncSeekReadWrite for T where T: AsyncReadWrite + AsyncSeek + Send + Sync + Unpin + 'static {}
206
207#[doc(hidden)]
208pub trait AsyncSeekBufReadWrite:
209 AsyncBufReadWrite + AsyncSeek + Send + Sync + Unpin + 'static
210{
211}
212
213impl<T> AsyncSeekBufReadWrite for T where
214 T: AsyncBufReadWrite + AsyncSeek + Send + Sync + Unpin + 'static
215{
216}
217
218#[doc(hidden)]
219#[macro_export]
220macro_rules! __close {
221 ($this:ident.$future_into_py: ident($py:ident)) => {{
222 let state = $this.0.clone();
223 $future_into_py($py, async move {
224 let mut state = state.lock().await;
225 *state = $crate::__private::State::Closed;
226 ::std::result::Result::Ok(())
227 })
228 }};
229}
230
231#[doc(hidden)]
232#[macro_export]
233macro_rules! __writer_close {
234 ($this:ident.$future_into_py: ident($py:ident)) => {{
235 use $crate::__private::futures::AsyncWriteExt;
236
237 let state = $this.0.clone();
238 $future_into_py($py, async move {
239 let mut state = state.lock().await;
240 match &mut *state {
241 $crate::__private::State::Ok(writer) => {
242 writer.close().await.map_err(|err| {
243 $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())
244 })?;
245 *state = $crate::__private::State::Closed;
246 ::std::result::Result::Ok(())
247 }
248 $crate::__private::State::Closed => ::std::result::Result::Ok(()),
249 }
250 })
251 }};
252}
253
254#[doc(hidden)]
255#[macro_export]
256macro_rules! __read {
257 ($this:ident.$future_into_py: ident($py:ident, $chunk_size: ident)) => {{
258 use $crate::__private::futures::AsyncReadExt;
259
260 let state = $this.0.clone();
261 $future_into_py($py, async move {
262 let mut state = state.lock().await;
263 match &mut *state {
264 $crate::__private::State::Ok(reader) => {
265 let mut buf: $crate::__private::Bytes = $crate::__private::smallvec::smallvec![0; $chunk_size];
266 match reader.read(&mut buf).await {
267 ::std::result::Result::Ok(n) => {
268 buf.truncate(n);
269
270 $crate::__private::pyo3::Python::with_gil(|py| $crate::__private::Buffer::new(buf).into_memory_view(py))
271 }
272 ::std::result::Result::Err(e) => ::std::result::Result::Err($crate::__private::pyo3::exceptions::PyIOError::new_err(e.to_string())),
273 }
274 }
275 $crate::__private::State::Closed => ::std::result::Result::Err($crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed")),
276 }
277 })
278 }};
279}
280
281#[doc(hidden)]
282#[macro_export]
283macro_rules! __read_exact {
284 ($this:ident.$future_into_py: ident($py:ident, $bytes: ident)) => {{
285 use $crate::__private::futures::AsyncReadExt;
286
287 let state = $this.0.clone();
288 $future_into_py($py, async move {
289 let mut state = state.lock().await;
290 match &mut *state {
291 $crate::__private::State::Ok(reader) => {
292 let mut buf: $crate::__private::Bytes = $crate::__private::smallvec::smallvec![0; $bytes];
293 match reader.read_exact(&mut buf).await {
294 Ok(_) => $crate::__private::pyo3::Python::with_gil(|py| $crate::__private::Buffer::new(buf).into_memory_view(py)),
295 ::std::result::Result::Err(e) => ::std::result::Result::Err($crate::__private::pyo3::exceptions::PyIOError::new_err(e.to_string())),
296 }
297 }
298 $crate::__private::State::Closed => ::std::result::Result::Err($crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed")),
299 }
300 })
301 }};
302}
303
304#[doc(hidden)]
305#[macro_export]
306macro_rules! __read_to_end {
307 ($this:ident.$future_into_py: ident($py:ident, $chunk_size: ident)) => {{
308 use $crate::__private::futures::AsyncReadExt;
309
310 let state = $this.0.clone();
311 $future_into_py($py, async move {
312 let mut state = state.lock().await;
313 match &mut *state {
314 $crate::__private::State::Ok(reader) => {
315 let mut buf = $crate::__private::Bytes::new();
316 loop {
317 let old_len = buf.len();
319 buf.resize(old_len + $chunk_size, 0);
320
321 match reader.read(&mut buf[old_len..]).await {
322 Ok(0) => {
323 buf.truncate(old_len); break; }
326 ::std::result::Result::Ok(n) => {
327 buf.truncate(old_len + n); }
329 ::std::result::Result::Err(e) => {
330 return ::std::result::Result::Err(
331 $crate::__private::pyo3::exceptions::PyIOError::new_err(e.to_string()),
332 )
333 }
334 }
335 }
336
337 $crate::__private::pyo3::Python::with_gil(|py| {
338 $crate::__private::Buffer::new(buf).into_memory_view(py)
339 })
340 }
341 $crate::__private::State::Closed => ::std::result::Result::Err(
342 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
343 ),
344 }
345 })
346 }};
347}
348
349#[doc(hidden)]
350#[macro_export]
351macro_rules! __read_to_string {
352 ($this:ident.$future_into_py: ident($py:ident)) => {{
353 use $crate::__private::futures::AsyncReadExt;
354
355 let state = $this.0.clone();
356 $future_into_py($py, async move {
357 let mut state = state.lock().await;
358 match &mut *state {
359 $crate::__private::State::Ok(reader) => {
360 let mut buf = ::std::string::String::new();
361 reader
362 .read_to_string(&mut buf)
363 .await
364 .map(|_| buf)
365 .map_err(|e| $crate::__private::pyo3::exceptions::PyIOError::new_err(e.to_string()))
366 }
367 $crate::__private::State::Closed => ::std::result::Result::Err(
368 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
369 ),
370 }
371 })
372 }};
373}
374
375#[doc(hidden)]
376#[macro_export]
377macro_rules! __write {
378 ($this:ident.$future_into_py: ident($py:ident, $bytes: ident)) => {{
379 use $crate::__private::futures::AsyncWriteExt;
380
381 let state = $this.0.clone();
382 let bytes = $crate::__private::Bytes::from($bytes);
383 $future_into_py($py, async move {
384 let mut state = state.lock().await;
385 match &mut *state {
386 $crate::__private::State::Ok(writer) => writer
387 .write(&bytes)
388 .await
389 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())),
390 $crate::__private::State::Closed => ::std::result::Result::Err(
391 $crate::__private::pyo3::exceptions::PyIOError::new_err("writer is closed"),
392 ),
393 }
394 })
395 }};
396}
397
398#[doc(hidden)]
399#[macro_export]
400macro_rules! __write_all {
401 ($this:ident.$future_into_py: ident($py:ident, $bytes: ident)) => {{
402 use $crate::__private::futures::AsyncWriteExt;
403
404 let state = $this.0.clone();
405 let bytes = $crate::__private::Bytes::from($bytes);
406 $future_into_py($py, async move {
407 let mut state = state.lock().await;
408 match &mut *state {
409 $crate::__private::State::Ok(writer) => writer
410 .write_all(&bytes)
411 .await
412 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())),
413 $crate::__private::State::Closed => ::std::result::Result::Err(
414 $crate::__private::pyo3::exceptions::PyIOError::new_err("writer is closed"),
415 ),
416 }
417 })
418 }};
419}
420
421#[doc(hidden)]
422#[macro_export]
423macro_rules! __flush {
424 ($this:ident.$future_into_py: ident($py:ident)) => {{
425 use $crate::__private::futures::AsyncWriteExt;
426
427 let state = $this.0.clone();
428 $future_into_py($py, async move {
429 let mut state = state.lock().await;
430 match &mut *state {
431 $crate::__private::State::Ok(writer) => writer
432 .flush()
433 .await
434 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())),
435 $crate::__private::State::Closed => ::std::result::Result::Err(
436 $crate::__private::pyo3::exceptions::PyIOError::new_err("writer is closed"),
437 ),
438 }
439 })
440 }};
441}
442
443#[doc(hidden)]
444#[macro_export]
445macro_rules! __fill_buf {
446 ($this:ident.$future_into_py: ident($py:ident)) => {{
447 use $crate::__private::futures::AsyncBufReadExt;
448
449 let state = $this.0.clone();
450 $future_into_py($py, async move {
451 let mut state = state.lock().await;
452 match &mut *state {
453 $crate::__private::State::Ok(reader) => {
454 let buf = reader
455 .fill_buf()
456 .await
457 .map(|buf| $crate::__private::Buffer::from(buf))
458 .map_err(|err| {
459 $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())
460 })?;
461
462 $crate::__private::pyo3::Python::with_gil(|py| buf.into_memory_view(py))
463 }
464 $crate::__private::State::Closed => ::std::result::Result::Err(
465 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
466 ),
467 }
468 })
469 }};
470}
471
472#[doc(hidden)]
473#[macro_export]
474macro_rules! __consume {
475 ($this:ident.$future_into_py: ident($py:ident, $amt:ident)) => {{
476 use $crate::__private::futures::AsyncBufReadExt;
477
478 let state = $this.0.clone();
479 $future_into_py($py, async move {
480 let mut state = state.lock().await;
481 match &mut *state {
482 $crate::__private::State::Ok(reader) => Ok(reader.consume_unpin($amt)),
483 $crate::__private::State::Closed => ::std::result::Result::Err(
484 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
485 ),
486 }
487 })
488 }};
489}
490
491#[doc(hidden)]
492#[macro_export]
493macro_rules! __read_until {
494 ($this:ident.$future_into_py: ident($py:ident, $byte:ident)) => {{
495 use $crate::__private::futures::AsyncBufReadExt;
496
497 let state = $this.0.clone();
498 $future_into_py($py, async move {
499 let mut state = state.lock().await;
500 match &mut *state {
501 $crate::__private::State::Ok(reader) => {
502 let mut buf = ::std::vec::Vec::new();
503 let buf = reader
504 .read_until($byte, &mut buf)
505 .await
506 .map(|_| $crate::__private::Buffer::from(buf))
507 .map_err(|err| {
508 $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())
509 })?;
510
511 $crate::__private::pyo3::Python::with_gil(|py| buf.into_memory_view(py))
512 }
513 $crate::__private::State::Closed => ::std::result::Result::Err(
514 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
515 ),
516 }
517 })
518 }};
519}
520
521#[doc(hidden)]
522#[macro_export]
523macro_rules! __read_line {
524 ($this:ident.$future_into_py: ident($py:ident)) => {{
525 use $crate::__private::futures::AsyncBufReadExt;
526
527 let state = $this.0.clone();
528 $future_into_py($py, async move {
529 let mut state = state.lock().await;
530 match &mut *state {
531 $crate::__private::State::Ok(reader) => {
532 let mut buf = ::std::string::String::new();
533 reader
534 .read_line(&mut buf)
535 .await
536 .map(|_| buf)
537 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string()))
538 }
539 $crate::__private::State::Closed => ::std::result::Result::Err(
540 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
541 ),
542 }
543 })
544 }};
545}
546
547#[doc(hidden)]
548#[macro_export]
549macro_rules! __lines {
550 ($this:ident.$future_into_py: ident($py:ident)) => {{
551 use $crate::__private::futures::{AsyncBufReadExt, StreamExt};
552
553 let state = $this.0.clone();
554 $future_into_py($py, async move {
555 let mut state = state.lock().await;
556 match &mut *state {
557 $crate::__private::State::Ok(reader) => {
558 let mut lines = reader.lines();
559 let mut buf = ::std::vec::Vec::new();
560 while let ::std::option::Option::Some(line) = lines.next().await {
561 buf.push(line.map_err(|err| {
562 $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())
563 })?);
564 }
565 Ok(buf)
566 }
567 $crate::__private::State::Closed => ::std::result::Result::Err(
568 $crate::__private::pyo3::exceptions::PyIOError::new_err("reader is closed"),
569 ),
570 }
571 })
572 }};
573}
574
575#[doc(hidden)]
576#[macro_export]
577macro_rules! __seek {
578 ($this:ident.$future_into_py: ident($py:ident, $seek_from:ident)) => {{
579 use $crate::__private::futures::AsyncSeekExt;
580
581 let state = $this.0.clone();
582 $future_into_py($py, async move {
583 let mut state = state.lock().await;
584 match &mut *state {
585 $crate::__private::State::Ok(reader) => reader
586 .seek($seek_from.into())
587 .await
588 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())),
589 $crate::__private::State::Closed => ::std::result::Result::Err(
590 $crate::__private::pyo3::exceptions::PyIOError::new_err("seeker is closed"),
591 ),
592 }
593 })
594 }};
595}
596
597#[doc(hidden)]
598#[macro_export]
599macro_rules! __position {
600 ($this:ident.$future_into_py: ident($py:ident)) => {{
601 use $crate::__private::futures::AsyncSeekExt;
602
603 let state = $this.0.clone();
604 $future_into_py($py, async move {
605 let mut state = state.lock().await;
606 match &mut *state {
607 $crate::__private::State::Ok(reader) => reader
608 .stream_position()
609 .await
610 .map_err(|err| $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())),
611 $crate::__private::State::Closed => ::std::result::Result::Err(
612 $crate::__private::pyo3::exceptions::PyIOError::new_err("seeker is closed"),
613 ),
614 }
615 })
616 }};
617}
618
619#[doc(hidden)]
620#[macro_export]
621macro_rules! __aexit {
622 ($this:ident.$future_into_py: ident($py:ident)) => {{
623 use $crate::__private::futures::AsyncSeekExt;
624
625 let state = $this.0.clone();
626 $future_into_py($py, async move {
627 let mut state = state.lock().await;
628 *state = $crate::__private::State::Closed;
629 ::std::result::Result::Ok(())
630 })
631 }};
632}
633
634#[doc(hidden)]
635#[macro_export]
636macro_rules! __writer_aexit {
637 ($this:ident.$future_into_py: ident($py:ident)) => {{
638 use $crate::__private::futures::AsyncWriteExt;
639
640 let state = $this.0.clone();
641 $future_into_py($py, async move {
642 let mut state = state.lock().await;
643 match &mut *state {
644 $crate::__private::State::Ok(writer) => {
645 writer.close().await.map_err(|err| {
646 $crate::__private::pyo3::exceptions::PyIOError::new_err(err.to_string())
647 })?;
648 *state = $crate::__private::State::Closed;
649 ::std::result::Result::Ok(())
650 }
651 $crate::__private::State::Closed => ::std::result::Result::Ok(()),
652 }
653 })
654 }};
655}
656
657#[doc(hidden)]
658#[macro_export]
659macro_rules! __impl_async_read {
660 ($ty:ty) => {
661 impl $crate::__private::futures::AsyncRead for $ty {
662 fn poll_read(
663 self: ::std::pin::Pin<&mut Self>,
664 cx: &mut ::std::task::Context<'_>,
665 buf: &mut [u8],
666 ) -> ::std::task::Poll<std::io::Result<usize>> {
667 let state = self.0.lock();
668 $crate::__private::futures::pin_mut!(state);
669 match state.poll(cx) {
670 ::std::task::Poll::Ready(mut state) => match &mut *state {
671 $crate::__private::State::Ok(reader) => {
672 let reader = ::std::pin::Pin::new(&mut *reader);
673 reader.poll_read(cx, buf)
674 }
675 $crate::__private::State::Closed => {
676 ::std::task::Poll::Ready(::std::result::Result::Err(std::io::Error::new(
677 std::io::ErrorKind::BrokenPipe,
678 "reader is closed",
679 )))
680 }
681 },
682 ::std::task::Poll::Pending => ::std::task::Poll::Pending,
683 }
684 }
685 }
686 };
687}
688
689#[doc(hidden)]
690#[macro_export]
691macro_rules! __impl_async_write {
692 ($ty: ty) => {
693 impl $crate::__private::futures::AsyncWrite for $ty {
694 fn poll_write(
695 self: ::std::pin::Pin<&mut Self>,
696 cx: &mut ::std::task::Context<'_>,
697 buf: &[u8],
698 ) -> ::std::task::Poll<std::io::Result<usize>> {
699 let state = self.0.lock();
700 $crate::__private::futures::pin_mut!(state);
701 match state.poll(cx) {
702 ::std::task::Poll::Ready(mut state) => match &mut *state {
703 $crate::__private::State::Ok(writer) => {
704 let writer = ::std::pin::Pin::new(&mut *writer);
705 writer.poll_write(cx, buf)
706 }
707 $crate::__private::State::Closed => {
708 ::std::task::Poll::Ready(::std::result::Result::Err(std::io::Error::new(
709 std::io::ErrorKind::BrokenPipe,
710 "writer is closed",
711 )))
712 }
713 },
714 ::std::task::Poll::Pending => ::std::task::Poll::Pending,
715 }
716 }
717
718 fn poll_flush(
719 self: ::std::pin::Pin<&mut Self>,
720 cx: &mut ::std::task::Context<'_>,
721 ) -> ::std::task::Poll<std::io::Result<()>> {
722 let state = self.0.lock();
723 $crate::__private::futures::pin_mut!(state);
724 match state.poll(cx) {
725 ::std::task::Poll::Ready(mut state) => match &mut *state {
726 $crate::__private::State::Ok(writer) => {
727 let writer = ::std::pin::Pin::new(&mut *writer);
728 writer.poll_flush(cx)
729 }
730 $crate::__private::State::Closed => {
731 ::std::task::Poll::Ready(::std::result::Result::Err(std::io::Error::new(
732 std::io::ErrorKind::BrokenPipe,
733 "writer is closed",
734 )))
735 }
736 },
737 ::std::task::Poll::Pending => ::std::task::Poll::Pending,
738 }
739 }
740
741 fn poll_close(
742 self: ::std::pin::Pin<&mut Self>,
743 cx: &mut ::std::task::Context<'_>,
744 ) -> ::std::task::Poll<std::io::Result<()>> {
745 let state = self.0.lock();
746 $crate::__private::futures::pin_mut!(state);
747 match state.poll(cx) {
748 ::std::task::Poll::Ready(mut state) => match &mut *state {
749 $crate::__private::State::Ok(writer) => {
750 let writer = ::std::pin::Pin::new(&mut *writer);
751 writer.poll_close(cx)
752 }
753 $crate::__private::State::Closed => {
754 ::std::task::Poll::Ready(::std::result::Result::Err(std::io::Error::new(
755 std::io::ErrorKind::BrokenPipe,
756 "writer is closed",
757 )))
758 }
759 },
760 ::std::task::Poll::Pending => ::std::task::Poll::Pending,
761 }
762 }
763 }
764 };
765}
766
767#[doc(hidden)]
768#[macro_export]
769macro_rules! __impl_async_seek {
770 ($ty:ident) => {
771 impl $crate::__private::futures::AsyncSeek for $ty {
772 fn poll_seek(
773 self: ::std::pin::Pin<&mut Self>,
774 cx: &mut ::std::task::Context<'_>,
775 pos: std::io::SeekFrom,
776 ) -> ::std::task::Poll<std::io::Result<u64>> {
777 let state = self.0.lock();
778 $crate::__private::futures::pin_mut!(state);
779 match state.poll(cx) {
780 ::std::task::Poll::Ready(mut state) => match &mut *state {
781 $crate::__private::State::Ok(reader) => {
782 let reader = ::std::pin::Pin::new(&mut *reader);
783 reader.poll_seek(cx, pos)
784 }
785 $crate::__private::State::Closed => {
786 ::std::task::Poll::Ready(::std::result::Result::Err(std::io::Error::new(
787 std::io::ErrorKind::BrokenPipe,
788 "reader is closed",
789 )))
790 }
791 },
792 ::std::task::Poll::Pending => ::std::task::Poll::Pending,
793 }
794 }
795 }
796 };
797}
798
799#[macro_export]
800macro_rules! async_seekable_writer {
801 ($future_into_py: ident($name:literal: $inner:ty $({
802 $($tt:tt)*
803 })?)) => {
804 $crate::__private::paste::paste! {
805 #[doc = concat!("`", $name, "` implements `AsyncWrite` and `AsyncSeek`.")]
806 #[derive(Clone)]
807 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
808 pub struct [< $name:camel >](::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
809
810 impl [< $name:camel >] {
811 pub fn new(inner: $inner) -> Self {
812 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
813 }
814 }
815
816 $crate::__impl_async_write!([< $name:camel >]);
817
818 $crate::__impl_async_seek!([< $name:camel >]);
819
820 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
821 impl [< $name:camel >] {
822
823 $($($tt)*)?
824
825 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
826 $crate::__write!(self.$future_into_py(py, bytes))
827 }
828
829 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
830 $crate::__write_all!(self.$future_into_py(py, bytes))
831 }
832
833 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
834 $crate::__flush!(self.$future_into_py(py))
835 }
836
837 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
838 $crate::__seek!(self.$future_into_py(py, seek_from))
839 }
840
841 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
842 $crate::__position!(self.$future_into_py(py))
843 }
844
845 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
846 $crate::__writer_close!(self.$future_into_py(py))
847 }
848
849 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
850 let slf = slf.into_py(py);
851 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
852 }
853
854 fn __aexit__<'a>(
855 &self,
856 py: $crate::__private::pyo3::Python<'a>,
857 _exc_type: &'a $crate::__private::pyo3::PyAny,
858 _exc_value: &'a $crate::__private::pyo3::PyAny,
859 _traceback: &'a $crate::__private::pyo3::PyAny,
860 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
861 $crate::__writer_aexit!(self.$future_into_py(py))
862 }
863 }
864 }
865 };
866}
867
868#[macro_export]
869macro_rules! async_seekable_reader_writer {
870 ($future_into_py: ident($name: literal: $inner:ty $({
871 $($tt:tt)*
872 })?)) => {
873 $crate::__private::paste::paste! {
874 #[doc = concat!("`", $name, "` implements `AsyncRead`, `AsyncWrite` and `AsyncSeek`.")]
875 #[derive(Clone)]
876 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
877 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
878
879 impl [< $name:camel >] {
880 pub fn new(inner: $inner) -> Self {
881 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
882 }
883 }
884
885 $crate::__impl_async_read!([< $name:camel >]);
886
887 $crate::__impl_async_write!([< $name:camel >]);
888
889 $crate::__impl_async_seek!([< $name:camel >]);
890
891 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
892 impl [< $name:camel >] {
893 $($($tt)*)?
894
895 #[pyo3(signature = (chunk_size = 1024))]
896 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
897 $crate::__read!(self.$future_into_py(py, chunk_size))
898 }
899
900 pub fn read_exact<'a>(&'a self, bytes: usize,py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
901 $crate::__read_exact!(self.$future_into_py(py, bytes))
902 }
903
904 #[pyo3(signature = (chunk_size = 1024))]
905 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
906 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
907 }
908
909 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
910 $crate::__read_to_string!(self.$future_into_py(py))
911 }
912
913 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
914 $crate::__write!(self.$future_into_py(py, bytes))
915 }
916
917 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
918 $crate::__write_all!(self.$future_into_py(py, bytes))
919 }
920
921 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
922 $crate::__flush!(self.$future_into_py(py))
923 }
924
925 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>)
926 -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
927 $crate::__seek!(self.$future_into_py(py, seek_from))
928 }
929
930 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
931 $crate::__position!(self.$future_into_py(py))
932 }
933
934 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
935 $crate::__writer_close!(self.$future_into_py(py))
936 }
937
938 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
939 let slf = slf.into_py(py);
940 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
941 }
942
943 fn __aexit__<'a>(
944 &self,
945 py: $crate::__private::pyo3::Python<'a>,
946 _exc_type: &'a $crate::__private::pyo3::PyAny,
947 _exc_value: &'a $crate::__private::pyo3::PyAny,
948 _traceback: &'a $crate::__private::pyo3::PyAny,
949 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
950 $crate::__writer_aexit!(self.$future_into_py(py))
951 }
952 }
953 }
954 };
955}
956
957#[macro_export]
958macro_rules! async_seekable_buf_reader_writer {
959 ($future_into_py: ident($name: literal: $inner:ty $({
960 $($tt:tt)*
961 })?)) => {
962 $crate::__private::paste::paste! {
963 #[doc = concat!("`", $name, "` implements `AsyncBufRead`, `AsyncWrite` and `AsyncSeek`.")]
964 #[derive(Clone)]
965 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
966 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
967
968 impl [< $name:camel >] {
969 pub fn new(inner: $inner) -> Self {
970 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
971 }
972 }
973
974 $crate::__impl_async_read!([< $name:camel >]);
975
976 $crate::__impl_async_write!([< $name:camel >]);
977
978 $crate::__impl_async_seek!([< $name:camel >]);
979
980 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
981 impl [< $name:camel >] {
982 $($($tt)*)?
983
984 #[pyo3(signature = (chunk_size = 1024))]
985 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
986 $crate::__read!(self.$future_into_py(py, chunk_size))
987 }
988
989 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
990 $crate::__read_exact!(self.$future_into_py(py, bytes))
991 }
992
993 #[pyo3(signature = (chunk_size = 1024))]
994 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
995 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
996 }
997
998 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
999 $crate::__read_to_string!(self.$future_into_py(py))
1000 }
1001
1002 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1003 $crate::__write!(self.$future_into_py(py, bytes))
1004 }
1005
1006 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1007 $crate::__write_all!(self.$future_into_py(py, bytes))
1008 }
1009
1010 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1011 $crate::__flush!(self.$future_into_py(py))
1012 }
1013
1014 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>)
1015 -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1016 $crate::__seek!(self.$future_into_py(py, seek_from))
1017 }
1018
1019 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1020 $crate::__position!(self.$future_into_py(py))
1021 }
1022
1023 pub fn fill_buf<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1024 $crate::__fill_buf!(self.$future_into_py(py))
1025 }
1026
1027 pub fn consume<'a>(&'a self, amt: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1028 $crate::__consume!(self.$future_into_py(py, amt))
1029 }
1030
1031 pub fn read_until<'a>(&'a self, byte: u8, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1032 $crate::__read_until!(self.$future_into_py(py, byte))
1033 }
1034
1035 pub fn read_line<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1036 $crate::__read_line!(self.$future_into_py(py))
1037 }
1038
1039 pub fn lines<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1040 $crate::__lines!(self.$future_into_py(py))
1041 }
1042
1043 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1044 $crate::__writer_close!(self.$future_into_py(py))
1045 }
1046
1047 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1048 let slf = slf.into_py(py);
1049 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1050 }
1051
1052 fn __aexit__<'a>(
1053 &self,
1054 py: $crate::__private::pyo3::Python<'a>,
1055 _exc_type: &'a $crate::__private::pyo3::PyAny,
1056 _exc_value: &'a $crate::__private::pyo3::PyAny,
1057 _traceback: &'a $crate::__private::pyo3::PyAny,
1058 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1059 $crate::__writer_aexit!(self.$future_into_py(py))
1060 }
1061 }
1062 }
1063 };
1064}
1065
1066#[macro_export]
1067macro_rules! async_reader {
1068 ($future_into_py: ident($name: literal: $inner:ty $({
1069 $($tt:tt)*
1070 })?)) => {
1071 $crate::__private::paste::paste! {
1072 #[doc = concat!("`", $name, "` implements `AsyncRead`.")]
1073 #[derive(Clone)]
1074 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1075 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1076
1077 impl [< $name:camel >] {
1078 pub fn new(inner: $inner) -> Self {
1079 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1080 }
1081 }
1082
1083 $crate::__impl_async_read!([< $name:camel >]);
1084
1085 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1086 impl [< $name:camel >] {
1087 $($($tt)*)?
1088
1089 #[pyo3(signature = (chunk_size = 1024))]
1090 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1091 $crate::__read!(self.$future_into_py(py, chunk_size))
1092 }
1093
1094 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1095 $crate::__read_exact!(self.$future_into_py(py, bytes))
1096 }
1097
1098 #[pyo3(signature = (chunk_size = 1024))]
1099 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1100 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1101 }
1102
1103 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1104 $crate::__read_to_string!(self.$future_into_py(py))
1105 }
1106
1107 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1108 $crate::__close!(self.$future_into_py(py))
1109 }
1110
1111 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1112 let slf = slf.into_py(py);
1113 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1114 }
1115
1116 fn __aexit__<'a>(
1117 &self,
1118 py: $crate::__private::pyo3::Python<'a>,
1119 _exc_type: &'a $crate::__private::pyo3::PyAny,
1120 _exc_value: &'a $crate::__private::pyo3::PyAny,
1121 _traceback: &'a $crate::__private::pyo3::PyAny,
1122 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1123 $crate::__aexit!(self.$future_into_py(py))
1124 }
1125 }
1126 }
1127 };
1128}
1129
1130#[macro_export]
1131macro_rules! async_writer {
1132 ($future_into_py: ident($name: literal: $inner:ty $({
1133 $($tt:tt)*
1134 })?)) => {
1135 $crate::__private::paste::paste! {
1136 #[doc = concat!("`", $name, "` implements `AsyncWrite`.")]
1137 #[derive(Clone)]
1138 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1139 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1140
1141 impl [< $name:camel >] {
1142 pub fn new(inner: $inner) -> Self {
1143 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1144 }
1145 }
1146
1147 $crate::__impl_async_write!([< $name:camel >]);
1148
1149 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1150 impl [< $name:camel >] {
1151 $($($tt)*)?
1152
1153 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1154 $crate::__write!(self.$future_into_py(py, bytes))
1155 }
1156
1157 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1158 $crate::__write_all!(self.$future_into_py(py, bytes))
1159 }
1160
1161 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1162 $crate::__flush!(self.$future_into_py(py))
1163 }
1164
1165 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1166 $crate::__writer_close!(self.$future_into_py(py))
1167 }
1168
1169 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1170 let slf = slf.into_py(py);
1171 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1172 }
1173
1174 fn __aexit__<'a>(
1175 &self,
1176 py: $crate::__private::pyo3::Python<'a>,
1177 _exc_type: &'a $crate::__private::pyo3::PyAny,
1178 _exc_value: &'a $crate::__private::pyo3::PyAny,
1179 _traceback: &'a $crate::__private::pyo3::PyAny,
1180 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1181 $crate::__writer_aexit!(self.$future_into_py(py))
1182 }
1183 }
1184 }
1185 };
1186}
1187
1188#[macro_export]
1189macro_rules! async_reader_writer {
1190 ($future_into_py: ident($name: literal: $inner:ty $({
1191 $($tt:tt)*
1192 })?)) => {
1193 $crate::__private::paste::paste! {
1194 #[doc = concat!("`", $name, "` implements `AsyncRead` and `AsyncWrite`.")]
1195 #[derive(Clone)]
1196 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1197 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1198
1199 impl [< $name:camel >] {
1200 pub fn new(inner: $inner) -> Self {
1201 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1202 }
1203 }
1204
1205 $crate::__impl_async_read!([< $name:camel >]);
1206
1207 $crate::__impl_async_write!([< $name:camel >]);
1208
1209 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1210 impl [< $name:camel >] {
1211 $($($tt)*)?
1212
1213 #[pyo3(signature = (chunk_size = 1024))]
1214 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1215 $crate::__read!(self.$future_into_py(py, chunk_size))
1216 }
1217
1218 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1219 $crate::__read_exact!(self.$future_into_py(py, bytes))
1220 }
1221
1222 #[pyo3(signature = (chunk_size = 1024))]
1223 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1224 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1225 }
1226
1227 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1228 $crate::__read_to_string!(self.$future_into_py(py))
1229 }
1230
1231 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1232 $crate::__write!(self.$future_into_py(py, bytes))
1233 }
1234
1235 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1236 $crate::__write_all!(self.$future_into_py(py, bytes))
1237 }
1238
1239 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1240 $crate::__flush!(self.$future_into_py(py))
1241 }
1242
1243 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1244 $crate::__writer_close!(self.$future_into_py(py))
1245 }
1246
1247 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1248 let slf = slf.into_py(py);
1249 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1250 }
1251
1252 fn __aexit__<'a>(
1253 &self,
1254 py: $crate::__private::pyo3::Python<'a>,
1255 _exc_type: &'a $crate::__private::pyo3::PyAny,
1256 _exc_value: &'a $crate::__private::pyo3::PyAny,
1257 _traceback: &'a $crate::__private::pyo3::PyAny,
1258 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1259 $crate::__writer_aexit!(self.$future_into_py(py))
1260 }
1261 }
1262 }
1263 }
1264}
1265
1266#[macro_export]
1267macro_rules! async_buf_reader {
1268 ($future_into_py: ident($name: literal: $inner:ty $({
1269 $($tt:tt)*
1270 })?)) => {
1271 $crate::__private::paste::paste! {
1272 #[doc = concat!("`", $name, "` implements `AsyncBufRead`.")]
1273 #[derive(Clone)]
1274 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1275 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1276
1277 impl [< $name:camel >] {
1278 pub fn new(inner: $inner) -> Self {
1279 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1280 }
1281 }
1282
1283 $crate::__impl_async_read!([< $name:camel >]);
1284
1285 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1286 impl [< $name:camel >] {
1287 $($($tt)*)?
1288
1289 #[pyo3(signature = (chunk_size = 1024))]
1290 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1291 $crate::__read!(self.$future_into_py(py, chunk_size))
1292 }
1293
1294 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1295 $crate::__read_exact!(self.$future_into_py(py, bytes))
1296 }
1297
1298 #[pyo3(signature = (chunk_size = 1024))]
1299 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1300 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1301 }
1302
1303 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1304 $crate::__read_to_string!(self.$future_into_py(py))
1305 }
1306
1307 pub fn fill_buf<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1308 $crate::__fill_buf!(self.$future_into_py(py))
1309 }
1310
1311 pub fn consume<'a>(&'a self, amt: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1312 $crate::__consume!(self.$future_into_py(py, amt))
1313 }
1314
1315 pub fn read_until<'a>(&'a self, byte: u8, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1316 $crate::__read_until!(self.$future_into_py(py, byte))
1317 }
1318
1319 pub fn read_line<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1320 $crate::__read_line!(self.$future_into_py(py))
1321 }
1322
1323 pub fn lines<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1324 $crate::__lines!(self.$future_into_py(py))
1325 }
1326
1327 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1328 $crate::__close!(self.$future_into_py(py))
1329 }
1330
1331 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1332 let slf = slf.into_py(py);
1333 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1334 }
1335
1336 fn __aexit__<'a>(
1337 &self,
1338 py: $crate::__private::pyo3::Python<'a>,
1339 _exc_type: &'a $crate::__private::pyo3::PyAny,
1340 _exc_value: &'a $crate::__private::pyo3::PyAny,
1341 _traceback: &'a $crate::__private::pyo3::PyAny,
1342 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1343 $crate::__aexit!(self.$future_into_py(py))
1344 }
1345 }
1346 }
1347 }
1348}
1349
1350#[macro_export]
1351macro_rules! async_buf_reader_writer {
1352 ($future_into_py: ident($name: literal: $inner:ty $({
1353 $($tt:tt)*
1354 })?)) => {
1355 $crate::__private::paste::paste! {
1356 #[doc = concat!("`", $name, "` implements `AsyncBufRead` and `AsyncWrite`.")]
1357 #[derive(Clone)]
1358 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1359 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1360
1361 impl [< $name:camel >] {
1362 pub fn new(inner: $inner) -> Self {
1363 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1364 }
1365 }
1366
1367 $crate::__impl_async_read!([< $name:camel >]);
1368
1369 $crate::__impl_async_write!([< $name:camel >]);
1370
1371 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1372 impl [< $name:camel >] {
1373 $($($tt)*)?
1374
1375 #[pyo3(signature = (chunk_size = 1024))]
1376 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1377 $crate::__read!(self.$future_into_py(py, chunk_size))
1378 }
1379
1380 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1381 $crate::__read_exact!(self.$future_into_py(py, bytes))
1382 }
1383
1384 #[pyo3(signature = (chunk_size = 1024))]
1385 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1386 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1387 }
1388
1389 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1390 $crate::__read_to_string!(self.$future_into_py(py))
1391 }
1392
1393 pub fn write<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1394 $crate::__write!(self.$future_into_py(py, bytes))
1395 }
1396
1397 pub fn write_all<'a>(&self, bytes: &'a [u8], py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1398 $crate::__write_all!(self.$future_into_py(py, bytes))
1399 }
1400
1401 pub fn flush<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1402 $crate::__flush!(self.$future_into_py(py))
1403 }
1404
1405 pub fn fill_buf<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1406 $crate::__fill_buf!(self.$future_into_py(py))
1407 }
1408
1409 pub fn consume<'a>(&'a self, amt: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1410 $crate::__consume!(self.$future_into_py(py, amt))
1411 }
1412
1413 pub fn read_until<'a>(&'a self, byte: u8, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1414 $crate::__read_until!(self.$future_into_py(py, byte))
1415 }
1416
1417 pub fn read_line<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1418 $crate::__read_line!(self.$future_into_py(py))
1419 }
1420
1421 pub fn lines<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1422 $crate::__lines!(self.$future_into_py(py))
1423 }
1424
1425 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1426 $crate::__writer_close!(self.$future_into_py(py))
1427 }
1428
1429 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1430 let slf = slf.into_py(py);
1431 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1432 }
1433
1434 fn __aexit__<'a>(
1435 &self,
1436 py: $crate::__private::pyo3::Python<'a>,
1437 _exc_type: &'a $crate::__private::pyo3::PyAny,
1438 _exc_value: &'a $crate::__private::pyo3::PyAny,
1439 _traceback: &'a $crate::__private::pyo3::PyAny,
1440 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1441 $crate::__writer_aexit!(self.$future_into_py(py))
1442 }
1443 }
1444 }
1445 }
1446}
1447
1448#[macro_export]
1449macro_rules! async_seeker {
1450 ($future_into_py: ident($name: literal: $inner:ty $({
1451 $($tt:tt)*
1452 })?)) => {
1453 $crate::__private::paste::paste! {
1454 #[doc = concat!("`", $name, "` implements `AsyncSeek`.")]
1455 #[derive(Clone)]
1456 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1457 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1458
1459 impl [< $name:camel >] {
1460 pub fn new(inner: $inner) -> Self {
1461 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1462 }
1463 }
1464
1465 $crate::__impl_async_seek!([< $name:camel >]);
1466
1467 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1468 impl [< $name:camel >] {
1469 $($($tt)*)?
1470
1471 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>)
1472 -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1473 $crate::__seek!(self.$future_into_py(py, seek_from))
1474 }
1475
1476 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1477 $crate::__position!(self.$future_into_py(py))
1478 }
1479
1480 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1481 $crate::__close!(self.$future_into_py(py))
1482 }
1483
1484 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1485 let slf = slf.into_py(py);
1486 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1487 }
1488
1489 fn __aexit__<'a>(
1490 &self,
1491 py: $crate::__private::pyo3::Python<'a>,
1492 _exc_type: &'a $crate::__private::pyo3::PyAny,
1493 _exc_value: &'a $crate::__private::pyo3::PyAny,
1494 _traceback: &'a $crate::__private::pyo3::PyAny,
1495 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1496 $crate::__aexit!(self.$future_into_py(py))
1497 }
1498 }
1499 }
1500 }
1501}
1502
1503#[macro_export]
1504macro_rules! async_seekable_reader {
1505 ($future_into_py: ident($name: literal: $inner:ty $({
1506 $($tt:tt)*
1507 })?)) => {
1508 $crate::__private::paste::paste! {
1509 #[doc = concat!("`", $name, "` implements `AsyncRead` and `AsyncSeek`.")]
1510 #[derive(Clone)]
1511 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1512 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1513
1514 impl [< $name:camel >] {
1515 pub fn new(inner: $inner) -> Self {
1516 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1517 }
1518 }
1519
1520 $crate::__impl_async_read!([< $name:camel >]);
1521
1522 $crate::__impl_async_seek!([< $name:camel >]);
1523
1524 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1525 impl [< $name:camel >] {
1526 $($($tt)*)?
1527
1528 #[pyo3(signature = (chunk_size = 1024))]
1529 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1530 $crate::__read!(self.$future_into_py(py, chunk_size))
1531 }
1532
1533 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1534 $crate::__read_exact!(self.$future_into_py(py, bytes))
1535 }
1536
1537 #[pyo3(signature = (chunk_size = 1024))]
1538 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1539 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1540 }
1541
1542 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1543 $crate::__read_to_string!(self.$future_into_py(py))
1544 }
1545
1546 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>)
1547 -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1548 $crate::__seek!(self.$future_into_py(py, seek_from))
1549 }
1550
1551 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1552 $crate::__position!(self.$future_into_py(py))
1553 }
1554
1555 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1556 $crate::__close!(self.$future_into_py(py))
1557 }
1558
1559 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1560 let slf = slf.into_py(py);
1561 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1562 }
1563
1564 fn __aexit__<'a>(
1565 &self,
1566 py: $crate::__private::pyo3::Python<'a>,
1567 _exc_type: &'a $crate::__private::pyo3::PyAny,
1568 _exc_value: &'a $crate::__private::pyo3::PyAny,
1569 _traceback: &'a $crate::__private::pyo3::PyAny,
1570 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1571 $crate::__aexit!(self.$future_into_py(py))
1572 }
1573 }
1574 }
1575 }
1576}
1577
1578#[macro_export]
1579macro_rules! async_seekable_buf_reader {
1580 ($future_into_py: ident($name: literal: $inner:ty $({
1581 $($tt:tt)*
1582 })?)) => {
1583 $crate::__private::paste::paste! {
1584 #[doc = concat!("`", $name, "` implements `AsyncBufRead` and `AsyncSeek`.")]
1585 #[derive(Clone)]
1586 #[$crate::__private::pyo3::prelude::pyclass(name = $name, crate = "::pyo3io_macros::__private::pyo3")]
1587 pub struct [< $name:camel >] (::std::sync::Arc<$crate::__private::Mutex<$crate::__private::State<$inner>>>);
1588
1589 impl [< $name:camel >] {
1590 pub fn new(inner: $inner) -> Self {
1591 Self(::std::sync::Arc::new($crate::__private::Mutex::new($crate::__private::State::Ok(inner))))
1592 }
1593 }
1594
1595 $crate::__impl_async_read!([< $name:camel >]);
1596
1597 $crate::__impl_async_seek!([< $name:camel >]);
1598
1599 #[$crate::__private::pyo3::prelude::pymethods(crate = "::pyo3io_macros::__private::pyo3")]
1600 impl [< $name:camel >] {
1601 $($($tt)*)?
1602
1603 #[pyo3(signature = (chunk_size = 1024))]
1604 pub fn read<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1605 $crate::__read!(self.$future_into_py(py, chunk_size))
1606 }
1607
1608 pub fn read_exact<'a>(&'a self, bytes: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1609 $crate::__read_exact!(self.$future_into_py(py, bytes))
1610 }
1611
1612 #[pyo3(signature = (chunk_size = 1024))]
1613 pub fn read_to_end<'a>(&'a self, chunk_size: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1614 $crate::__read_to_end!(self.$future_into_py(py, chunk_size))
1615 }
1616
1617 pub fn read_to_string<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1618 $crate::__read_to_string!(self.$future_into_py(py))
1619 }
1620
1621 pub fn seek<'a>(&'a self, seek_from: $crate::__private::SeekFrom, py: $crate::__private::pyo3::Python<'a>)
1622 -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1623 $crate::__seek!(self.$future_into_py(py, seek_from))
1624 }
1625
1626 pub fn position<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1627 $crate::__position!(self.$future_into_py(py))
1628 }
1629
1630 pub fn fill_buf<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1631 $crate::__fill_buf!(self.$future_into_py(py))
1632 }
1633
1634 pub fn consume<'a>(&'a self, amt: usize, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1635 $crate::__consume!(self.$future_into_py(py, amt))
1636 }
1637
1638 pub fn read_until<'a>(&'a self, byte: u8, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1639 $crate::__read_until!(self.$future_into_py(py, byte))
1640 }
1641
1642 pub fn read_line<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1643 $crate::__read_line!(self.$future_into_py(py))
1644 }
1645
1646 pub fn lines<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1647 $crate::__lines!(self.$future_into_py(py))
1648 }
1649
1650 pub fn close<'a>(&'a self, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1651 $crate::__close!(self.$future_into_py(py))
1652 }
1653
1654 fn __aenter__<'a>(slf: $crate::__private::pyo3::PyRef<'a, Self>, py: $crate::__private::pyo3::Python<'a>) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1655 let slf = slf.into_py(py);
1656 $future_into_py(py, async move { ::std::result::Result::Ok(slf) })
1657 }
1658
1659 fn __aexit__<'a>(
1660 &self,
1661 py: $crate::__private::pyo3::Python<'a>,
1662 _exc_type: &'a $crate::__private::pyo3::PyAny,
1663 _exc_value: &'a $crate::__private::pyo3::PyAny,
1664 _traceback: &'a $crate::__private::pyo3::PyAny,
1665 ) -> $crate::__private::pyo3::PyResult<&'a $crate::__private::pyo3::PyAny> {
1666 $crate::__aexit!(self.$future_into_py(py))
1667 }
1668 }
1669 }
1670 };
1671}
1672
1673pub fn register_types(m: &PyModule) -> PyResult<()> {
1674 m.add_class::<Whence>()?;
1675 m.add_class::<SeekFrom>()?;
1676 Ok(())
1677}
1678
1679#[macro_export]
1694macro_rules! register_async_runtime {
1695 (
1696 $(#[$outer:meta])*
1697 $vis:vis mod $name:ident(use $future_into_py: path) $({
1698 $($tt:tt)*
1699 })?
1700 $(;)?
1701 ) => {
1702 $vis mod $name {
1703 use $crate::__private::{futures::*, pyo3::*};
1704 use $future_into_py as future_into_py;
1705 $($($tt)*)?
1706
1707 $crate::async_reader!(future_into_py("AsyncReader": ::std::boxed::Box<dyn $crate::__private::futures::AsyncRead + ::core::marker::Send + ::core::marker::Sync + ::core::marker::Unpin + 'static>));
1708 $crate::async_writer!(future_into_py("AsyncWriter": ::std::boxed::Box<dyn $crate::__private::futures::AsyncWrite + ::core::marker::Send + ::core::marker::Sync + ::core::marker::Unpin + 'static>));
1709 $crate::async_reader_writer!(future_into_py("AsyncReaderWriter": ::std::boxed::Box<dyn $crate::AsyncReadWrite>));
1710 $crate::async_buf_reader!(future_into_py("AsyncBufReader": ::std::boxed::Box<dyn $crate::__private::futures::AsyncBufRead + ::core::marker::Send + ::core::marker::Sync + ::core::marker::Unpin + 'static>));
1711 $crate::async_buf_reader_writer!(future_into_py("AsyncBufReaderWriter": ::std::boxed::Box<dyn $crate::AsyncBufReadWrite>));
1712 $crate::async_seeker!(future_into_py("AsyncSeeker": ::std::boxed::Box<dyn $crate::__private::futures::AsyncSeek + ::core::marker::Send + ::core::marker::Sync + ::core::marker::Unpin + 'static>));
1713 $crate::async_seekable_reader!(future_into_py("AsyncSeekableReader": ::std::boxed::Box<dyn $crate::AsyncSeekRead>));
1714 $crate::async_seekable_buf_reader!(future_into_py("AsyncSeekableBufReader": ::std::boxed::Box<dyn $crate::AsyncSeekBufRead>));
1715 $crate::async_seekable_writer!(future_into_py("AsyncSeekableWriter": ::std::boxed::Box<dyn $crate::AsyncSeekWrite>));
1716 $crate::async_seekable_reader_writer!(future_into_py("AsyncSeekableReaderWriter": ::std::boxed::Box<dyn $crate::AsyncSeekReadWrite>));
1717 $crate::async_seekable_buf_reader_writer!(future_into_py("AsyncSeekableBufReaderWriter": ::std::boxed::Box<dyn $crate::AsyncSeekBufReadWrite>));
1718
1719 pub fn register_types(m: &$crate::__private::pyo3::prelude::PyModule) -> $crate::__private::pyo3::PyResult<()> {
1721 m.add_class::<AsyncReader>()?;
1722 m.add_class::<AsyncWriter>()?;
1723 m.add_class::<AsyncReaderWriter>()?;
1724 m.add_class::<AsyncBufReader>()?;
1725 m.add_class::<AsyncBufReaderWriter>()?;
1726 m.add_class::<AsyncSeeker>()?;
1727 m.add_class::<AsyncSeekableReader>()?;
1728 m.add_class::<AsyncSeekableBufReader>()?;
1729 m.add_class::<AsyncSeekableWriter>()?;
1730 m.add_class::<AsyncSeekableReaderWriter>()?;
1731 m.add_class::<AsyncSeekableBufReaderWriter>()?;
1732 ::std::result::Result::Ok(())
1733 }
1734 }
1735 }
1736}