You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.8 KiB

  1. extern crate serde;
  2. extern crate serde_bencode;
  3. #[macro_use]
  4. extern crate serde_derive;
  5. extern crate serde_bytes;
  6. use serde_bencode::{de, ser};
  7. use serde_bytes::ByteBuf;
  8. #[derive(Debug, Deserialize)]
  9. struct Node(String, i64);
  10. #[derive(Debug, Serialize, Deserialize)]
  11. struct File {
  12. path: Vec<String>,
  13. length: i64,
  14. #[serde(default)]
  15. md5sum: Option<String>,
  16. }
  17. #[derive(Debug, Serialize, Deserialize)]
  18. struct Info {
  19. name: String,
  20. pieces: ByteBuf,
  21. #[serde(rename = "piece length")]
  22. piece_length: i64,
  23. #[serde(default)]
  24. md5sum: Option<String>,
  25. #[serde(default)]
  26. length: Option<i64>,
  27. #[serde(default)]
  28. files: Option<Vec<File>>,
  29. #[serde(default)]
  30. private: Option<u8>,
  31. #[serde(default)]
  32. path: Option<Vec<String>>,
  33. #[serde(default)]
  34. #[serde(rename = "root hash")]
  35. root_hash: Option<String>,
  36. }
  37. #[derive(Debug, Deserialize)]
  38. struct Torrent {
  39. info: Info,
  40. #[serde(default)]
  41. announce: Option<String>,
  42. #[serde(default)]
  43. nodes: Option<Vec<Node>>,
  44. #[serde(default)]
  45. encoding: Option<String>,
  46. #[serde(default)]
  47. httpseeds: Option<Vec<String>>,
  48. #[serde(default)]
  49. #[serde(rename = "announce-list")]
  50. announce_list: Option<Vec<Vec<String>>>,
  51. #[serde(default)]
  52. #[serde(rename = "creation date")]
  53. creation_date: Option<i64>,
  54. #[serde(rename = "comment")]
  55. comment: Option<String>,
  56. #[serde(default)]
  57. #[serde(rename = "created by")]
  58. created_by: Option<String>,
  59. }
  60. impl Torrent {
  61. pub fn open(path: &str) -> Torrent {
  62. let b = std::fs::read(path).unwrap();
  63. de::from_bytes::<Torrent>(&b).unwrap()
  64. }
  65. }
  66. #[cfg(test)]
  67. mod tests {
  68. use super::*;
  69. #[test]
  70. fn test_read() {
  71. let t = Torrent::open("test.torrent");
  72. println!("{:?}", t);
  73. }
  74. }