fork download
  1. use std::io::{Read, BufReader, Result};
  2.  
  3. struct Rot13<R: Read> {
  4. r: R,
  5. }
  6.  
  7. impl<R: Read> Rot13<R> {
  8. fn new(r: R) -> Rot13<R> {
  9. Rot13{
  10. r: r,
  11. }
  12. }
  13. }
  14.  
  15. impl<R: Read> Read for Rot13<R> {
  16. fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
  17. let r = match self.r.read(buf) {
  18. Ok(r) => r,
  19. Err(err) => {
  20. return Err(err);
  21. }
  22. };
  23.  
  24. for i in 0..buf.len() {
  25. let c = buf[i] as char;
  26. if (c >= 'A') && (c <= 'Z') {
  27. buf[i] = rotate(buf[i], 'Z' as u8);
  28. }
  29. else if (c >= 'a') && (c <= 'z') {
  30. buf[i] = rotate(buf[i], 'z' as u8);
  31. }
  32. }
  33.  
  34. Ok(r)
  35. }
  36. }
  37.  
  38. fn rotate(mut c: u8, max: u8) -> u8 {
  39. c += 13;
  40. if c > max {
  41. c -= 26;
  42. }
  43.  
  44. c
  45. }
  46.  
  47. fn main() {
  48. let mut r = Rot13::new(BufReader::new("Pna V unir fbzr pnxr, cyrnfr?".as_bytes()));
  49.  
  50. let mut s = String::new();
  51. r.read_to_string(&mut s).unwrap();
  52. println!("{}", s);
  53. }
Success #stdin #stdout 0.01s 11080KB
stdin
Standard input is empty
stdout
Can I have some cake, please?