2222//! };
2323//! ```
2424
25+ use std:: fmt;
2526use std:: net:: { IpAddr , SocketAddr } ;
2627use std:: ops:: { Deref , DerefMut } ;
28+ use std:: str:: FromStr ;
2729use std:: sync:: Arc ;
2830
2931use aquatic_udp_protocol:: { AnnounceEvent , NumberOfBytes , PeerId } ;
30- use derive_more:: Display ;
3132use serde:: Serialize ;
3233use zerocopy:: FromBytes as _;
3334
3435use crate :: DurationSinceUnixEpoch ;
3536
3637pub type PeerAnnouncement = Peer ;
3738
38- #[ derive( Debug , Display , Serialize , Copy , Clone , PartialEq , Eq , Hash ) ]
39+ #[ derive( Debug , Serialize , Copy , Clone , PartialEq , Eq , Hash ) ]
3940#[ serde( rename_all_fields = "lowercase" ) ]
4041pub enum PeerRole {
4142 Seeder ,
@@ -53,6 +54,39 @@ impl PeerRole {
5354 }
5455}
5556
57+ impl fmt:: Display for PeerRole {
58+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
59+ match self {
60+ PeerRole :: Seeder => write ! ( f, "seeder" ) ,
61+ PeerRole :: Leecher => write ! ( f, "leecher" ) ,
62+ }
63+ }
64+ }
65+
66+ impl FromStr for PeerRole {
67+ type Err = ParsePeerRoleError ;
68+
69+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
70+ match s. to_lowercase ( ) . as_str ( ) {
71+ "seeder" => Ok ( PeerRole :: Seeder ) ,
72+ "leecher" => Ok ( PeerRole :: Leecher ) ,
73+ _ => Err ( ParsePeerRoleError :: InvalidPeerRole {
74+ location : Location :: caller ( ) ,
75+ raw_param : s. to_string ( ) ,
76+ } ) ,
77+ }
78+ }
79+ }
80+
81+ #[ derive( Error , Debug ) ]
82+ pub enum ParsePeerRoleError {
83+ #[ error( "invalid param {raw_param} in {location}" ) ]
84+ InvalidPeerRole {
85+ location : & ' static Location < ' static > ,
86+ raw_param : String ,
87+ } ,
88+ }
89+
5690/// Peer struct used by the core `Tracker`.
5791///
5892/// A sample peer:
@@ -264,6 +298,14 @@ impl Peer {
264298 ..self
265299 }
266300 }
301+
302+ #[ must_use]
303+ pub fn into_seeder ( self ) -> Self {
304+ Self {
305+ left : NumberOfBytes :: new ( 0 ) ,
306+ ..self
307+ }
308+ }
267309}
268310
269311use std:: panic:: Location ;
0 commit comments