From 5bece4655dc21426e18457c2bf9799ab8994f0ce Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Fri, 24 Oct 2025 13:36:24 +0800 Subject: refactor: seperate cli and gui bin --- src/cli.rs | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 src/cli.rs (limited to 'src/cli.rs') diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..f171e5e --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,132 @@ +use crate::daemon::init; +use std::{ + io, + sync::{Arc, Weak}, +}; + +use bitcoin::{ + client::Client, + network::{Network, Request}, + transaction::Transaction, +}; +use tokio::sync::Mutex; + +pub mod daemon; + +pub struct Ui { + network: Weak>, + me: Client, +} + +impl Ui { + pub fn new(network: Weak>, me: Client) -> Self { + Self { + network, + me, + } + } + + // TODO: typed command and result propagation + pub async fn cmd(&mut self, cmd: &str) -> Option { + let cmd: Vec<&str> = cmd + .split_whitespace() + .collect(); + if cmd[0] == "trans" { + let trans = Transaction::new( + self.me, + Client::new( + cmd[1] + .parse() + .unwrap(), + ), + cmd[2] + .parse() + .unwrap(), + ); + let net = self + .network + .upgrade() + .unwrap(); + let block = Network::new_block(net, trans).await; + return Some(Request::Block(Arc::new(block))); + } + + if cmd[0] == "bc" { + let net = self + .network + .upgrade() + .unwrap(); + let bc = { + net.lock() + .await + .get_blockchain() + .clone() + }; + println!( + "{:#?}", + bc.lock() + .await + ); + } + + if cmd[0] == "peer" { + if cmd[1] == "add" { + let net = self + .network + .upgrade() + .unwrap(); + Network::try_peer(net, cmd[2]).await; + } + + if cmd[1] == "list" { + let net = self + .network + .upgrade() + .unwrap(); + println!( + "{:#?}", + net.lock() + .await + .peers + ); + } + } + + if cmd[0] == "fetch" { + let net = self + .network + .upgrade() + .unwrap(); + Network::get_idb(net); + } + + None + } +} + +#[tokio::main] +async fn main() { + let network = init().await; + + let mut ui = Ui::new( + Arc::downgrade(&network), + *network + .lock() + .await + .get_me(), + ); + + loop { + let mut cmd = String::new(); + io::stdin() + .read_line(&mut cmd) + .unwrap(); + + if let Some(req) = ui + .cmd(&cmd) + .await + { + Network::broadcast(network.clone(), req).await; + } + } +} -- cgit v1.2.3