Skip to content

Commit 2b88c34

Browse files
committed
feat: rethink ux
1 parent 562a061 commit 2b88c34

File tree

5 files changed

+329
-307
lines changed

5 files changed

+329
-307
lines changed

cli/src/cli/balance.rs

Lines changed: 44 additions & 270 deletions
Original file line numberDiff line numberDiff line change
@@ -1,199 +1,77 @@
1-
use std::{path::Path, str::FromStr};
1+
use std::str::FromStr;
22

3+
use tabled::{
4+
settings::{disable::Remove, object::FirstRow},
5+
Table,
6+
};
37
use torus_client::{
48
client::TorusClient,
5-
subxt::{
6-
ext::futures::TryStreamExt,
7-
utils::{AccountId32, MultiAddress},
8-
},
9+
subxt::utils::{AccountId32, MultiAddress},
910
};
1011

11-
use crate::{cli::CliCtx, store::get_key};
12+
use crate::{
13+
cli::CliCtx,
14+
store::{get_account, get_key},
15+
};
1216

13-
#[derive(clap::Subcommand)]
14-
pub enum BalanceCliCommand {
15-
Free {
16-
key: String,
17-
},
18-
Staking {
19-
key: String,
20-
},
21-
Staked {
22-
key: String,
23-
},
24-
Show {
25-
key: String,
26-
},
27-
Stake {
28-
key: String,
29-
target: String,
30-
amount: u128,
31-
},
32-
Unstake {
17+
#[derive(clap::Args)]
18+
#[command(arg_required_else_help = true)]
19+
pub struct BalanceCliCommand {
20+
pub key: Option<String>,
21+
22+
#[command(subcommand)]
23+
pub sub_command: Option<BalanceCliSubCommand>,
24+
}
25+
26+
#[derive(clap::Subcommand, Clone)]
27+
pub enum BalanceCliSubCommand {
28+
Check {
3329
key: String,
34-
target: String,
35-
amount: u128,
3630
},
3731
Transfer {
3832
key: String,
3933
target: String,
4034
amount: u128,
4135
},
42-
TransferStake {
43-
key: String,
44-
source: String,
45-
target: String,
46-
amount: u128,
47-
},
48-
}
49-
50-
pub async fn free_balance(ctx: &CliCtx, key: String) -> anyhow::Result<()> {
51-
let key = get_key(&key)?;
52-
let (_key, keypair) = ctx.decrypt(&key)?;
53-
54-
let account = keypair.account();
55-
56-
let free_balance = if ctx.is_testnet() {
57-
let client = TorusClient::for_mainnet().await?;
58-
client
59-
.balances()
60-
.storage()
61-
.account_get(&account)
62-
.await?
63-
.map(|data| data.free)
64-
} else {
65-
let client = TorusClient::for_testnet().await?;
66-
client
67-
.balances()
68-
.storage()
69-
.account_get(&account)
70-
.await?
71-
.map(|data| data.free)
72-
};
73-
74-
println!(
75-
"\"{}\"'s free balance: {}",
76-
Path::new(&key.path)
77-
.file_name()
78-
.map(|path| path.to_string_lossy().to_string())
79-
.unwrap_or(key.path),
80-
free_balance.unwrap_or(0)
81-
);
82-
83-
Ok(())
8436
}
8537

86-
pub async fn staking_balance(ctx: &CliCtx, key: String) -> anyhow::Result<()> {
87-
let key = get_key(&key)?;
88-
let (_key, keypair) = ctx.decrypt(&key)?;
89-
90-
let account = keypair.account();
38+
pub async fn check(ctx: &CliCtx, key: String) -> anyhow::Result<()> {
39+
let account = get_account(&key)?;
9140

92-
let staked_balance = if ctx.is_testnet() {
93-
let client = TorusClient::for_mainnet().await?;
94-
client
95-
.balances()
96-
.storage()
97-
.account_get(&account)
98-
.await?
99-
.map(|data| data.reserved)
100-
} else {
41+
let data = if ctx.is_testnet() {
10142
let client = TorusClient::for_testnet().await?;
10243
client
103-
.balances()
44+
.system()
10445
.storage()
10546
.account_get(&account)
10647
.await?
107-
.map(|data| data.reserved)
108-
};
109-
110-
println!(
111-
"\"{}\"'s staking balance: {}",
112-
Path::new(&key.path)
113-
.file_name()
114-
.map(|path| path.to_string_lossy().to_string())
115-
.unwrap_or(key.path),
116-
staked_balance.unwrap_or(0)
117-
);
118-
119-
Ok(())
120-
}
121-
122-
pub async fn staked_balance(ctx: &CliCtx, key: String) -> anyhow::Result<()> {
123-
let key = get_key(&key)?;
124-
let (_key, keypair) = ctx.decrypt(&key)?;
125-
126-
let account = keypair.account();
127-
128-
let staked_balance = if ctx.is_testnet() {
129-
let client = TorusClient::for_mainnet().await?;
130-
client
131-
.torus0()
132-
.storage()
133-
.staked_by_iter1(&account)
134-
.await?
135-
.try_fold(0u128, async move |a, (_, amount)| Ok(a + amount))
136-
.await?
48+
.map(|info| (info.data.free, info.data.reserved, info.data.frozen))
13749
} else {
138-
let client = TorusClient::for_testnet().await?;
139-
client
140-
.torus0()
141-
.storage()
142-
.staked_by_iter1(&account)
143-
.await?
144-
.try_fold(0u128, async move |a, (_, amount)| Ok(a + amount))
145-
.await?
146-
};
147-
148-
println!(
149-
"\"{}\"'s staked balance: {}",
150-
Path::new(&key.path)
151-
.file_name()
152-
.map(|path| path.to_string_lossy().to_string())
153-
.unwrap_or(key.path),
154-
staked_balance
155-
);
156-
157-
Ok(())
158-
}
159-
160-
pub async fn show_balance(ctx: &CliCtx, key: String) -> anyhow::Result<()> {
161-
let key = get_key(&key)?;
162-
let (_key, keypair) = ctx.decrypt(&key)?;
163-
164-
let account = keypair.account();
165-
166-
let full_balance = if ctx.is_testnet() {
16750
let client = TorusClient::for_mainnet().await?;
16851
client
169-
.balances()
52+
.system()
17053
.storage()
17154
.account_get(&account)
17255
.await?
173-
.map(|data| data.reserved + data.free + data.frozen)
174-
} else {
175-
let client = TorusClient::for_testnet().await?;
176-
client
177-
.balances()
178-
.storage()
179-
.account_get(&account)
180-
.await?
181-
.map(|data| data.reserved + data.free + data.frozen)
182-
};
56+
.map(|info| (info.data.free, info.data.reserved, info.data.frozen))
57+
}
58+
.unwrap_or((0, 0, 0));
59+
60+
let mut table = Table::new(vec![
61+
(("free".to_string()), data.0.to_string()),
62+
(
63+
("reserved (stake + others)".to_string()),
64+
(data.1 + data.2).to_string(),
65+
),
66+
]);
67+
table.with(Remove::row(FirstRow));
18368

184-
println!(
185-
"\"{}\"'s full balance: {}",
186-
Path::new(&key.path)
187-
.file_name()
188-
.map(|path| path.to_string_lossy().to_string())
189-
.unwrap_or(key.path),
190-
full_balance.unwrap_or(0)
191-
);
69+
println!("{table}");
19270

19371
Ok(())
19472
}
19573

196-
pub async fn transfer_balance(
74+
pub async fn transfer(
19775
ctx: &CliCtx,
19876
key: String,
19977
target: String,
@@ -207,14 +85,14 @@ pub async fn transfer_balance(
20785
println!("Transfering...");
20886

20987
if ctx.is_testnet() {
210-
let client = TorusClient::for_mainnet().await?;
88+
let client = TorusClient::for_testnet().await?;
21189
client
21290
.balances()
21391
.calls()
21492
.transfer_keep_alive_wait(MultiAddress::Id(target), amount, keypair)
21593
.await?
21694
} else {
217-
let client = TorusClient::for_testnet().await?;
95+
let client = TorusClient::for_mainnet().await?;
21896
client
21997
.balances()
22098
.calls()
@@ -226,107 +104,3 @@ pub async fn transfer_balance(
226104

227105
Ok(())
228106
}
229-
230-
pub async fn stake_balance(
231-
ctx: &CliCtx,
232-
key: String,
233-
target: String,
234-
amount: u128,
235-
) -> anyhow::Result<()> {
236-
let key = get_key(&key)?;
237-
let (_key, keypair) = ctx.decrypt(&key)?;
238-
239-
let target = AccountId32::from_str(&target)?;
240-
241-
println!("Staking...");
242-
243-
if ctx.is_testnet() {
244-
let client = TorusClient::for_mainnet().await?;
245-
client
246-
.torus0()
247-
.calls()
248-
.add_stake_wait(target, amount, keypair)
249-
.await?
250-
} else {
251-
let client = TorusClient::for_testnet().await?;
252-
client
253-
.torus0()
254-
.calls()
255-
.add_stake_wait(target, amount, keypair)
256-
.await?
257-
};
258-
259-
println!("Staked successfully!");
260-
261-
Ok(())
262-
}
263-
264-
pub async fn transfer_staked_balance(
265-
ctx: &CliCtx,
266-
key: String,
267-
source: String,
268-
target: String,
269-
amount: u128,
270-
) -> anyhow::Result<()> {
271-
let key = get_key(&key)?;
272-
let (_key, keypair) = ctx.decrypt(&key)?;
273-
274-
let source = AccountId32::from_str(&source)?;
275-
let target = AccountId32::from_str(&target)?;
276-
277-
println!("Transfering stake...");
278-
279-
if ctx.is_testnet() {
280-
let client = TorusClient::for_mainnet().await?;
281-
client
282-
.torus0()
283-
.calls()
284-
.transfer_stake_wait(source, target, amount, keypair)
285-
.await?
286-
} else {
287-
let client = TorusClient::for_testnet().await?;
288-
client
289-
.torus0()
290-
.calls()
291-
.add_stake_wait(target, amount, keypair)
292-
.await?
293-
};
294-
295-
println!("Stake transfered successfully!");
296-
297-
Ok(())
298-
}
299-
300-
pub async fn unstake_balance(
301-
ctx: &CliCtx,
302-
key: String,
303-
target: String,
304-
amount: u128,
305-
) -> anyhow::Result<()> {
306-
let key = get_key(&key)?;
307-
let (_key, keypair) = ctx.decrypt(&key)?;
308-
309-
let target = AccountId32::from_str(&target)?;
310-
311-
println!("Unstaking...");
312-
313-
if ctx.is_testnet() {
314-
let client = TorusClient::for_mainnet().await?;
315-
client
316-
.torus0()
317-
.calls()
318-
.remove_stake_wait(target, amount, keypair)
319-
.await?
320-
} else {
321-
let client = TorusClient::for_testnet().await?;
322-
client
323-
.torus0()
324-
.calls()
325-
.remove_stake_wait(target, amount, keypair)
326-
.await?
327-
};
328-
329-
println!("Unstaked successfully!");
330-
331-
Ok(())
332-
}

cli/src/cli/key.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,14 @@ use crate::{
1010
store::{delete_key, get_all_keys, get_key, key_exists, store_new_key},
1111
};
1212

13+
#[derive(clap::Parser)]
14+
pub struct KeyCliCommand {
15+
#[command(subcommand)]
16+
pub sub_command: KeyCliSubCommand,
17+
}
18+
1319
#[derive(clap::Subcommand)]
14-
pub enum KeyCliCommand {
20+
pub enum KeyCliSubCommand {
1521
List,
1622
Create {
1723
name: String,

0 commit comments

Comments
 (0)