Run rustfmt, clean up aquatic_http_protocol/Cargo.toml

This commit is contained in:
Joakim Frostegård 2021-08-15 22:26:11 +02:00
parent 0cc312a78d
commit d0e716f80b
65 changed files with 1754 additions and 2590 deletions

View file

@ -1,28 +1,23 @@
use anyhow::Context;
use hashbrown::HashMap;
use serde::{Serialize, Deserialize, Serializer, Deserializer};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
mod serde_helpers;
use serde_helpers::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AnnounceAction;
impl Serialize for AnnounceAction {
fn serialize<S>(
&self,
serializer: S
) -> Result<S::Ok, S::Error>
where S: Serializer
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str("announce")
}
}
impl<'de> Deserialize<'de> for AnnounceAction {
fn deserialize<D>(deserializer: D) -> Result<AnnounceAction, D::Error>
where
@ -32,23 +27,18 @@ impl<'de> Deserialize<'de> for AnnounceAction {
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScrapeAction;
impl Serialize for ScrapeAction {
fn serialize<S>(
&self,
serializer: S
) -> Result<S::Ok, S::Error>
where S: Serializer
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str("scrape")
}
}
impl<'de> Deserialize<'de> for ScrapeAction {
fn deserialize<D>(deserializer: D) -> Result<ScrapeAction, D::Error>
where
@ -58,7 +48,6 @@ impl<'de> Deserialize<'de> for ScrapeAction {
}
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct PeerId(
@ -66,10 +55,9 @@ pub struct PeerId(
deserialize_with = "deserialize_20_bytes",
serialize_with = "serialize_20_bytes"
)]
pub [u8; 20]
pub [u8; 20],
);
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct InfoHash(
@ -77,10 +65,9 @@ pub struct InfoHash(
deserialize_with = "deserialize_20_bytes",
serialize_with = "serialize_20_bytes"
)]
pub [u8; 20]
pub [u8; 20],
);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct OfferId(
@ -88,33 +75,29 @@ pub struct OfferId(
deserialize_with = "deserialize_20_bytes",
serialize_with = "serialize_20_bytes"
)]
pub [u8; 20]
pub [u8; 20],
);
/// Some kind of nested structure from https://www.npmjs.com/package/simple-peer
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct JsonValue(pub ::serde_json::Value);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AnnounceEvent {
Started,
Stopped,
Completed,
Update
Update,
}
impl Default for AnnounceEvent {
fn default() -> Self {
Self::Update
}
}
/// Apparently, these are sent to a number of peers when they are set
/// in an AnnounceRequest
/// action = "announce"
@ -126,12 +109,11 @@ pub struct MiddlemanOfferToPeer {
pub peer_id: PeerId,
pub info_hash: InfoHash,
/// Gets copied from AnnounceRequestOffer
pub offer: JsonValue,
pub offer: JsonValue,
/// Gets copied from AnnounceRequestOffer
pub offer_id: OfferId,
}
/// If announce request has answer = true, send this to peer with
/// peer id == "to_peer_id" field
/// Action field should be 'announce'
@ -145,7 +127,6 @@ pub struct MiddlemanAnswerToPeer {
pub offer_id: OfferId,
}
/// Element of AnnounceRequest.offers
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AnnounceRequestOffer {
@ -153,7 +134,6 @@ pub struct AnnounceRequestOffer {
pub offer_id: OfferId,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AnnounceRequest {
pub action: AnnounceAction,
@ -171,7 +151,7 @@ pub struct AnnounceRequest {
/// Length of this is number of peers wanted?
/// Max length of this is 10 in reference client code
/// Not sent when announce event is stopped or completed
pub offers: Option<Vec<AnnounceRequestOffer>>,
pub offers: Option<Vec<AnnounceRequestOffer>>,
/// Seems to only get sent by client when sending offers, and is also same
/// as length of offers vector (or at least never less)
/// Max length of this is 10 in reference client code
@ -182,14 +162,13 @@ pub struct AnnounceRequest {
/// Else, send MiddlemanAnswerToPeer to peer with "to_peer_id" as peer_id.
/// I think using Option is good, it seems like this isn't always set
/// (same as `offers`)
pub answer: Option<JsonValue>,
pub answer: Option<JsonValue>,
/// Likely undefined if !(answer == true)
pub to_peer_id: Option<PeerId>,
pub to_peer_id: Option<PeerId>,
/// Sent if answer is set
pub offer_id: Option<OfferId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AnnounceResponse {
pub action: AnnounceAction,
@ -201,7 +180,6 @@ pub struct AnnounceResponse {
pub announce_interval: usize, // Default 2 min probably
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ScrapeRequestInfoHashes {
@ -209,7 +187,6 @@ pub enum ScrapeRequestInfoHashes {
Multiple(Vec<InfoHash>),
}
impl ScrapeRequestInfoHashes {
pub fn as_vec(self) -> Vec<InfoHash> {
match self {
@ -219,7 +196,6 @@ impl ScrapeRequestInfoHashes {
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ScrapeRequest {
pub action: ScrapeAction,
@ -230,7 +206,6 @@ pub struct ScrapeRequest {
pub info_hashes: Option<ScrapeRequestInfoHashes>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ScrapeStatistics {
pub complete: usize,
@ -238,7 +213,6 @@ pub struct ScrapeStatistics {
pub downloaded: usize,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ScrapeResponse {
pub action: ScrapeAction,
@ -247,7 +221,6 @@ pub struct ScrapeResponse {
// pub flags: HashMap<String, usize>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum InMessage {
@ -255,7 +228,6 @@ pub enum InMessage {
ScrapeRequest(ScrapeRequest),
}
impl InMessage {
#[inline]
pub fn to_ws_message(&self) -> ::tungstenite::Message {
@ -263,9 +235,7 @@ impl InMessage {
}
#[inline]
pub fn from_ws_message(
ws_message: tungstenite::Message
) -> ::anyhow::Result<Self> {
pub fn from_ws_message(ws_message: tungstenite::Message) -> ::anyhow::Result<Self> {
use tungstenite::Message::Text;
let mut text = if let Text(text) = ws_message {
@ -274,12 +244,10 @@ impl InMessage {
return Err(anyhow::anyhow!("Message is not text"));
};
return ::simd_json::serde::from_str(&mut text)
.context("deserialize with serde");
return ::simd_json::serde::from_str(&mut text).context("deserialize with serde");
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OutMessage {
@ -289,7 +257,6 @@ pub enum OutMessage {
ScrapeResponse(ScrapeResponse),
}
impl OutMessage {
#[inline]
pub fn to_ws_message(&self) -> tungstenite::Message {
@ -297,10 +264,8 @@ impl OutMessage {
}
#[inline]
pub fn from_ws_message(
message: ::tungstenite::Message
) -> ::anyhow::Result<Self> {
use tungstenite::Message::{Text, Binary};
pub fn from_ws_message(message: ::tungstenite::Message) -> ::anyhow::Result<Self> {
use tungstenite::Message::{Binary, Text};
let mut text = match message {
Text(text) => text,
@ -312,7 +277,6 @@ impl OutMessage {
}
}
#[cfg(test)]
mod tests {
use quickcheck::Arbitrary;
@ -354,7 +318,7 @@ mod tests {
impl Arbitrary for AnnounceEvent {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
match (bool::arbitrary(g), bool::arbitrary(g)){
match (bool::arbitrary(g), bool::arbitrary(g)) {
(false, false) => Self::Started,
(true, false) => Self::Started,
(false, true) => Self::Completed,
@ -370,7 +334,7 @@ mod tests {
peer_id: Arbitrary::arbitrary(g),
info_hash: Arbitrary::arbitrary(g),
offer_id: Arbitrary::arbitrary(g),
offer: sdp_json_value()
offer: sdp_json_value(),
}
}
}
@ -382,7 +346,7 @@ mod tests {
peer_id: Arbitrary::arbitrary(g),
info_hash: Arbitrary::arbitrary(g),
offer_id: Arbitrary::arbitrary(g),
answer: sdp_json_value()
answer: sdp_json_value(),
}
}
}
@ -391,7 +355,7 @@ mod tests {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
Self {
offer_id: Arbitrary::arbitrary(g),
offer: sdp_json_value()
offer: sdp_json_value(),
}
}
}
@ -408,17 +372,16 @@ mod tests {
match has_offers_or_answer_or_neither {
Some(true) => {
offers = Some(Arbitrary::arbitrary(g));
},
}
Some(false) => {
answer = Some(sdp_json_value());
to_peer_id = Some(Arbitrary::arbitrary(g));
offer_id = Some(Arbitrary::arbitrary(g));
},
}
None => (),
}
let numwant = offers.as_ref()
.map(|offers| offers.len());
let numwant = offers.as_ref().map(|offers| offers.len());
Self {
action: AnnounceAction,
@ -456,7 +419,6 @@ mod tests {
}
}
impl Arbitrary for ScrapeRequestInfoHashes {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
if Arbitrary::arbitrary(g) {
@ -490,7 +452,7 @@ mod tests {
impl Arbitrary for InMessage {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
if Arbitrary::arbitrary(g){
if Arbitrary::arbitrary(g) {
Self::AnnounceRequest(Arbitrary::arbitrary(g))
} else {
Self::ScrapeRequest(Arbitrary::arbitrary(g))
@ -500,7 +462,7 @@ mod tests {
impl Arbitrary for OutMessage {
fn arbitrary(g: &mut quickcheck::Gen) -> Self {
match (Arbitrary::arbitrary(g), Arbitrary::arbitrary(g)){
match (Arbitrary::arbitrary(g), Arbitrary::arbitrary(g)) {
(false, false) => Self::AnnounceResponse(Arbitrary::arbitrary(g)),
(true, false) => Self::ScrapeResponse(Arbitrary::arbitrary(g)),
(false, true) => Self::Offer(Arbitrary::arbitrary(g)),
@ -513,11 +475,9 @@ mod tests {
fn quickcheck_serde_identity_in_message(in_message_1: InMessage) -> bool {
let ws_message = in_message_1.to_ws_message();
let in_message_2 = InMessage::from_ws_message(
ws_message.clone()
).unwrap();
let in_message_2 = InMessage::from_ws_message(ws_message.clone()).unwrap();
let success = in_message_1 == in_message_2;
let success = in_message_1 == in_message_2;
if !success {
dbg!(in_message_1);
@ -534,11 +494,9 @@ mod tests {
fn quickcheck_serde_identity_out_message(out_message_1: OutMessage) -> bool {
let ws_message = out_message_1.to_ws_message();
let out_message_2 = OutMessage::from_ws_message(
ws_message.clone()
).unwrap();
let out_message_2 = OutMessage::from_ws_message(ws_message.clone()).unwrap();
let success = out_message_1 == out_message_2;
let success = out_message_1 == out_message_2;
if !success {
dbg!(out_message_1);
@ -562,22 +520,21 @@ mod tests {
}
#[test]
fn test_deserialize_info_hashes_vec(){
fn test_deserialize_info_hashes_vec() {
let mut input: String = r#"{
"action": "scrape",
"info_hash": ["aaaabbbbccccddddeeee", "aaaabbbbccccddddeeee"]
}"#.into();
}"#
.into();
let info_hashes = ScrapeRequestInfoHashes::Multiple(
vec![
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
]
);
let info_hashes = ScrapeRequestInfoHashes::Multiple(vec![
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
info_hash_from_bytes(b"aaaabbbbccccddddeeee"),
]);
let expected = ScrapeRequest {
action: ScrapeAction,
info_hashes: Some(info_hashes)
info_hashes: Some(info_hashes),
};
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
@ -586,19 +543,19 @@ mod tests {
}
#[test]
fn test_deserialize_info_hashes_str(){
fn test_deserialize_info_hashes_str() {
let mut input: String = r#"{
"action": "scrape",
"info_hash": "aaaabbbbccccddddeeee"
}"#.into();
}"#
.into();
let info_hashes = ScrapeRequestInfoHashes::Single(
info_hash_from_bytes(b"aaaabbbbccccddddeeee")
);
let info_hashes =
ScrapeRequestInfoHashes::Single(info_hash_from_bytes(b"aaaabbbbccccddddeeee"));
let expected = ScrapeRequest {
action: ScrapeAction,
info_hashes: Some(info_hashes)
info_hashes: Some(info_hashes),
};
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
@ -607,15 +564,16 @@ mod tests {
}
#[test]
fn test_deserialize_info_hashes_null(){
fn test_deserialize_info_hashes_null() {
let mut input: String = r#"{
"action": "scrape",
"info_hash": null
}"#.into();
}"#
.into();
let expected = ScrapeRequest {
action: ScrapeAction,
info_hashes: None
info_hashes: None,
};
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
@ -624,14 +582,15 @@ mod tests {
}
#[test]
fn test_deserialize_info_hashes_missing(){
fn test_deserialize_info_hashes_missing() {
let mut input: String = r#"{
"action": "scrape"
}"#.into();
}"#
.into();
let expected = ScrapeRequest {
action: ScrapeAction,
info_hashes: None
info_hashes: None,
};
let observed: ScrapeRequest = ::simd_json::serde::from_str(&mut input).unwrap();
@ -645,12 +604,12 @@ mod tests {
println!("{}", json);
let deserialized: ScrapeRequestInfoHashes = ::simd_json::serde::from_str(&mut json).unwrap();
let deserialized: ScrapeRequestInfoHashes =
::simd_json::serde::from_str(&mut json).unwrap();
let success = info_hashes == deserialized;
if !success {
}
if !success {}
success
}