Remover nova linha à direita de String sem clonar

Eu escrevi uma função para solicitar entrada e retornar o resultado. Nesta versão, a sequência retornada inclui uma nova linha à direita do usuário. Gostaria de retornar a entrada com essa nova linha (e apenas essa nova linha) removida:

fn read_with_prompt(prompt: &str) -> io::Result<String> {
    let stdout = io::stdout();
    let mut reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    try!(reader.read_line(&mut input));

    // TODO: Remove trailing newline if present
    Ok(input)
}

O motivo para remover apenas a nova linha à direita é que essa função também será usada para solicitar uma senha (com o uso apropriado determios para parar de ecoar) e se a senha de alguém tiver espaços em branco à direita, isso deverá ser preservado.

Depois de muita discussão sobre como remover uma única linha nova no final de uma string, acabei usandotrim_right_matches. No entanto, isso retorna um&str. Eu tentei usarCow para lidar com isso, mas o erro ainda diz que oinput A variável não vive o suficiente.

fn read_with_prompt<'a>(prompt: &str) -> io::Result<Cow<'a, str>> {
    let stdout = io::stdout();
    let mut reader = io::stdin();
    let mut input = String::new();
    print!("{}", prompt);
    stdout.lock().flush().unwrap();
    try!(reader.read_line(&mut input));

    let mut trimmed = false;
    Ok(Cow::Borrowed(input.trim_right_matches(|c| {
        if !trimmed && c == '\n' {
            trimmed = true;
            true
        }
        else {
            false
        }
    })))
}

Erro:

src/main.rs:613:22: 613:27 error: `input` does not live long enough
src/main.rs:613     Ok(Cow::Borrowed(input.trim_right_matches(|c| {
                                     ^~~~~
src/main.rs:604:79: 622:2 note: reference must be valid for the lifetime 'a as
 defined on the block at 604:78...
src/main.rs:604 fn read_with_prompt<'a, S: AsRef<str>>(prompt: S) -> io::Resul
t<Cow<'a, str>> {
src/main.rs:605     let stdout = io::stdout();
src/main.rs:606     let mut reader = io::stdin();
src/main.rs:607     let mut input = String::new();
src/main.rs:608     print!("{}", prompt.as_ref());
src/main.rs:609     stdout.lock().flush().unwrap();
                ...
src/main.rs:607:35: 622:2 note: ...but borrowed value is only valid for the bl
ock suffix following statement 2 at 607:34
src/main.rs:607     let mut input = String::new();
src/main.rs:608     print!("{}", prompt.as_ref());
src/main.rs:609     stdout.lock().flush().unwrap();
src/main.rs:610     try!(reader.read_line(&mut input));
src/main.rs:611
src/main.rs:612     let mut trimmed = false;
                ...

Baseado emperguntas anteriores nesse sentido parece que isso não é possível. É a única opção para alocar uma nova sequência que tenha a nova linha à direita removida? Parece que deve haver uma maneira de aparar a corda sem copiá-la (em C você substituiria o'\n' com'\0')

questionAnswers(3)

yourAnswerToTheQuestion