program_options.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. use std::{
  2. net::{SocketAddr},
  3. };
  4. use drk::{
  5. net, Result,
  6. };
  7. pub struct ProgramOptions {
  8. pub network_settings: net::Settings,
  9. pub log_path: Box<std::path::PathBuf>,
  10. pub irc_accept_addr: SocketAddr,
  11. }
  12. impl ProgramOptions {
  13. pub fn load() -> Result<ProgramOptions> {
  14. let app = clap_app!(dfi =>
  15. (version: "0.1.0")
  16. (author: "Amir Taaki <amir@dyne.org>")
  17. (about: "Dark node")
  18. (@arg ACCEPT: -a --accept +takes_value "Accept address")
  19. (@arg SEED_NODES: -s --seeds +takes_value ... "Seed nodes")
  20. (@arg CONNECTS: -c --connect +takes_value ... "Manual connections")
  21. (@arg CONNECT_SLOTS: --slots +takes_value "Connection slots")
  22. (@arg EXTERNAL_ADDR: -e --external +takes_value "External address")
  23. (@arg LOG_PATH: --log +takes_value "Logfile path")
  24. (@arg IRC_ACCEPT: -r --irc +takes_value "IRC accept address")
  25. )
  26. .get_matches();
  27. let accept_addr = if let Some(accept_addr) = app.value_of("ACCEPT") {
  28. Some(accept_addr.parse()?)
  29. } else {
  30. None
  31. };
  32. let mut seed_addrs: Vec<SocketAddr> = vec![];
  33. if let Some(seeds) = app.values_of("SEED_NODES") {
  34. for seed in seeds {
  35. seed_addrs.push(seed.parse()?);
  36. }
  37. }
  38. let mut manual_connects: Vec<SocketAddr> = vec![];
  39. if let Some(connections) = app.values_of("CONNECTS") {
  40. for connect in connections {
  41. manual_connects.push(connect.parse()?);
  42. }
  43. }
  44. let connection_slots = if let Some(connection_slots) = app.value_of("CONNECT_SLOTS") {
  45. connection_slots.parse()?
  46. } else {
  47. 0
  48. };
  49. let external_addr = if let Some(external_addr) = app.value_of("EXTERNAL_ADDR") {
  50. Some(external_addr.parse()?)
  51. } else {
  52. None
  53. };
  54. let log_path = Box::new(
  55. if let Some(log_path) = app.value_of("LOG_PATH") {
  56. std::path::Path::new(log_path)
  57. } else {
  58. std::path::Path::new("/tmp/darkfid.log")
  59. }
  60. .to_path_buf(),
  61. );
  62. let irc_accept_addr = if let Some(accept_addr) = app.value_of("IRC_ACCEPT") {
  63. accept_addr.parse()?
  64. } else {
  65. ([127, 0, 0, 1], 6667).into()
  66. };
  67. Ok(ProgramOptions {
  68. network_settings: net::Settings {
  69. inbound: accept_addr,
  70. outbound_connections: connection_slots,
  71. external_addr,
  72. peers: manual_connects,
  73. seeds: seed_addrs,
  74. ..Default::default()
  75. },
  76. log_path,
  77. irc_accept_addr,
  78. })
  79. }
  80. }