Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add back bufferless read_to_string/read_to_end methods #970

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions text/0841-read_to_string_without_buffer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
- Feature Name: read_to_string_without_buffer
- Start Date: 2015-03-13
- RFC PR: https://github.com/rust-lang/rfcs/pull/970
- Rust Issue: https://github.com/rust-lang/rust/pull/23335

# Summary

Add `read_into_string` and `read_into_vec` methods to the `Read` trait that
act just like `read_to_string` and `read_to_end` but don't take a buffer.

# Motivation

While the `fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<()>` and
`fn read_to_string(&mut self, buf: &mut String) -> Result<()>` APIs are more
efficient removing the APIs that don't require passing a buffer entirely comes
at with convenience loss in some situations. In particular if one want's to
implement a chaining API and doesn't care about efficiency.

Today we either have to write this

```rust
fn get_last_commit () -> String {

let output = Command::new("git")
.arg("rev-parse")
.arg("HEAD")
.output()
.ok().expect("error invoking git rev-parse");

let encoded = String::from_utf8(output.stdout).ok().expect("error parsing output of git rev-parse");

encoded
}
```

Or this:


```rust
fn get_last_commit () -> String {

Command::new("git")
.arg("rev-parse")
.arg("HEAD")
.output()
.map(|output| {
String::from_utf8(output.stdout).ok().expect("error reading into string")
})
.ok().expect("error invoking git rev-parse")
}
```

But we'd like to be able to just write

```rust
fn get_last_commit () -> String {

Command::new("git")
.arg("rev-parse")
.arg("HEAD")
.spawn()
.ok().expect("error spawning process")
.stdout.read_into_string()
.ok().expect("error reading output")
}
```

This was possible before but since there is not such `read_to_string` API
anymore, it's currently impossible.


# Detailed design

Add back methods with following signature

`fn read_into_vec(&mut self) -> Result<Vec<u8>>`

`fn read_into_string(&mut self) -> Result<String>`

# Drawbacks

Two more methods to maintain

# Alternatives

Don't do it and force users to use things like `map` for chaining

# Unresolved questions

None.