add Wallet to UserAccount
Signed-off-by: kernelkind <kernelkind@gmail.com>
This commit is contained in:
@@ -1,18 +1,29 @@
|
|||||||
use enostr::Keypair;
|
use enostr::Keypair;
|
||||||
use tokenator::{ParseError, TokenParser, TokenSerializable};
|
use tokenator::{ParseError, TokenParser, TokenSerializable};
|
||||||
|
|
||||||
|
use crate::Wallet;
|
||||||
|
|
||||||
pub struct UserAccount {
|
pub struct UserAccount {
|
||||||
pub key: Keypair,
|
pub key: Keypair,
|
||||||
|
pub wallet: Option<Wallet>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UserAccount {
|
impl UserAccount {
|
||||||
pub fn new(key: Keypair) -> Self {
|
pub fn new(key: Keypair) -> Self {
|
||||||
Self { key }
|
Self { key, wallet: None }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_with_wallet(key: Keypair, wallet: Wallet) -> Self {
|
||||||
|
Self {
|
||||||
|
key,
|
||||||
|
wallet: Some(wallet),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum UserAccountRoute {
|
enum UserAccountRoute {
|
||||||
Key(Keypair),
|
Key(Keypair),
|
||||||
|
Wallet(Wallet),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TokenSerializable for UserAccount {
|
impl TokenSerializable for UserAccount {
|
||||||
@@ -20,20 +31,25 @@ impl TokenSerializable for UserAccount {
|
|||||||
parser: &mut tokenator::TokenParser<'a>,
|
parser: &mut tokenator::TokenParser<'a>,
|
||||||
) -> Result<Self, tokenator::ParseError<'a>> {
|
) -> Result<Self, tokenator::ParseError<'a>> {
|
||||||
let mut m_key = None;
|
let mut m_key = None;
|
||||||
|
let mut m_wallet = None;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let res = TokenParser::alt(
|
let res = TokenParser::alt(
|
||||||
parser,
|
parser,
|
||||||
&[|p| Ok(UserAccountRoute::Key(Keypair::parse_from_tokens(p)?))],
|
&[
|
||||||
|
|p| Ok(UserAccountRoute::Key(Keypair::parse_from_tokens(p)?)),
|
||||||
|
|p| Ok(UserAccountRoute::Wallet(Wallet::parse_from_tokens(p)?)),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
Ok(UserAccountRoute::Key(key)) => m_key = Some(key),
|
Ok(UserAccountRoute::Key(key)) => m_key = Some(key),
|
||||||
|
Ok(UserAccountRoute::Wallet(wallet)) => m_wallet = Some(wallet),
|
||||||
Err(ParseError::AltAllFailed) => break,
|
Err(ParseError::AltAllFailed) => break,
|
||||||
Err(_) => {}
|
Err(_) => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
if m_key.is_some() {
|
if m_key.is_some() && m_wallet.is_some() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,11 +58,23 @@ impl TokenSerializable for UserAccount {
|
|||||||
return Err(ParseError::DecodeFailed);
|
return Err(ParseError::DecodeFailed);
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(UserAccount { key })
|
let user_acc = if let Some(wallet) = m_wallet {
|
||||||
|
UserAccount::new_with_wallet(key, wallet)
|
||||||
|
} else {
|
||||||
|
UserAccount::new(key)
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(user_acc)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn serialize_tokens(&self, writer: &mut tokenator::TokenWriter) {
|
fn serialize_tokens(&self, writer: &mut tokenator::TokenWriter) {
|
||||||
self.key.serialize_tokens(writer);
|
self.key.serialize_tokens(writer);
|
||||||
|
|
||||||
|
let Some(wallet) = &self.wallet else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
wallet.serialize_tokens(writer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,14 +83,17 @@ mod tests {
|
|||||||
use enostr::FullKeypair;
|
use enostr::FullKeypair;
|
||||||
use tokenator::{TokenParser, TokenSerializable, TokenWriter};
|
use tokenator::{TokenParser, TokenSerializable, TokenWriter};
|
||||||
|
|
||||||
|
use crate::Wallet;
|
||||||
|
|
||||||
use super::UserAccount;
|
use super::UserAccount;
|
||||||
|
|
||||||
|
const URI: &str = "nostr+walletconnect://b889ff5b1513b641e2a139f661a661364979c5beee91842f8f0ef42ab558e9d4?relay=wss%3A%2F%2Frelay.damus.io&secret=71a8c14c1407c113601079c4302dab36460f0ccd0ad506f1f2dc73b5100e4f3c&lud16=nostr%40nostr.com";
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_user_account_serialize_deserialize() {
|
fn test_user_account_serialize_deserialize() {
|
||||||
let kp = FullKeypair::generate();
|
let kp = FullKeypair::generate();
|
||||||
let acc = UserAccount {
|
let acc =
|
||||||
key: kp.to_keypair(),
|
UserAccount::new_with_wallet(kp.to_keypair(), Wallet::new(URI.to_owned()).unwrap());
|
||||||
};
|
|
||||||
|
|
||||||
let mut writer = TokenWriter::new("\t");
|
let mut writer = TokenWriter::new("\t");
|
||||||
acc.serialize_tokens(&mut writer);
|
acc.serialize_tokens(&mut writer);
|
||||||
@@ -77,5 +108,11 @@ mod tests {
|
|||||||
let new_acc = m_new_acc.unwrap();
|
let new_acc = m_new_acc.unwrap();
|
||||||
|
|
||||||
assert_eq!(acc.key, new_acc.key);
|
assert_eq!(acc.key, new_acc.key);
|
||||||
|
|
||||||
|
let Some(wallet) = new_acc.wallet else {
|
||||||
|
panic!();
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(wallet.uri, URI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user