1#![cfg_attr(target_os = "wasi", feature(wasi_ext))]
2#![cfg(feature = "close")]
3
4use io_lifetimes::raw::{AsRawFilelike, AsRawSocketlike};
5use io_lifetimes::views::{FilelikeView, SocketlikeView};
6use io_lifetimes::{
7    AsFilelike, AsSocketlike, BorrowedFilelike, FromFilelike, FromSocketlike, IntoFilelike,
8    IntoSocketlike,
9};
10use std::io::{Read, Write};
11
12struct Tester {}
13impl Tester {
14    fn use_file<Filelike: AsFilelike>(filelike: Filelike) {
15        let mut buf = Vec::new();
16
17        let filelike = filelike.as_filelike();
18
19        let view = filelike.as_filelike_view::<std::fs::File>();
20        let _ = (&*view).read(&mut buf).is_ok();
21        let _ = (&*view).write(&buf).is_ok();
22
23        let view = unsafe {
24            FilelikeView::<std::fs::File>::view_raw(
25                filelike
26                    .as_filelike_view::<std::fs::File>()
27                    .as_raw_filelike(),
28            )
29        };
30        let _ = (&*view).read(&mut buf).is_ok();
31        let _ = (&*view).write(&buf).is_ok();
32
33        let _ = dbg!(filelike);
34    }
35
36    fn use_socket<Socketlike: AsSocketlike>(socketlike: Socketlike) {
37        let mut buf = Vec::new();
38
39        let socketlike = socketlike.as_socketlike();
40        let view = socketlike.as_socketlike_view::<std::net::TcpStream>();
41        let _ = (&*view).read(&mut buf).is_ok();
42        let _ = (&*view).write(&buf).is_ok();
43
44        let view = unsafe {
45            SocketlikeView::<std::net::TcpStream>::view_raw(
46                socketlike
47                    .as_socketlike_view::<std::net::TcpStream>()
48                    .as_raw_socketlike(),
49            )
50        };
51        let _ = (&*view).read(&mut buf).is_ok();
52        let _ = (&*view).write(&buf).is_ok();
53
54        let _ = dbg!(socketlike);
55    }
56
57    fn from_file<Filelike: IntoFilelike>(filelike: Filelike) {
58        let mut buf = Vec::new();
59
60        let filelike = filelike.into_filelike();
61        let view = filelike.as_filelike_view::<std::fs::File>();
62        let _ = (&*view).read(&mut buf).is_ok();
63        let _ = (&*view).write(&buf).is_ok();
64        drop(view);
65
66        let _ = dbg!(&filelike);
67        let _ = std::fs::File::from_filelike(filelike);
68    }
69
70    fn from_socket<Socketlike: IntoSocketlike>(socketlike: Socketlike) {
71        let mut buf = Vec::new();
72
73        let socketlike = socketlike.into_socketlike();
74        let view = socketlike.as_socketlike_view::<std::net::TcpStream>();
75        let _ = (&*view).read(&mut buf).is_ok();
76        let _ = (&*view).write(&buf).is_ok();
77        drop(view);
78
79        let _ = dbg!(&socketlike);
80        let _ = std::net::TcpStream::from_socketlike(socketlike);
81    }
82
83    fn from_into_file<Filelike: IntoFilelike>(filelike: Filelike) {
84        let _ = std::fs::File::from_into_filelike(filelike);
85    }
86
87    fn from_into_socket<Socketlike: IntoSocketlike>(socketlike: Socketlike) {
88        let _ = std::net::TcpStream::from_into_socketlike(socketlike);
89    }
90}
91
92#[test]
93fn test_api() {
94    let file = std::fs::File::open("Cargo.toml").unwrap();
95    Tester::use_file(&file);
96    Tester::use_file(file.as_filelike());
97    Tester::use_file(&*file.as_filelike_view::<std::fs::File>());
98    Tester::use_file(file.as_filelike_view::<std::fs::File>().as_filelike());
99
100    let socket = std::net::TcpListener::bind("127.0.0.1:0").unwrap();
101    Tester::use_socket(&socket);
102    Tester::use_socket(socket.as_socketlike());
103    Tester::use_socket(&*socket.as_socketlike_view::<std::net::TcpListener>());
104    Tester::use_socket(
105        socket
106            .as_socketlike_view::<std::net::TcpListener>()
107            .as_socketlike(),
108    );
109
110    Tester::from_file(std::fs::File::open("Cargo.toml").unwrap().into_filelike());
111    Tester::from_file(
112        std::fs::File::open("Cargo.toml")
113            .unwrap()
114            .into_filelike()
115            .into_filelike(),
116    );
117    Tester::from_socket(
118        std::net::TcpListener::bind("127.0.0.1:0")
119            .unwrap()
120            .into_socketlike(),
121    );
122    Tester::from_socket(
123        std::net::TcpListener::bind("127.0.0.1:0")
124            .unwrap()
125            .into_socketlike()
126            .into_socketlike(),
127    );
128
129    Tester::from_into_file(std::fs::File::open("Cargo.toml").unwrap().into_filelike());
130    Tester::from_into_socket(
131        std::net::TcpListener::bind("127.0.0.1:0")
132            .unwrap()
133            .into_socketlike(),
134    );
135}
136
137#[test]
138fn test_as() {
139    let file = std::fs::File::open("Cargo.toml").unwrap();
140    let borrow: BorrowedFilelike = file.as_filelike();
141    let reborrow: BorrowedFilelike = borrow.as_filelike();
142    let ref_reborrow: &BorrowedFilelike = &reborrow;
143    let borrow_ref_reborrow: BorrowedFilelike = ref_reborrow.as_filelike();
144    let _ref_borrow_ref_reborrow: &BorrowedFilelike = &borrow_ref_reborrow;
145}
146