Guest User

Untitled

a guest
May 26th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. fn resolve_indexes(s: &str, delims: &[&str]) -> Vec<(usize, usize)> {
  2. let mut offsets = Vec::new();
  3.  
  4. for delim in delims {
  5. for (index, _) in s.match_indices(delim) {
  6. offsets.push((index, index + delim.len()));
  7. }
  8. }
  9.  
  10. offsets.sort();
  11. offsets.dedup_by(|a, b| a.0 == b.0 || a.1 == b.1);
  12.  
  13. offsets
  14. }
  15.  
  16. struct Args {
  17. message: String,
  18. delims: Vec<Vec<char>>,
  19. offset: usize,
  20. offsets: Vec<(usize, usize)>,
  21. // Used for rewinding
  22. prev: Vec<(usize, (usize, usize))>,
  23. }
  24.  
  25. use std::error::Error as StdError;
  26. use std::str::FromStr;
  27.  
  28. #[derive(Debug, PartialEq)]
  29. enum Error<E> {
  30. Eof,
  31. Parse(E),
  32. }
  33.  
  34. impl<E: StdError> From<E> for Error<E> {
  35. fn from(e: E) -> Self {
  36. Error::Parse(e)
  37. }
  38. }
  39.  
  40. impl Args {
  41. fn new(msg: &str, delims: &[&str]) -> Self {
  42. Args {
  43. message: msg.to_string(),
  44. delims: delims.iter().map(|s| s.chars().collect()).collect(),
  45. prev: Vec::new(),
  46. offset: 0,
  47. offsets: resolve_indexes(msg, delims),
  48. }
  49. }
  50.  
  51. fn until_internal<T: FromStr>(&mut self, change: bool) -> Result<T, Error<T::Err>>
  52. where
  53. T::Err: StdError,
  54. {
  55. // Reborrowing the fields individually gives them their own lifetime, thus preventing "cannot mutably borrow whilst an immutable borrow is alive" errors.
  56. fn until<T: FromStr>(
  57. msg: &str,
  58. offset: &mut usize,
  59. offsets: &mut Vec<(usize, usize)>,
  60. delims: &[Vec<char>],
  61. prev: &mut Vec<(usize, (usize, usize))>,
  62. change: bool,
  63. ) -> Result<T, Error<T::Err>>
  64. where
  65. T::Err: StdError,
  66. {
  67. if *offset >= msg.len() {
  68. return Err(Error::Eof);
  69. }
  70.  
  71. if offsets.is_empty() {
  72. let s = &msg[*offset..];
  73.  
  74. // We've reached the end; invalidate the offset.
  75. *offset = msg.len();
  76. return Ok(T::from_str(s)?);
  77. }
  78.  
  79. let (start, end) = if change {
  80. offsets.remove(0)
  81. } else {
  82. offsets[0]
  83. };
  84.  
  85. let string = &msg[*offset..start];
  86.  
  87. if string.is_empty() {
  88. return until(msg, offset, offsets, delims, prev, change);
  89. }
  90.  
  91. if change {
  92. prev.push((*offset, (start, end)));
  93. *offset = end;
  94. }
  95.  
  96. for delim in delims {
  97. if string.trim_matches(delim.as_slice()).is_empty() {
  98. return until(msg, offset, offsets, delims, prev, change);
  99. }
  100. }
  101.  
  102. Ok(T::from_str(&string)?)
  103. }
  104.  
  105. until(&self.message, &mut self.offset, &mut self.offsets, &self.delims, &mut self.prev, change)
  106. }
  107.  
  108. #[inline]
  109. fn single<T: FromStr>(&mut self) -> Result<T, Error<T::Err>>
  110. where
  111. T::Err: StdError,
  112. {
  113. self.until_internal(true)
  114. }
  115.  
  116. #[inline]
  117. fn single_s<T: FromStr>(&mut self) -> Result<T, Error<T::Err>>
  118. where
  119. T::Err: StdError,
  120. {
  121. self.until_internal(false)
  122. }
  123.  
  124. #[inline]
  125. fn skip(&mut self) -> Option<String> {
  126. self.single::<String>().ok()
  127. }
  128.  
  129. fn rewind(&mut self) {
  130. if self.prev.is_empty() {
  131. self.offset = 0;
  132. return;
  133. }
  134.  
  135. let (off, offsets) = self.prev.pop().unwrap();
  136. self.offset = off;
  137. self.offsets.insert(0, offsets);
  138. }
  139. }
  140.  
  141. fn main() {
  142. const MESSAGE: &str = "42 fd88 πŸ˜‚!πŸ›‘ .f . asd . sd a ! s ! εŒε…±εŒε…±εŒ どうしゃ ζΌ’ε­— μ‘°μ„ κΈ€μ‘°μ„  κΈ€μ‘°μ„ κΈ€μ‘° Ψ¨Ψ·Ψ§Ω‚Ψ© Ψ§Ω„Ω…Ψ³Ψ§ΨΉΨ―Ψ© Ψ§Ω„ΨΊΨ°Ψ§Ψ¦ΩŠΨ© μ„ κΈ€μ‘°μ„ κΈ€γ…γ„΄λŸ°μ• γ…— ㅕㅑㅑㅛㅐㅂ μ œλ² γ…”γ…”γ…‘γ…μ—λ„€μ—μ—!γ…”???γ…”γ…“λ ˆμ²΄[γ„Ή γ„΄μ—λ Œμ•Όγ…γ…”λ‹€γ…‘μΆ”νƒ€νŽ•μΉ˜γ…“γ…γ„΄μ•ˆγ…‡γ„Ή 99";
  143.  
  144. let mut args = Args::new(MESSAGE, &[" ", "!", " . "]);
  145.  
  146. assert_eq!(args.single_s::<u64>().unwrap(), 42);
  147. assert_eq!(args.single::<u64>().unwrap(), 42);
  148. args.rewind();
  149. assert_eq!(args.single_s::<String>().unwrap(), "42");
  150. while let Ok(s) = args.single::<String>() {
  151. println!("{:?}", s);
  152. }
  153.  
  154. let mut args2 = Args::new("hello dear sir um ma'am", &[" "]);
  155.  
  156. args2.skip();
  157. args2.skip();
  158. args2.skip();
  159.  
  160. args2.rewind();
  161. args2.rewind();
  162. args2.rewind();
  163.  
  164. println!("test rewind");
  165. while let Ok(s) = args2.single::<String>() {
  166. println!("{:?}", s);
  167. }
  168. }
Add Comment
Please, Sign In to add comment