summaryrefslogtreecommitdiff
path: root/src/rfc8288.rs
diff options
context:
space:
mode:
authorJesper Jensen <jesper@jnsn.dev>2025-12-22 22:08:42 +0100
committerJesper Jensen <jesper@jnsn.dev>2025-12-22 22:08:42 +0100
commit9fc38dcb2774234d178fe76511cabfb22c768c7b (patch)
tree731bf952904b449c72abca115f680f19a55cd122 /src/rfc8288.rs
parent8c3313d02e3053a43cb0c4cfba5b5b78376dfa20 (diff)
Add the initial skeleton of the parser
Diffstat (limited to 'src/rfc8288.rs')
-rw-r--r--src/rfc8288.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/rfc8288.rs b/src/rfc8288.rs
new file mode 100644
index 0000000..b068573
--- /dev/null
+++ b/src/rfc8288.rs
@@ -0,0 +1,72 @@
+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<usize> {
+ 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() {
+ }
+}