caracal 0.2.0

Nostr client for Gemini
use std::collections::HashMap;

use nostr::nips::nip46::NostrConnectURI;
use nostr::{Keys, NostrSigner};
use nostr_sdk::prelude::*;

use once_cell::sync::Lazy;
use std::ops::DerefMut;
use std::sync::Arc;
use tokio::sync::mpsc::{Receiver, Sender};

use crate::storage::Storage;

pub struct CaracalUser {
    pub client: Arc<Client>,
    pub upload_keys: Keys,
    pub signer: Arc<dyn NostrSigner>,
    pub connect_uri: Option<NostrConnectURI>,
    pub storage: Storage,
    pub tx: Sender<u8>,
    pub rx: Receiver<u8>,
}

pub static mut USERS: Lazy<HashMap<String, CaracalUser>> = Lazy::new(|| {
    HashMap::new()
});

pub fn lookup_user(fingerprint: String) -> Option<&'static CaracalUser> {
    #[allow(static_mut_refs)]
    unsafe {
        let us = USERS.deref_mut();
        us.get(&fingerprint.clone())
    }
}

pub fn lookup_user_mut(
    fingerprint: String,
) -> Option<&'static mut CaracalUser> {
    #[allow(static_mut_refs)]
    unsafe {
        let us = USERS.deref_mut();
        us.get_mut(&fingerprint.clone())
    }
}