From 272d3ddb76e8f017a8a2fe0899e58e0dff840c9f Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 7 Jul 2024 01:35:50 +0200 Subject: eyeballed uri parser --- src/encoding/uri.rs | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) (limited to 'src/encoding/uri.rs') diff --git a/src/encoding/uri.rs b/src/encoding/uri.rs index a56cad4..db20700 100644 --- a/src/encoding/uri.rs +++ b/src/encoding/uri.rs @@ -1,21 +1,56 @@ +use anyhow::anyhow; use std::{fmt::Display, str::FromStr}; #[derive(Debug, Clone)] pub struct Uri { - pub content: String, + pub protocol: String, + pub localpart: Option, + pub addr: String, + pub params: String, } impl Display for Uri { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.content)?; + let Self { + protocol, + localpart, + addr, + params, + } = self; + write!( + f, + "{protocol}:{}{addr}{}", + if let Some(localpart) = localpart { + format!("{localpart}@") + } else { + "".to_string() + }, + if params.is_empty() { + "".to_string() + } else { + format!(";{params}") + } + )?; Ok(()) } } impl FromStr for Uri { type Err = anyhow::Error; fn from_str(s: &str) -> Result { + eprintln!("{s:?}"); + let (pr, s) = s.split_once(":").ok_or(anyhow!("protocol sep"))?; + let (lp, s) = s.split_once("@").unwrap_or(("", s)); + let (addr, params) = s.split_once(";").unwrap_or((s, "")); + Ok(Self { - content: s.to_string(), + addr: addr.to_owned(), + localpart: if lp.is_empty() { + None + } else { + Some(lp.to_string()) + }, + params: params.to_string(), + protocol: pr.to_string(), }) } } -- cgit v1.2.3-70-g09d2