Prechádzať zdrojové kódy

improve: use unchecked url in client

thesimplekid 1 rok pred
rodič
commit
502a3962e3
2 zmenil súbory, kde vykonal 30 pridanie a 11 odobranie
  1. 14 2
      crates/cashu-sdk/src/client/mod.rs
  2. 16 9
      crates/cashu/src/url.rs

+ 14 - 2
crates/cashu-sdk/src/client/mod.rs

@@ -1,6 +1,8 @@
 //! Client to connet to mint
 use std::fmt;
+use std::str::FromStr;
 
+use cashu::url::UncheckedUrl;
 use serde::{Deserialize, Serialize};
 use serde_json::Value;
 use url::Url;
@@ -34,6 +36,8 @@ pub enum Error {
     UrlParse(url::ParseError),
     /// Serde Json error
     SerdeJson(serde_json::Error),
+    /// Cashu Url Error
+    CashuUrl(cashu::url::Error),
     ///  Min req error
     #[cfg(not(target_arch = "wasm32"))]
     MinReq(minreq::Error),
@@ -55,6 +59,12 @@ impl From<serde_json::Error> for Error {
     }
 }
 
+impl From<cashu::url::Error> for Error {
+    fn from(err: cashu::url::Error) -> Error {
+        Error::CashuUrl(err)
+    }
+}
+
 #[cfg(not(target_arch = "wasm32"))]
 impl From<minreq::Error> for Error {
     fn from(err: minreq::Error) -> Error {
@@ -79,6 +89,7 @@ impl fmt::Display for Error {
             Error::SerdeJson(err) => write!(f, "{}", err),
             #[cfg(not(target_arch = "wasm32"))]
             Error::MinReq(err) => write!(f, "{}", err),
+            Error::CashuUrl(err) => write!(f, "{}", err),
             #[cfg(target_arch = "wasm32")]
             Error::Gloo(err) => write!(f, "{}", err),
             Error::Custom(message) => write!(f, "{}", message),
@@ -117,12 +128,13 @@ impl Error {
 
 #[derive(Debug, Clone)]
 pub struct Client {
-    pub mint_url: Url,
+    pub mint_url: UncheckedUrl,
 }
 
 impl Client {
     pub fn new(mint_url: &str) -> Result<Self, Error> {
-        let mint_url = Url::parse(&mint_url)?;
+        let mint_url = UncheckedUrl::from_str(mint_url)?;
+        let _: Url = (&mint_url).try_into()?;
         Ok(Self { mint_url })
     }
 

+ 16 - 9
crates/cashu/src/url.rs

@@ -48,6 +48,11 @@ impl UncheckedUrl {
     pub fn empty() -> Self {
         Self(String::new())
     }
+
+    pub fn join(&self, path: &str) -> Result<Url, Error> {
+        let url: Url = self.try_into()?;
+        Ok(url.join(path)?)
+    }
 }
 
 impl<S> From<S> for UncheckedUrl
@@ -85,7 +90,7 @@ impl TryFrom<&UncheckedUrl> for Url {
 
 impl fmt::Display for UncheckedUrl {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "{}", self.0.strip_suffix("/").unwrap_or(&self.0))
+        write!(f, "{}", self.0)
     }
 }
 
@@ -96,18 +101,20 @@ mod tests {
 
     #[test]
     fn test_unchecked_relay_url() {
-        let relay = "wss://relay.damus.io/";
-        let relay_url = Url::from_str(relay).unwrap();
+        let relay = "wss://relay.damus.io:8333/";
+
+        let unchecked_relay_url = UncheckedUrl::from_str(relay).unwrap();
 
-        let unchecked_relay_url = UncheckedUrl::from(relay_url.clone());
+        assert_eq!(relay, unchecked_relay_url.to_string());
+
+        // assert_eq!(relay, serde_json::to_string(&unchecked_relay_url).unwrap());
 
-        assert_eq!(unchecked_relay_url, UncheckedUrl::from(relay));
+        let relay = "wss://relay.damus.io:8333";
 
-        assert_eq!(
-            Url::try_from(unchecked_relay_url.clone()).unwrap(),
-            relay_url
-        );
+        let unchecked_relay_url = UncheckedUrl::from_str(relay).unwrap();
 
         assert_eq!(relay, unchecked_relay_url.to_string());
+
+        // assert_eq!(relay, serde_json::to_string(&unchecked_relay_url).unwrap())
     }
 }