1+ use std:: cell:: Cell ;
2+
13use crate :: config:: structs:: Profile ;
24use reqwest:: StatusCode ;
35
@@ -31,6 +33,88 @@ pub enum Error {
3133
3234pub type Result < T > = std:: result:: Result < T , Error > ;
3335
36+ /// Single sturct to condense check flags for game version, mod loader and to-check
37+ /// Saves space, reduce complexity in fn args and is fast
38+ ///
39+ /// Bit mappings (LTR: [7,6,5,4,3,2,1,0]):
40+ /// 0: flag for "perform checks"
41+ /// 1: flag for "game version"
42+ /// 2: flag for "mod loader"
43+ #[ derive( Default ) ]
44+ pub struct Checks ( Cell < u8 > ) ;
45+
46+ impl Checks {
47+ /// Generates new [Checks] will all values set to [true]
48+ pub fn new_all_set ( ) -> Self {
49+ Self ( Cell :: new ( 0b00000111 ) )
50+ }
51+
52+ /// Generates [Checks] from given predicate
53+ pub fn from ( checks : bool , game_version : bool , mod_loader : bool ) -> Self {
54+ let ret = Self :: default ( ) ;
55+ if checks {
56+ ret. set_perform_check ( ) ;
57+ }
58+ if game_version {
59+ ret. set_game_version ( ) ;
60+ }
61+ if mod_loader {
62+ ret. set_mod_loader ( ) ;
63+ }
64+ ret
65+ }
66+
67+ /// Set "perform_checks" bit to true
68+ pub fn set_perform_check ( & self ) {
69+ self . 0 . set ( self . 0 . get ( ) | 1 << 0 ) ;
70+ }
71+
72+ /// Set "game_version" bit to true
73+ pub fn set_game_version ( & self ) {
74+ self . 0 . set ( self . 0 . get ( ) | 1 << 1 ) ;
75+ }
76+
77+ /// Set "mod_loader" bit to true
78+ pub fn set_mod_loader ( & self ) {
79+ self . 0 . set ( self . 0 . get ( ) | 1 << 2 ) ;
80+ }
81+
82+ /// Set "perform_checks" bit to false
83+ pub fn unset_perform_check ( & self ) {
84+ self . 0 . set ( self . 0 . get ( ) & 1 << 0 ) ;
85+ }
86+
87+ /// Set "game_version" bit to false
88+ pub fn unset_game_version ( & self ) {
89+ self . 0 . set ( self . 0 . get ( ) & 1 << 1 ) ;
90+ }
91+
92+ /// Set "mod_loader" bit to true
93+ pub fn unset_mod_loader ( & self ) {
94+ self . 0 . set ( self . 0 . get ( ) & 1 << 2 ) ;
95+ }
96+
97+ /// Return "perform_checks" bit status
98+ pub fn perform_checks ( & self ) -> bool {
99+ self . 0 . get ( ) & 1 != 0
100+ }
101+
102+ /// Return "game_version" bit status
103+ pub fn game_version ( & self ) -> bool {
104+ self . 0 . get ( ) & ( 1 << 1 ) != 0
105+ }
106+
107+ /// Return "mod_loader" bit status
108+ pub fn mod_loader ( & self ) -> bool {
109+ self . 0 . get ( ) & ( 1 << 2 ) != 0
110+ }
111+
112+ /// Reset all bits to 0 (all flags to false)
113+ pub fn reset ( & self ) {
114+ self . 0 . set ( 0 ) ;
115+ }
116+ }
117+
34118impl From < furse:: Error > for Error {
35119 fn from ( err : furse:: Error ) -> Self {
36120 if let furse:: Error :: ReqwestError ( source) = & err {
@@ -87,9 +171,7 @@ pub async fn add_multiple(
87171 github,
88172 profile,
89173 & identifier,
90- true ,
91- true ,
92- true ,
174+ & Checks :: new_all_set ( ) ,
93175 )
94176 . await
95177 {
@@ -107,47 +189,63 @@ pub async fn add_multiple(
107189 ( success_names, failures)
108190}
109191
110- #[ allow( clippy:: too_many_arguments) ]
111192pub async fn add_single (
112193 modrinth : & ferinth:: Ferinth ,
113194 curseforge : & furse:: Furse ,
114195 github : & octocrab:: Octocrab ,
115196 profile : & mut Profile ,
116197 identifier : & str ,
117- perform_checks : bool ,
118- check_game_version : bool ,
119- check_mod_loader : bool ,
198+ checks : & Checks ,
120199) -> Result < String > {
121200 if let Ok ( project_id) = identifier. parse ( ) {
122- curseforge:: curseforge (
123- curseforge,
124- project_id,
125- profile,
126- perform_checks,
127- check_game_version,
128- check_mod_loader,
129- )
130- . await
201+ curseforge:: curseforge ( curseforge, project_id, profile, checks) . await
131202 } else if identifier. matches ( '/' ) . count ( ) == 1 {
132203 let split = identifier. split ( '/' ) . collect :: < Vec < _ > > ( ) ;
133204 github:: github (
134205 & github. repos ( split[ 0 ] , split[ 1 ] ) ,
135206 profile,
136- perform_checks,
137- check_game_version,
138- check_mod_loader,
207+ checks. perform_checks ( ) ,
208+ checks,
139209 )
140210 . await
141211 } else {
142- modrinth:: modrinth (
143- modrinth,
144- identifier,
145- profile,
146- perform_checks,
147- check_game_version,
148- check_mod_loader,
149- )
150- . await
151- . map ( |o| o. 0 )
212+ modrinth:: modrinth ( modrinth, identifier, profile, checks)
213+ . await
214+ . map ( |o| o. 0 )
215+ }
216+ }
217+
218+ #[ cfg( test) ]
219+ mod test {
220+ use super :: Checks ;
221+
222+ #[ test]
223+ fn check_bit_set_unset ( ) {
224+ let check = Checks :: default ( ) ;
225+
226+ // seting bits
227+ check. set_perform_check ( ) ;
228+ check. set_mod_loader ( ) ;
229+ check. set_game_version ( ) ;
230+
231+ assert ! ( check. perform_checks( ) && check. game_version( ) && check. mod_loader( ) ) ;
232+
233+ // Unset after set
234+ check. unset_perform_check ( ) ;
235+ check. unset_mod_loader ( ) ;
236+ check. unset_game_version ( ) ;
237+
238+ assert ! ( !( check. perform_checks( ) && check. game_version( ) && check. mod_loader( ) ) ) ;
239+
240+ // Unset after Unset
241+ check. unset_mod_loader ( ) ;
242+
243+ assert ! ( !check. mod_loader( ) ) ;
244+
245+ // set after set
246+ check. set_game_version ( ) ;
247+ check. set_game_version ( ) ;
248+
249+ assert ! ( check. game_version( ) ) ;
152250 }
153251}
0 commit comments