enum LinkParserEvent { BeginLinkValue(usize), EndLinkValue(usize), BeginLinkParam(usize), EndLinkParam(usize), EndOfBuffer, } enum State { Start, UriRef, } struct LinkParser { state: State, offset: usize, } impl LinkParser { fn new() -> Self { return LinkParser { state: State::Start, offset: 0, }; } fn try_match_char(&self, buf: &[u8], b: u8) -> Option { if buf[self.offset] != b { return None; } return Some(1); } fn push(&mut self, new_data: &[u8]) -> LinkParserEvent { match self.state { State::Start => { if let Some(len) = self.try_match_char(new_data, b'<') { self.offset += len; self.state = State::UriRef; return LinkParserEvent::BeginLinkValue(self.offset - len); } todo!(); }, State::UriRef => { loop { if let Some(_) = self.try_match_char(new_data, b'>') { break; } else { self.offset += 1; } } todo!(); }, } } fn finish(&mut self) { } } #[cfg(test)] mod test { #[test] fn test() { } }