cashierd.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. use std::net::SocketAddr;
  2. use std::sync::Arc;
  3. use std::{path::Path, path::PathBuf};
  4. //use toml;
  5. use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
  6. use drk::cli::{CashierdCli, CashierdConfig, Config};
  7. use drk::service::CashierService;
  8. use drk::wallet::{CashierDb, CashierDbPtr};
  9. use drk::util::join_config_path;
  10. use drk::Result;
  11. use async_executor::Executor;
  12. use easy_parallel::Parallel;
  13. async fn start(executor: Arc<Executor<'_>>, config: Arc<&CashierdConfig>) -> Result<()> {
  14. let accept_addr: SocketAddr = config.accept_url.parse()?;
  15. let wallet = Arc::new(CashierDb::new("cashier.db", config.password.clone())?);
  16. let cashier = CashierService::new(accept_addr, wallet)?;
  17. cashier.start(executor.clone()).await?;
  18. Ok(())
  19. }
  20. fn main() -> Result<()> {
  21. let ex = Arc::new(Executor::new());
  22. let (signal, shutdown) = async_channel::unbounded::<()>();
  23. let path = join_config_path(&PathBuf::from("cashierd.toml")).unwrap();
  24. let config: CashierdConfig = if Path::new(&path).exists() {
  25. Config::<CashierdConfig>::load(path)?
  26. } else {
  27. Config::<CashierdConfig>::load_default(path)?
  28. };
  29. let config_ptr = Arc::new(&config);
  30. let options = CashierdCli::load()?;
  31. {
  32. use simplelog::*;
  33. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  34. let debug_level = if options.verbose {
  35. LevelFilter::Debug
  36. } else {
  37. LevelFilter::Off
  38. };
  39. let log_path = config.log_path.clone();
  40. CombinedLogger::init(vec![
  41. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  42. WriteLogger::new(
  43. LevelFilter::Debug,
  44. Config::default(),
  45. std::fs::File::create(log_path).unwrap(),
  46. ),
  47. ])
  48. .unwrap();
  49. }
  50. let ex2 = ex.clone();
  51. let (_, result) = Parallel::new()
  52. // Run four executor threads.
  53. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  54. // Run the main future on the current thread.
  55. .finish(|| {
  56. smol::future::block_on(async move {
  57. start(ex2, config_ptr).await?;
  58. drop(signal);
  59. Ok::<(), drk::Error>(())
  60. })
  61. });
  62. result
  63. }