test 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #[macro_use]
  2. extern crate clap;
  3. use clap::ArgMatches;
  4. use drk::cli::{Config, DrkConfig};
  5. use drk::util::join_config_path;
  6. use drk::{rpc::jsonrpc, rpc::jsonrpc::JsonResult, Error, Result};
  7. use log::debug;
  8. use serde::{Deserialize, Serialize};
  9. use serde_json::{json, Value};
  10. use simplelog::{
  11. CombinedLogger, Config as SimplelogConfig, ConfigBuilder, LevelFilter, TermLogger,
  12. TerminalMode, WriteLogger,
  13. };
  14. use std::path::PathBuf;
  15. struct Drk {
  16. url: String,
  17. }
  18. impl Drk {
  19. pub fn new(url: String) -> Self {
  20. Self { url }
  21. }
  22. async fn request(&self, r: jsonrpc::JsonRequest) -> Result<Value> {
  23. let r = json!(r);
  24. // create http body from json
  25. let data = surf::Body::from_json(&r)?;
  26. debug!(target: "DRK", "--> {:?}", r);
  27. println!("--> {:?}", r);
  28. let d2 = surf::Body::from_json(&r)?;
  29. println!("{:?}", d2.into_string().await);
  30. // send the data to the server
  31. let mut req = surf::post(&self.url).body(data).await?;
  32. // get the response
  33. let resp = req.take_body();
  34. // read the response body as a string
  35. let json = resp.into_string().await?;
  36. // parse the response into a JsonResult
  37. println!("{}", json);
  38. let v: JsonResult = serde_json::from_str(&json)?;
  39. match v {
  40. JsonResult::Resp(r) => {
  41. debug!(target: "DRK", "<-- {:?}", r);
  42. return Ok(r.result);
  43. }
  44. JsonResult::Err(e) => {
  45. debug!(target: "DRK", "<-- {:?}", e);
  46. println!("here!");
  47. return Err(Error::JsonRpcError(e.error.message.to_string()));
  48. }
  49. JsonResult::Notif(n) => {
  50. debug!(target: "DRK", "<-- {:?}", n);
  51. return Err(Error::JsonRpcError(
  52. "Unexpected reply from server".to_string(),
  53. ));
  54. }
  55. };
  56. }
  57. async fn deposit(&self, network: String, asset: String) -> Result<Value> {
  58. // create json request
  59. // method = deposit
  60. // params = network, asset
  61. // type = Value
  62. let req = jsonrpc::request(json!("deposit"), json!([network, asset]));
  63. // call request function
  64. Ok(self.request(req).await?)
  65. }
  66. }
  67. #[derive(Serialize, Deserialize, Debug)]
  68. pub struct XX {
  69. pub foo: Value,
  70. }
  71. async fn start(config: &DrkConfig, options: ArgMatches<'_>) -> Result<()> {
  72. //let req = json!(jsonrpc::request(
  73. // json!("deposit"),
  74. // json!(["solana", "USDC"])
  75. //));
  76. ////let x = json!(XX { foo: json!(2) });
  77. //let ss = req.to_string();
  78. //println!("{}", ss);
  79. //let v: jsonrpc::JsonRequest = serde_json::from_str(&ss)?;
  80. //return Ok(());
  81. //
  82. let client = Drk::new(config.rpc_url.clone());
  83. if let Some(matches) = options.subcommand_matches("deposit") {
  84. let network = matches.value_of("network").unwrap().to_lowercase();
  85. let token = matches.value_of("TOKEN").unwrap();
  86. let reply = client
  87. .deposit(network.to_string(), token.to_string())
  88. .await?;
  89. println!(
  90. "Deposit your coins to the following address: {}",
  91. &reply.to_string()
  92. );
  93. return Ok(());
  94. }
  95. println!("Please run 'drk help' to see usage.");
  96. Err(Error::MissingParams)
  97. }
  98. fn main() -> Result<()> {
  99. let args = clap_app!(drk =>
  100. (@subcommand deposit =>
  101. (about: "Deposit clear assets for Dark assets")
  102. (@arg network: +required +takes_value --network
  103. "Which network to use (bitcoin/solana/...)")
  104. (@arg TOKEN: +required
  105. "Which token to deposit (BTC/SOL/USDC/...)")
  106. )
  107. )
  108. .get_matches();
  109. let config_path: PathBuf;
  110. if args.is_present("CONFIG") {
  111. config_path = PathBuf::from(args.value_of("CONFIG").unwrap());
  112. } else {
  113. config_path = join_config_path(&PathBuf::from("drk.toml"))?;
  114. }
  115. let config = Config::<DrkConfig>::load(config_path)?;
  116. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  117. // TODO: --verbose
  118. let debug_level = if args.is_present("verbose") {
  119. LevelFilter::Debug
  120. } else {
  121. LevelFilter::Off
  122. };
  123. let log_path = config.log_path.clone();
  124. CombinedLogger::init(vec![
  125. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  126. WriteLogger::new(
  127. LevelFilter::Debug,
  128. SimplelogConfig::default(),
  129. std::fs::File::create(log_path).unwrap(),
  130. ),
  131. ])
  132. .unwrap();
  133. futures::executor::block_on(start(&config, args))
  134. }