use crate::{ error::{PakkerError, Result}, model::{PakkerCredentialsFile, set_keyring_secret}, }; pub fn execute( curseforge_api_key: Option, modrinth_token: Option, github_access_token: Option, ) -> Result<()> { let mut creds = PakkerCredentialsFile::load()?; let mut updated_any = false; if let Some(key) = curseforge_api_key { let key = key.trim().to_string(); if key.is_empty() { return Err(PakkerError::InternalError( "CurseForge API key cannot be empty".to_string(), )); } println!("Setting CurseForge API key..."); set_keyring_secret("curseforge_api_key", &key)?; creds.curseforge_api_key = Some(key); updated_any = true; } if let Some(token) = modrinth_token { let token = token.trim().to_string(); if token.is_empty() { return Err(PakkerError::InternalError( "Modrinth token cannot be empty".to_string(), )); } println!("Setting Modrinth token..."); set_keyring_secret("modrinth_token", &token)?; creds.modrinth_token = Some(token); updated_any = true; } if let Some(token) = github_access_token { let token = token.trim().to_string(); if token.is_empty() { return Err(PakkerError::InternalError( "GitHub access token cannot be empty".to_string(), )); } println!("Setting GitHub access token..."); set_keyring_secret("github_access_token", &token)?; creds.github_access_token = Some(token); updated_any = true; } if !updated_any { println!( "No credentials provided. Use --cf-api-key, --modrinth-token, or \ --gh-access-token." ); return Ok(()); } creds.save()?; println!("Credentials saved."); println!( "Credentials file: {}", PakkerCredentialsFile::get_path()?.display() ); println!("Keyring service: pakker"); Ok(()) }