Change str::from_utf8_owned() to return Result

This allows the original vector to be recovered in the event that it is
not valid UTF-8.

[breaking-change]
This commit is contained in:
Kevin Ballard 2014-05-14 16:48:05 -07:00
parent e4414739a5
commit d0f3cb05df
2 changed files with 11 additions and 8 deletions

View File

@ -60,7 +60,7 @@ To return an Owned String (~str) use the str helper function [`from_utf8_owned`]
~~~ ~~~
use std::str; use std::str;
let x: Option<~str> = str::from_utf8_owned(~[104u8,105u8]); let x: Result<~str,~[u8]> = str::from_utf8_owned(~[104u8,105u8]);
let y: ~str = x.unwrap(); let y: ~str = x.unwrap();
~~~ ~~~

View File

@ -87,6 +87,7 @@ use iter::{Iterator, range, AdditiveIterator};
use mem::transmute; use mem::transmute;
use mem; use mem;
use option::{None, Option, Some}; use option::{None, Option, Some};
use result::{Result, Ok, Err};
use slice::Vector; use slice::Vector;
use slice::{ImmutableVector, MutableVector, CloneableVector}; use slice::{ImmutableVector, MutableVector, CloneableVector};
use strbuf::StrBuf; use strbuf::StrBuf;
@ -105,12 +106,14 @@ Section: Creating a string
*/ */
/// Consumes a vector of bytes to create a new utf-8 string. /// Consumes a vector of bytes to create a new utf-8 string.
/// Returns None if the vector contains invalid UTF-8. ///
pub fn from_utf8_owned(vv: ~[u8]) -> Option<~str> { /// Returns `Err` with the original vector if the vector contains invalid
/// UTF-8.
pub fn from_utf8_owned(vv: ~[u8]) -> Result<~str, ~[u8]> {
if is_utf8(vv) { if is_utf8(vv) {
Some(unsafe { raw::from_utf8_owned(vv) }) Ok(unsafe { raw::from_utf8_owned(vv) })
} else { } else {
None Err(vv)
} }
} }
@ -2115,13 +2118,13 @@ mod tests {
#[test] #[test]
fn test_str_from_utf8_owned() { fn test_str_from_utf8_owned() {
let xs = bytes!("hello").to_owned(); let xs = bytes!("hello").to_owned();
assert_eq!(from_utf8_owned(xs), Some("hello".to_owned())); assert_eq!(from_utf8_owned(xs), Ok("hello".to_owned()));
let xs = bytes!("ศไทย中华Việt Nam").to_owned(); let xs = bytes!("ศไทย中华Việt Nam").to_owned();
assert_eq!(from_utf8_owned(xs), Some("ศไทย中华Việt Nam".to_owned())); assert_eq!(from_utf8_owned(xs), Ok("ศไทย中华Việt Nam".to_owned()));
let xs = bytes!("hello", 0xff).to_owned(); let xs = bytes!("hello", 0xff).to_owned();
assert_eq!(from_utf8_owned(xs), None); assert_eq!(from_utf8_owned(xs), Err(bytes!("hello", 0xff).to_owned()));
} }
#[test] #[test]