1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
use std::char::from_u32; pub fn percent_decode(data: &str) -> Option<String> { let mut buffer: String = String::default(); let mut iter = data.chars(); loop { let maybe_char = iter.by_ref().next(); match maybe_char { Some('%') => { let next_two: String = iter.by_ref().take(2).collect(); if next_two.len() < 2 { return None; } let maybe_char: Option<char> = u32::from_str_radix(&next_two, 16) .ok() .and_then(|ord| from_u32(ord)); if maybe_char.is_none() { return None; } buffer.push(maybe_char.unwrap()); }, Some(c) => { buffer.push(c); }, None => { break; } } } Some(buffer) }