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 --- Cargo.toml | 8 ++++ src/cli.rs | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/daemon.rs | 18 ++++++++ src/main.rs | 44 -------------------- src/ui.rs | 99 ------------------------------------------- 5 files changed, 158 insertions(+), 143 deletions(-) create mode 100644 src/cli.rs create mode 100644 src/daemon.rs delete mode 100644 src/main.rs delete mode 100644 src/ui.rs diff --git a/Cargo.toml b/Cargo.toml index 4c6fd2b..ff040bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,11 @@ futures = "0.3.31" rand = "0.9.2" sha2 = "0.10.9" bincode = "2.0.1" + +[[bin]] +name = "bitcoin-cli" +path = "src/cli.rs" + +[[bin]] +name = "bitcoin-gui" +path = "src/gui.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; + } + } +} diff --git a/src/daemon.rs b/src/daemon.rs new file mode 100644 index 0000000..156e283 --- /dev/null +++ b/src/daemon.rs @@ -0,0 +1,18 @@ +use std::sync::Arc; + +use bitcoin::{ + blocks::BlockChain, + network::{Network, Request}, +}; +use tokio::sync::Mutex; + +pub async fn init() -> Arc> { + let bc = Arc::new(Mutex::new(BlockChain::default())); + let network = Network::new(bc).await; + + Network::start(network.clone()); + + Network::broadcast(network.clone(), Request::Ibd(None)).await; + + network +} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 8f8ddf2..0000000 --- a/src/main.rs +++ /dev/null @@ -1,44 +0,0 @@ -use std::{io, sync::Arc}; - -use bitcoin::{ - blocks::BlockChain, - network::{Network, Request}, -}; -use tokio::sync::Mutex; - -use crate::ui::Ui; - -pub mod ui; - -#[tokio::main] -async fn main() { - let bc = Arc::new(Mutex::new(BlockChain::default())); - let network = Network::new(bc).await; - - Network::start(network.clone()); - - Network::broadcast(network.clone(), Request::Ibd(None)).await; - - let me = { - let net = network - .lock() - .await; - *net.get_me() - }; - - let mut ui = Ui::new(Arc::downgrade(&network), 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; - } - } -} diff --git a/src/ui.rs b/src/ui.rs deleted file mode 100644 index 446fdb6..0000000 --- a/src/ui.rs +++ /dev/null @@ -1,99 +0,0 @@ -use std::sync::{Arc, Weak}; - -use bitcoin::{ - client::Client, - network::{Network, Request}, - transaction::Transaction, -}; -use tokio::sync::Mutex; - -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 - } -} -- cgit v1.2.3