@@ -5,10 +5,11 @@ use ::rosu_v2::model::user::{
55use bathbot_util:: osu:: UserStats ;
66use rkyv:: {
77 munge:: munge,
8+ niche:: niching:: { NaN , Niching } ,
89 rancor:: { Fallible , Source } ,
910 rend:: u32_le,
1011 ser:: { Allocator , Writer } ,
11- with:: { ArchiveWith , InlineAsBox , Map , SerializeWith } ,
12+ with:: { ArchiveWith , InlineAsBox , Map , MapNiche , SerializeWith } ,
1213 Archive , Deserialize , Place , Serialize ,
1314} ;
1415use rosu_v2:: prelude:: { CountryCode , DailyChallengeUserStatistics , GameMode , Username } ;
@@ -72,13 +73,16 @@ impl From<MedalCompactRkyv> for MedalCompact {
7273}
7374
7475#[ derive( Archive , Serialize ) ]
75- #[ rkyv( remote = DailyChallengeUserStatistics , archived = ArchivedDailyChallengeUserStatistics ) ]
76+ #[ rkyv(
77+ remote = DailyChallengeUserStatistics ,
78+ archived = ArchivedDailyChallengeUserStatistics ,
79+ ) ]
7680pub struct DailyChallengeUserStatisticsRkyv {
7781 pub daily_streak_best : u32 ,
7882 pub daily_streak_current : u32 ,
79- #[ rkyv( with = Map < DateTimeRkyv >) ]
83+ #[ rkyv( with = MapNiche < DateTimeRkyv , DateTimeRkyv >) ]
8084 pub last_update : Option < OffsetDateTime > ,
81- #[ rkyv( with = Map < DateTimeRkyv >) ]
85+ #[ rkyv( with = MapNiche < DateTimeRkyv , DateTimeRkyv >) ]
8286 pub last_weekly_streak : Option < OffsetDateTime > ,
8387 pub playcount : u32 ,
8488 pub top_10p_placements : u32 ,
@@ -113,6 +117,17 @@ pub struct TeamRkyv {
113117 pub short_name : String ,
114118}
115119
120+ impl Niching < ArchivedTeam > for TeamRkyv {
121+ unsafe fn is_niched ( niched : * const ArchivedTeam ) -> bool {
122+ unsafe { ( * niched) . id == 0 }
123+ }
124+
125+ fn resolve_niched ( out : Place < ArchivedTeam > ) {
126+ munge ! ( let ArchivedTeam { id, .. } = out) ;
127+ 0_u32 . resolve ( ( ) , id) ;
128+ }
129+ }
130+
116131#[ derive( Clone , Archive , Serialize ) ]
117132pub struct User {
118133 pub avatar_url : Box < str > ,
@@ -122,7 +137,7 @@ pub struct User {
122137 pub join_date : OffsetDateTime ,
123138 #[ rkyv( with = UserKudosuRkyv ) ]
124139 pub kudosu : UserKudosu ,
125- #[ rkyv( with = Map < DateTimeRkyv >) ]
140+ #[ rkyv( with = MapNiche < DateTimeRkyv , DateTimeRkyv >) ]
126141 pub last_visit : Option < OffsetDateTime > ,
127142 pub mode : GameMode ,
128143 pub user_id : u32 ,
@@ -134,7 +149,7 @@ pub struct User {
134149 pub follower_count : u32 ,
135150 pub graveyard_mapset_count : u32 ,
136151 pub guest_mapset_count : u32 ,
137- #[ rkyv( with = Map <UserHighestRankRkyv >) ]
152+ #[ rkyv( with = MapNiche <UserHighestRankRkyv , DateTimeRkyv >) ]
138153 pub highest_rank : Option < UserHighestRank > ,
139154 pub loved_mapset_count : u32 ,
140155 pub mapping_follower_count : u32 ,
@@ -145,14 +160,14 @@ pub struct User {
145160 #[ rkyv( with = Map <MonthlyCountRkyv >) ]
146161 pub replays_watched_counts : Vec < MonthlyCount > ,
147162 pub scores_first_count : u32 ,
148- #[ rkyv( with = Map <UserStatisticsRkyv >) ]
163+ #[ rkyv( with = MapNiche <UserStatisticsRkyv , NaN >) ]
149164 pub statistics : Option < UserStatistics > ,
150165 pub pending_mapset_count : u32 ,
151166 #[ rkyv( with = Map <MedalCompactRkyv >) ]
152167 pub medals : Vec < MedalCompact > ,
153168 #[ rkyv( with = DailyChallengeUserStatisticsRkyv ) ]
154169 pub daily_challenge : DailyChallengeUserStatistics ,
155- #[ rkyv( with = Map < TeamRkyv >) ]
170+ #[ rkyv( with = MapNiche < TeamRkyv , TeamRkyv >) ]
156171 pub team : Option < Team > ,
157172}
158173
@@ -194,7 +209,11 @@ impl ArchiveWith<UserExtended> for User {
194209 DerefAsString :: resolve_with ( & user. country_code , resolver. country_code , country_code) ;
195210 DateTimeRkyv :: resolve_with ( & user. join_date , resolver. join_date , join_date) ;
196211 UserKudosuRkyv :: resolve_with ( & user. kudosu , resolver. kudosu , kudosu) ;
197- Map :: < DateTimeRkyv > :: resolve_with ( & user. last_visit , resolver. last_visit , last_visit) ;
212+ MapNiche :: < DateTimeRkyv , DateTimeRkyv > :: resolve_with (
213+ & user. last_visit ,
214+ resolver. last_visit ,
215+ last_visit,
216+ ) ;
198217 user. mode . resolve ( resolver. mode , mode) ;
199218 user. user_id . resolve ( resolver. user_id , user_id) ;
200219 DerefAsString :: resolve_with ( & user. username , resolver. username , username) ;
@@ -214,7 +233,7 @@ impl ArchiveWith<UserExtended> for User {
214233 resolver. guest_mapset_count ,
215234 guest_mapset_count,
216235 ) ;
217- Map :: < UserHighestRankRkyv > :: resolve_with (
236+ MapNiche :: < UserHighestRankRkyv , DateTimeRkyv > :: resolve_with (
218237 & user. highest_rank ,
219238 resolver. highest_rank ,
220239 highest_rank,
@@ -259,14 +278,18 @@ impl ArchiveWith<UserExtended> for User {
259278 resolver. replays_watched_counts ,
260279 replays_watched_counts,
261280 ) ;
262- Map :: < UserStatisticsRkyv > :: resolve_with ( & user. statistics , resolver. statistics , statistics) ;
281+ MapNiche :: < UserStatisticsRkyv , NaN > :: resolve_with (
282+ & user. statistics ,
283+ resolver. statistics ,
284+ statistics,
285+ ) ;
263286 MapUnwrapOrDefault :: < MedalCompactRkyv > :: resolve_with ( & user. medals , resolver. medals , medals) ;
264287 DailyChallengeUserStatisticsRkyv :: resolve_with (
265288 & user. daily_challenge_stats ,
266289 resolver. daily_challenge ,
267290 daily_challenge,
268291 ) ;
269- Map :: < TeamRkyv > :: resolve_with ( & user. team , resolver. team , team) ;
292+ MapNiche :: < TeamRkyv , TeamRkyv > :: resolve_with ( & user. team , resolver. team , team) ;
270293 }
271294}
272295
@@ -279,12 +302,15 @@ impl<S: Fallible<Error: Source> + Writer + Allocator + ?Sized> SerializeWith<Use
279302 country_code : DerefAsString :: serialize_with ( & user. country_code , serializer) ?,
280303 join_date : DateTimeRkyv :: serialize_with ( & user. join_date , serializer) ?,
281304 kudosu : UserKudosuRkyv :: serialize_with ( & user. kudosu , serializer) ?,
282- last_visit : Map :: < DateTimeRkyv > :: serialize_with ( & user. last_visit , serializer) ?,
305+ last_visit : MapNiche :: < DateTimeRkyv , DateTimeRkyv > :: serialize_with (
306+ & user. last_visit ,
307+ serializer,
308+ ) ?,
283309 mode : user. mode . serialize ( serializer) ?,
284310 user_id : user. user_id . serialize ( serializer) ?,
285311 username : DerefAsString :: serialize_with ( & user. username , serializer) ?,
286312 badges : MapUnwrapOrDefault :: < BadgeRkyv > :: serialize_with ( & user. badges , serializer) ?,
287- highest_rank : Map :: < UserHighestRankRkyv > :: serialize_with (
313+ highest_rank : MapNiche :: < UserHighestRankRkyv , DateTimeRkyv > :: serialize_with (
288314 & user. highest_rank ,
289315 serializer,
290316 ) ?,
@@ -329,7 +355,10 @@ impl<S: Fallible<Error: Source> + Writer + Allocator + ?Sized> SerializeWith<Use
329355 & user. replays_watched_counts ,
330356 serializer,
331357 ) ?,
332- statistics : Map :: < UserStatisticsRkyv > :: serialize_with ( & user. statistics , serializer) ?,
358+ statistics : MapNiche :: < UserStatisticsRkyv , NaN > :: serialize_with (
359+ & user. statistics ,
360+ serializer,
361+ ) ?,
333362 medals : MapUnwrapOrDefault :: < MedalCompactRkyv > :: serialize_with (
334363 & user. medals ,
335364 serializer,
@@ -338,7 +367,7 @@ impl<S: Fallible<Error: Source> + Writer + Allocator + ?Sized> SerializeWith<Use
338367 & user. daily_challenge_stats ,
339368 serializer,
340369 ) ?,
341- team : Map :: < TeamRkyv > :: serialize_with ( & user. team , serializer) ?,
370+ team : MapNiche :: < TeamRkyv , TeamRkyv > :: serialize_with ( & user. team , serializer) ?,
342371 } )
343372 }
344373}
@@ -381,7 +410,7 @@ impl From<UserExtended> for User {
381410#[ rkyv( remote = UserHighestRank , archived = ArchivedUserHighestRank , derive( Clone ) ) ]
382411pub struct UserHighestRankRkyv {
383412 pub rank : u32 ,
384- #[ rkyv( with = DateTimeRkyv ) ]
413+ #[ rkyv( with = DateTimeRkyv , niche = DateTimeRkyv ) ]
385414 pub updated_at : OffsetDateTime ,
386415}
387416
@@ -430,6 +459,7 @@ pub struct UserStatisticsRkyv {
430459 pub grade_counts : GradeCounts ,
431460 #[ rkyv( with = UserLevelRkyv ) ]
432461 pub level : UserLevel ,
462+ #[ rkyv( niche = NaN ) ]
433463 pub accuracy : f32 ,
434464 pub country_rank : u32 ,
435465 pub global_rank : u32 ,
0 commit comments