config.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. use fxhash::FxHashMap;
  2. use log::{info, warn};
  3. use serde_derive::Deserialize;
  4. use structopt::StructOpt;
  5. use structopt_toml::StructOptToml;
  6. use toml::Value;
  7. use url::Url;
  8. use darkfi::{cli_desc, Result};
  9. #[derive(Clone, Debug, Deserialize, StructOpt, StructOptToml)]
  10. #[serde(default)]
  11. #[structopt(name = "lilith", about = cli_desc!())]
  12. pub struct Args {
  13. #[structopt(long, default_value = "tcp://127.0.0.1:18927")]
  14. /// JSON-RPC listen URL
  15. pub rpc_listen: Url,
  16. #[structopt(short, long)]
  17. /// Configuration file to use
  18. pub config: Option<String>,
  19. #[structopt(long)]
  20. /// Daemon published urls, common for all enabled networks (repeatable flag)
  21. pub urls: Vec<Url>,
  22. #[structopt(short, parse(from_occurrences))]
  23. /// Increase verbosity (-vvv supported)
  24. pub verbose: u8,
  25. }
  26. /// Defines the network specific settings
  27. #[derive(Clone)]
  28. pub struct NetInfo {
  29. /// Specific port the network will use
  30. pub port: u16,
  31. /// Connect to seeds (repeatable flag)
  32. pub seeds: Vec<Url>,
  33. /// Connect to peers (repeatable flag)
  34. pub peers: Vec<Url>,
  35. }
  36. /// Parse a TOML string for any configured network and return
  37. /// a map containing said configurations.
  38. ///
  39. /// ```toml
  40. /// [network."darkfid_sync"]
  41. /// port = 33032
  42. /// seeds = []
  43. /// peers = []
  44. /// ```
  45. pub fn parse_configured_networks(data: &str) -> Result<FxHashMap<String, NetInfo>> {
  46. let mut ret = FxHashMap::default();
  47. if let Value::Table(map) = toml::from_str(data)? {
  48. if map.contains_key("network") && map["network"].is_table() {
  49. for net in map["network"].as_table().unwrap() {
  50. info!("Found configuration for network: {}", net.0);
  51. let table = net.1.as_table().unwrap();
  52. if !table.contains_key("port") {
  53. warn!("Network port is mandatory, skipping network.");
  54. continue
  55. }
  56. let name = net.0.to_string();
  57. let port = table["port"].as_integer().unwrap().try_into().unwrap();
  58. let mut seeds = vec![];
  59. if table.contains_key("seeds") {
  60. if let Some(s) = table["seeds"].as_array() {
  61. for seed in s {
  62. if let Some(u) = seed.as_str() {
  63. if let Ok(url) = Url::parse(u) {
  64. seeds.push(url);
  65. }
  66. }
  67. }
  68. }
  69. }
  70. let mut peers = vec![];
  71. if table.contains_key("peers") {
  72. if let Some(p) = table["peers"].as_array() {
  73. for peer in p {
  74. if let Some(u) = peer.as_str() {
  75. if let Ok(url) = Url::parse(u) {
  76. peers.push(url);
  77. }
  78. }
  79. }
  80. }
  81. }
  82. let net_info = NetInfo { port, seeds, peers };
  83. ret.insert(name, net_info);
  84. }
  85. }
  86. };
  87. Ok(ret)
  88. }