Skip to content

Commit 4de7793

Browse files
committed
feat: [#670] new JSON serialization for connect and error aquatic responses
1 parent a0a7056 commit 4de7793

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

src/console/clients/udp/app.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ use std::net::{SocketAddr, ToSocketAddrs};
6060
use std::str::FromStr;
6161

6262
use anyhow::Context;
63-
use aquatic_udp_protocol::Response::{self, AnnounceIpv4, AnnounceIpv6, Scrape};
63+
use aquatic_udp_protocol::Response::{self, AnnounceIpv4, AnnounceIpv6, Connect, Error, Scrape};
6464
use aquatic_udp_protocol::{Port, TransactionId};
6565
use clap::{Parser, Subcommand};
6666
use log::{debug, LevelFilter};
6767
use torrust_tracker_primitives::info_hash::InfoHash as TorrustInfoHash;
6868
use url::Url;
6969

7070
use crate::console::clients::udp::checker;
71-
use crate::console::clients::udp::responses::{AnnounceResponseDto, ScrapeResponseDto};
71+
use crate::console::clients::udp::responses::{AnnounceResponseDto, ConnectResponseDto, ErrorResponseDto, ScrapeResponseDto};
7272

7373
const ASSIGNED_BY_OS: u16 = 0;
7474
const RANDOM_TRANSACTION_ID: i32 = -888_840_697;
@@ -171,6 +171,11 @@ async fn handle_scrape(tracker_socket_addr: &SocketAddr, info_hashes: &[TorrustI
171171

172172
fn print_response(response: Response) -> anyhow::Result<()> {
173173
match response {
174+
Connect(response) => {
175+
let pretty_json = serde_json::to_string_pretty(&ConnectResponseDto::from(response))
176+
.context("connect response JSON serialization")?;
177+
println!("{pretty_json}");
178+
}
174179
AnnounceIpv4(response) => {
175180
let pretty_json = serde_json::to_string_pretty(&AnnounceResponseDto::from(response))
176181
.context("announce IPv4 response JSON serialization")?;
@@ -186,7 +191,11 @@ fn print_response(response: Response) -> anyhow::Result<()> {
186191
serde_json::to_string_pretty(&ScrapeResponseDto::from(response)).context("scrape response JSON serialization")?;
187192
println!("{pretty_json}");
188193
}
189-
_ => println!("{response:#?}"), // todo: serialize to JSON all aquatic responses.
194+
Error(response) => {
195+
let pretty_json =
196+
serde_json::to_string_pretty(&ErrorResponseDto::from(response)).context("error response JSON serialization")?;
197+
println!("{pretty_json}");
198+
}
190199
};
191200

192201
Ok(())

src/console/clients/udp/responses.rs

+31-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
11
//! Aquatic responses are not serializable. These are the serializable wrappers.
22
use std::net::{Ipv4Addr, Ipv6Addr};
33

4-
use aquatic_udp_protocol::{AnnounceResponse, Ipv4AddrBytes, Ipv6AddrBytes, ScrapeResponse};
4+
use aquatic_udp_protocol::{AnnounceResponse, ConnectResponse, ErrorResponse, Ipv4AddrBytes, Ipv6AddrBytes, ScrapeResponse};
55
use serde::Serialize;
66

7+
#[derive(Serialize)]
8+
pub struct ConnectResponseDto {
9+
transaction_id: i32,
10+
connection_id: i64,
11+
}
12+
13+
impl From<ConnectResponse> for ConnectResponseDto {
14+
fn from(connect: ConnectResponse) -> Self {
15+
Self {
16+
transaction_id: connect.transaction_id.0.into(),
17+
connection_id: connect.connection_id.0.into(),
18+
}
19+
}
20+
}
21+
722
#[derive(Serialize)]
823
pub struct AnnounceResponseDto {
924
transaction_id: i32,
@@ -68,6 +83,21 @@ impl From<ScrapeResponse> for ScrapeResponseDto {
6883
}
6984
}
7085

86+
#[derive(Serialize)]
87+
pub struct ErrorResponseDto {
88+
transaction_id: i32,
89+
message: String,
90+
}
91+
92+
impl From<ErrorResponse> for ErrorResponseDto {
93+
fn from(error: ErrorResponse) -> Self {
94+
Self {
95+
transaction_id: error.transaction_id.0.into(),
96+
message: error.message.to_string(),
97+
}
98+
}
99+
}
100+
71101
#[derive(Serialize)]
72102
struct TorrentStats {
73103
seeders: i32,

0 commit comments

Comments
 (0)