From 968b1ada942fafa4d25c8338d5fe5fcbe5b4439d Mon Sep 17 00:00:00 2001 From: XIAO YU Date: Sat, 29 Jun 2024 09:41:16 +0900 Subject: [PATCH] refactor: improve relay management code structure (#220) --- src-tauri/src/nostr/relay.rs | 116 +++++++++++++++++++---------------- src-tauri/src/nostr/utils.rs | 4 +- 2 files changed, 64 insertions(+), 56 deletions(-) diff --git a/src-tauri/src/nostr/relay.rs b/src-tauri/src/nostr/relay.rs index 91843f14..79c4ca50 100644 --- a/src-tauri/src/nostr/relay.rs +++ b/src-tauri/src/nostr/relay.rs @@ -1,12 +1,11 @@ -use std::{ - fs, - io::{self, BufRead, Write}, -}; - use crate::Nostr; use nostr_sdk::prelude::*; use serde::Serialize; use specta::Type; +use std::{ + fs::OpenOptions, + io::{self, BufRead, Write}, +}; use tauri::{path::BaseDirectory, Manager, State}; #[derive(Serialize, Type)] @@ -22,13 +21,16 @@ pub struct Relays { pub async fn get_relays(state: State<'_, Nostr>) -> Result { let client = &state.client; - // Get connected relays - let list = client.relays().await; - let connected_relays: Vec = list.into_keys().map(|url| url.to_string()).collect(); + let connected_relays = client + .relays() + .await + .into_keys() + .map(|url| url.to_string()) + .collect::>(); - // Get NIP-65 relay list let signer = client.signer().await.map_err(|e| e.to_string())?; let public_key = signer.public_key().await.map_err(|e| e.to_string())?; + let filter = Filter::new() .author(public_key) .kind(Kind::RelayList) @@ -38,22 +40,35 @@ pub async fn get_relays(state: State<'_, Nostr>) -> Result { Ok(events) => { if let Some(event) = events.first() { let nip65_list = nip65::extract_relay_list(event); - let read: Vec = nip65_list - .clone() - .into_iter() - .filter(|i| matches!(&i.1, Some(y) if *y == RelayMetadata::Read)) - .map(|(url, _)| url.to_string()) + let read = nip65_list + .iter() + .filter_map(|(url, meta)| { + if let Some(RelayMetadata::Read) = meta { + Some(url.to_string()) + } else { + None + } + }) .collect(); - let write: Vec = nip65_list - .clone() - .into_iter() - .filter(|i| matches!(&i.1, Some(y) if *y == RelayMetadata::Write)) - .map(|(url, _)| url.to_string()) + let write = nip65_list + .iter() + .filter_map(|(url, meta)| { + if let Some(RelayMetadata::Write) = meta { + Some(url.to_string()) + } else { + None + } + }) .collect(); - let both: Vec = nip65_list - .into_iter() - .filter(|i| i.1.is_none()) - .map(|(url, _)| url.to_string()) + let both = nip65_list + .iter() + .filter_map(|(url, meta)| { + if meta.is_none() { + Some(url.to_string()) + } else { + None + } + }) .collect(); Ok(Relays { @@ -79,31 +94,30 @@ pub async fn get_relays(state: State<'_, Nostr>) -> Result { #[specta::specta] pub async fn connect_relay(relay: &str, state: State<'_, Nostr>) -> Result { let client = &state.client; - match client.add_relay(relay).await { - Ok(status) => { - if status { - println!("connecting to relay: {}", relay); - let _ = client.connect_relay(relay).await; - Ok(true) - } else { - Ok(false) - } - } - Err(e) => Err(e.to_string()), + let status = client.add_relay(relay).await.map_err(|e| e.to_string())?; + if status { + println!("Connecting to relay: {}", relay); + client + .connect_relay(relay) + .await + .map_err(|e| e.to_string())?; } + Ok(status) } #[tauri::command] #[specta::specta] pub async fn remove_relay(relay: &str, state: State<'_, Nostr>) -> Result { let client = &state.client; - match client.remove_relay(relay).await { - Ok(_) => { - let _ = client.disconnect_relay(relay).await; - Ok(true) - } - Err(e) => Err(e.to_string()), - } + client + .remove_relay(relay) + .await + .map_err(|e| e.to_string())?; + client + .disconnect_relay(relay) + .await + .map_err(|e| e.to_string())?; + Ok(true) } #[tauri::command] @@ -115,15 +129,12 @@ pub fn get_bootstrap_relays(app: tauri::AppHandle) -> Result, String .map_err(|e| e.to_string())?; let file = std::fs::File::open(relays_path).map_err(|e| e.to_string())?; - let lines = io::BufReader::new(file).lines(); + let reader = io::BufReader::new(file); - let mut relays = Vec::new(); - - for line in lines.map_while(Result::ok) { - relays.push(line.to_string()) - } - - Ok(relays) + reader + .lines() + .collect::, io::Error>>() + .map_err(|e| e.to_string()) } #[tauri::command] @@ -134,13 +145,10 @@ pub fn save_bootstrap_relays(relays: &str, app: tauri::AppHandle) -> Result<(), .resolve("resources/relays.txt", BaseDirectory::Resource) .map_err(|e| e.to_string())?; - let mut file = fs::OpenOptions::new() + let mut file = OpenOptions::new() .write(true) .open(relays_path) .map_err(|e| e.to_string())?; - match file.write_all(relays.as_bytes()) { - Ok(_) => Ok(()), - Err(e) => Err(e.to_string()), - } + file.write_all(relays.as_bytes()).map_err(|e| e.to_string()) } diff --git a/src-tauri/src/nostr/utils.rs b/src-tauri/src/nostr/utils.rs index a0a1e840..151d91ac 100644 --- a/src-tauri/src/nostr/utils.rs +++ b/src-tauri/src/nostr/utils.rs @@ -2,8 +2,8 @@ use std::collections::HashSet; use std::str::FromStr; use linkify::LinkFinder; -use nostr_sdk::{Alphabet, Event, EventId, FromBech32, PublicKey, SingleLetterTag, Tag, TagKind}; use nostr_sdk::prelude::Nip19Event; +use nostr_sdk::{Alphabet, Event, EventId, FromBech32, PublicKey, SingleLetterTag, Tag, TagKind}; use reqwest::Client; use serde::Serialize; use specta::Type; @@ -47,7 +47,7 @@ const IMAGES: [&str; 7] = ["jpg", "jpeg", "gif", "png", "webp", "avif", "tiff"]; const VIDEOS: [&str; 5] = ["mp4", "mov", "avi", "webm", "mkv"]; pub fn get_latest_event(events: &[Event]) -> Option<&Event> { - events.iter().max_by_key(|event| event.created_at()) + events.iter().next() } pub fn dedup_event(events: &[Event]) -> Vec {