1use crate::raw::*;
42use crate::*;
43
44pub enum TwoWays<ONE, TWO> {
48 One(ONE),
50 Two(TWO),
52}
53
54impl<ONE: oio::Read, TWO: oio::Read> oio::Read for TwoWays<ONE, TWO> {
55 async fn read(&mut self) -> Result<Buffer> {
56 match self {
57 TwoWays::One(v) => v.read().await,
58 TwoWays::Two(v) => v.read().await,
59 }
60 }
61}
62
63impl<ONE: oio::Write, TWO: oio::Write> oio::Write for TwoWays<ONE, TWO> {
64 async fn write(&mut self, bs: Buffer) -> Result<()> {
65 match self {
66 Self::One(v) => v.write(bs).await,
67 Self::Two(v) => v.write(bs).await,
68 }
69 }
70
71 async fn close(&mut self) -> Result<Metadata> {
72 match self {
73 Self::One(v) => v.close().await,
74 Self::Two(v) => v.close().await,
75 }
76 }
77
78 async fn abort(&mut self) -> Result<()> {
79 match self {
80 Self::One(v) => v.abort().await,
81 Self::Two(v) => v.abort().await,
82 }
83 }
84}
85
86impl<ONE: oio::Copy, TWO: oio::Copy> oio::Copy for TwoWays<ONE, TWO> {
87 async fn next(&mut self) -> Result<Option<usize>> {
88 match self {
89 Self::One(v) => v.next().await,
90 Self::Two(v) => v.next().await,
91 }
92 }
93
94 async fn abort(&mut self) -> Result<()> {
95 match self {
96 Self::One(v) => v.abort().await,
97 Self::Two(v) => v.abort().await,
98 }
99 }
100}
101
102impl<ONE: oio::List, TWO: oio::List> oio::List for TwoWays<ONE, TWO> {
103 async fn next(&mut self) -> Result<Option<oio::Entry>> {
104 match self {
105 Self::One(v) => v.next().await,
106 Self::Two(v) => v.next().await,
107 }
108 }
109}
110
111pub enum ThreeWays<ONE, TWO, THREE> {
115 One(ONE),
117 Two(TWO),
119 Three(THREE),
121}
122
123impl<ONE: oio::Read, TWO: oio::Read, THREE: oio::Read> oio::Read for ThreeWays<ONE, TWO, THREE> {
124 async fn read(&mut self) -> Result<Buffer> {
125 match self {
126 ThreeWays::One(v) => v.read().await,
127 ThreeWays::Two(v) => v.read().await,
128 ThreeWays::Three(v) => v.read().await,
129 }
130 }
131}
132
133impl<ONE: oio::Write, TWO: oio::Write, THREE: oio::Write> oio::Write
134 for ThreeWays<ONE, TWO, THREE>
135{
136 async fn write(&mut self, bs: Buffer) -> Result<()> {
137 match self {
138 Self::One(v) => v.write(bs).await,
139 Self::Two(v) => v.write(bs).await,
140 Self::Three(v) => v.write(bs).await,
141 }
142 }
143
144 async fn close(&mut self) -> Result<Metadata> {
145 match self {
146 Self::One(v) => v.close().await,
147 Self::Two(v) => v.close().await,
148 Self::Three(v) => v.close().await,
149 }
150 }
151
152 async fn abort(&mut self) -> Result<()> {
153 match self {
154 Self::One(v) => v.abort().await,
155 Self::Two(v) => v.abort().await,
156 Self::Three(v) => v.abort().await,
157 }
158 }
159}
160
161impl<ONE: oio::List, TWO: oio::List, THREE: oio::List> oio::List for ThreeWays<ONE, TWO, THREE> {
162 async fn next(&mut self) -> Result<Option<oio::Entry>> {
163 match self {
164 Self::One(v) => v.next().await,
165 Self::Two(v) => v.next().await,
166 Self::Three(v) => v.next().await,
167 }
168 }
169}
170
171pub enum FourWays<ONE, TWO, THREE, FOUR> {
175 One(ONE),
177 Two(TWO),
179 Three(THREE),
181 Four(FOUR),
183}
184
185impl<ONE, TWO, THREE, FOUR> oio::Read for FourWays<ONE, TWO, THREE, FOUR>
186where
187 ONE: oio::Read,
188 TWO: oio::Read,
189 THREE: oio::Read,
190 FOUR: oio::Read,
191{
192 async fn read(&mut self) -> Result<Buffer> {
193 match self {
194 FourWays::One(v) => v.read().await,
195 FourWays::Two(v) => v.read().await,
196 FourWays::Three(v) => v.read().await,
197 FourWays::Four(v) => v.read().await,
198 }
199 }
200}
201
202impl<ONE, TWO, THREE, FOUR> oio::List for FourWays<ONE, TWO, THREE, FOUR>
203where
204 ONE: oio::List,
205 TWO: oio::List,
206 THREE: oio::List,
207 FOUR: oio::List,
208{
209 async fn next(&mut self) -> Result<Option<oio::Entry>> {
210 match self {
211 Self::One(v) => v.next().await,
212 Self::Two(v) => v.next().await,
213 Self::Three(v) => v.next().await,
214 Self::Four(v) => v.next().await,
215 }
216 }
217}