Skip to content

Commit f01a905

Browse files
feat(client): bring back append
1 parent 4b34536 commit f01a905

File tree

2 files changed

+76
-79
lines changed

2 files changed

+76
-79
lines changed

src/client.rs

Lines changed: 67 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,7 @@ pub async fn connect<A: ToSocketAddrs, S: AsRef<str>>(
134134
let _greeting = match client.read_response().await {
135135
Some(greeting) => greeting,
136136
None => {
137-
return Err(Error::Bad(format!(
138-
"could not read server Greeting after connect"
139-
)));
137+
return Err(Error::Bad("could not read server Greeting after connect"));
140138
}
141139
};
142140

@@ -1142,28 +1140,32 @@ impl<T: Read + Write + Unpin + fmt::Debug> Session<T> {
11421140
/// failing that, a `CHECK` command) after one or more `APPEND` commands.
11431141
pub async fn append<S: AsRef<str>, B: AsRef<[u8]>>(
11441142
&mut self,
1145-
_mailbox: S,
1146-
_content: B,
1143+
mailbox: S,
1144+
content: B,
11471145
) -> Result<()> {
1148-
unimplemented!();
1149-
// let content = content.as_ref();
1150-
// self.run_command(&format!(
1151-
// "APPEND \"{}\" {{{}}}",
1152-
// mailbox.as_ref(),
1153-
// content.len()
1154-
// ))
1155-
// .await?;
1156-
// let mut v = Vec::new();
1157-
// self.readline(&mut v).await?;
1158-
// if !v.starts_with(b"+") {
1159-
// return Err(Error::Append);
1160-
// }
1161-
// self.stream.write_all(content).await?;
1162-
// self.stream.write_all(b"\r\n").await?;
1163-
// self.stream.flush().await?;
1164-
// self.read_response().await?;
1165-
1166-
// Ok(())
1146+
let content = content.as_ref();
1147+
self.run_command(&format!(
1148+
"APPEND \"{}\" {{{}}}",
1149+
mailbox.as_ref(),
1150+
content.len()
1151+
))
1152+
.await?;
1153+
1154+
match self.read_response().await {
1155+
Some(Ok(res)) => {
1156+
if let Response::Continue { .. } = res.parsed() {
1157+
self.stream.as_mut().write_all(content).await?;
1158+
self.stream.as_mut().write_all(b"\r\n").await?;
1159+
self.stream.flush().await?;
1160+
self.read_response().await.transpose()?;
1161+
Ok(())
1162+
} else {
1163+
Err(Error::Append)
1164+
}
1165+
}
1166+
Some(Err(err)) => Err(err.into()),
1167+
_ => Err(Error::Append),
1168+
}
11671169
}
11681170

11691171
/// The [`SEARCH` command](https://tools.ietf.org/html/rfc3501#section-6.4.4) searches the
@@ -1286,8 +1288,7 @@ impl<T: Read + Write + Unpin + fmt::Debug> Connection<T> {
12861288
self.stream
12871289
.encode(Request(None, command.as_bytes().into()))
12881290
.await?;
1289-
// TODO
1290-
// self.stream.flush().await?;
1291+
self.stream.flush().await?;
12911292
Ok(())
12921293
}
12931294

@@ -1296,8 +1297,7 @@ impl<T: Read + Write + Unpin + fmt::Debug> Connection<T> {
12961297
self.stream
12971298
.encode(Request(Some(request_id.clone()), command.as_bytes().into()))
12981299
.await?;
1299-
// TODO
1300-
// self.stream.flush().await?;
1300+
self.stream.flush().await?;
13011301
Ok(request_id)
13021302
}
13031303

@@ -1823,32 +1823,28 @@ mod tests {
18231823

18241824
#[async_attributes::test]
18251825
async fn store() {
1826-
generic_store(" ", |c, set, query| {
1827-
async move {
1828-
c.lock()
1829-
.await
1830-
.store(set, query)
1831-
.await?
1832-
.collect::<Vec<_>>()
1833-
.await;
1834-
Ok(())
1835-
}
1826+
generic_store(" ", |c, set, query| async move {
1827+
c.lock()
1828+
.await
1829+
.store(set, query)
1830+
.await?
1831+
.collect::<Vec<_>>()
1832+
.await;
1833+
Ok(())
18361834
})
18371835
.await;
18381836
}
18391837

18401838
#[async_attributes::test]
18411839
async fn uid_store() {
1842-
generic_store(" UID ", |c, set, query| {
1843-
async move {
1844-
c.lock()
1845-
.await
1846-
.uid_store(set, query)
1847-
.await?
1848-
.collect::<Vec<_>>()
1849-
.await;
1850-
Ok(())
1851-
}
1840+
generic_store(" UID ", |c, set, query| async move {
1841+
c.lock()
1842+
.await
1843+
.uid_store(set, query)
1844+
.await?
1845+
.collect::<Vec<_>>()
1846+
.await;
1847+
Ok(())
18521848
})
18531849
.await;
18541850
}
@@ -1868,22 +1864,18 @@ mod tests {
18681864

18691865
#[async_attributes::test]
18701866
async fn copy() {
1871-
generic_copy(" ", |c, set, query| {
1872-
async move {
1873-
c.lock().await.copy(set, query).await?;
1874-
Ok(())
1875-
}
1867+
generic_copy(" ", |c, set, query| async move {
1868+
c.lock().await.copy(set, query).await?;
1869+
Ok(())
18761870
})
18771871
.await;
18781872
}
18791873

18801874
#[async_attributes::test]
18811875
async fn uid_copy() {
1882-
generic_copy(" UID ", |c, set, query| {
1883-
async move {
1884-
c.lock().await.uid_copy(set, query).await?;
1885-
Ok(())
1886-
}
1876+
generic_copy(" UID ", |c, set, query| async move {
1877+
c.lock().await.uid_copy(set, query).await?;
1878+
Ok(())
18871879
})
18881880
.await;
18891881
}
@@ -1942,33 +1934,29 @@ mod tests {
19421934

19431935
#[async_attributes::test]
19441936
async fn fetch() {
1945-
generic_fetch(" ", |c, seq, query| {
1946-
async move {
1947-
c.lock()
1948-
.await
1949-
.fetch(seq, query)
1950-
.await?
1951-
.collect::<Vec<_>>()
1952-
.await;
1953-
1954-
Ok(())
1955-
}
1937+
generic_fetch(" ", |c, seq, query| async move {
1938+
c.lock()
1939+
.await
1940+
.fetch(seq, query)
1941+
.await?
1942+
.collect::<Vec<_>>()
1943+
.await;
1944+
1945+
Ok(())
19561946
})
19571947
.await;
19581948
}
19591949

19601950
#[async_attributes::test]
19611951
async fn uid_fetch() {
1962-
generic_fetch(" UID ", |c, seq, query| {
1963-
async move {
1964-
c.lock()
1965-
.await
1966-
.uid_fetch(seq, query)
1967-
.await?
1968-
.collect::<Vec<_>>()
1969-
.await;
1970-
Ok(())
1971-
}
1952+
generic_fetch(" UID ", |c, seq, query| async move {
1953+
c.lock()
1954+
.await
1955+
.uid_fetch(seq, query)
1956+
.await?
1957+
.collect::<Vec<_>>()
1958+
.await;
1959+
Ok(())
19721960
})
19731961
.await;
19741962
}

src/imap_stream.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,15 @@ impl<R: Read + Write + Unpin> ImapStream<R> {
7272
pub fn into_inner(self) -> R {
7373
self.inner
7474
}
75+
76+
/// Flushes the underlying stream.
77+
pub async fn flush(&mut self) -> Result<(), io::Error> {
78+
self.inner.flush().await
79+
}
80+
81+
pub fn as_mut(&mut self) -> &mut R {
82+
&mut self.inner
83+
}
7584
}
7685

7786
impl<R: Read + Write + Unpin> ImapStream<R> {

0 commit comments

Comments
 (0)