1+ use octocrab:: models:: { repos:: Release , Repository } ;
2+
13use crate :: {
24 config:: structs:: { Mod , ModIdentifier , ModIdentifierRef , Profile } ,
35 upgrade:: mod_downloadable,
46} ;
57
8+ fn project_exist ( profile : & Profile , repo : & Repository , repo_name : & ( String , String ) ) -> bool {
9+ profile. mods . iter ( ) . any ( |mod_| {
10+ mod_. name . to_lowercase ( ) == repo. name . to_lowercase ( )
11+ || ModIdentifierRef :: GitHubRepository ( & repo_name) == mod_. identifier . as_ref ( )
12+ } )
13+ }
14+
15+ fn contains_jar_asset ( releases : & [ Release ] ) -> bool {
16+ releases
17+ . iter ( )
18+ . flat_map ( |r| & r. assets )
19+ . any ( |a| a. name . ends_with ( ".jar" ) )
20+ }
21+
22+ async fn is_project_compatible (
23+ profile : & Profile ,
24+ releases : & [ Release ] ,
25+ check_game_version : bool ,
26+ ) -> super :: Result < bool > {
27+ Ok ( mod_downloadable:: get_latest_compatible_asset (
28+ & releases,
29+ profile. get_version ( check_game_version) ,
30+ profile. get_loader ( check_game_version) ,
31+ )
32+ . is_some ( ) )
33+ }
34+
635/// Check if the repo of `repo_handler` exists, releases mods, and is compatible with `profile`.
736/// If so, add it to the `profile`.
837///
@@ -15,35 +44,31 @@ pub async fn github(
1544 check_mod_loader : bool ,
1645) -> super :: Result < String > {
1746 let repo = repo_handler. get ( ) . await ?;
18- let repo_name = ( repo. owner . clone ( ) . unwrap ( ) . login , repo. name . clone ( ) ) ;
47+ let repo_name = (
48+ repo. owner
49+ . clone ( )
50+ . expect ( "Owner name not found in git repo" )
51+ . login ,
52+ repo. name . clone ( ) ,
53+ ) ;
1954
2055 // Check if project has already been added
21- if profile. mods . iter ( ) . any ( |mod_| {
22- mod_. name . to_lowercase ( ) == repo. name . to_lowercase ( )
23- || ModIdentifierRef :: GitHubRepository ( & repo_name) == mod_. identifier . as_ref ( )
24- } ) {
56+ if project_exist ( profile, & repo, & repo_name) {
2557 return Err ( super :: Error :: AlreadyAdded ) ;
2658 }
2759
2860 if perform_checks {
2961 let releases = repo_handler. releases ( ) . list ( ) . send ( ) . await ?. items ;
3062
3163 // Check if jar files are released
32- if !releases
33- . iter ( )
34- . flat_map ( |r| & r. assets )
35- . any ( |a| a. name . ends_with ( ".jar" ) )
36- {
64+ if !contains_jar_asset ( & releases) {
3765 return Err ( super :: Error :: NotAMod ) ;
3866 }
3967
4068 // Check if the repo is compatible
41- mod_downloadable:: get_latest_compatible_asset (
42- & releases,
43- profile. get_version ( check_game_version) ,
44- profile. get_loader ( check_game_version) ,
45- )
46- . ok_or ( super :: Error :: Incompatible ) ?;
69+ if !is_project_compatible ( profile, & releases, check_game_version) . await ? {
70+ return Err ( super :: Error :: Incompatible ) ;
71+ }
4772 }
4873
4974 // Add it to the profile
0 commit comments