prefixload 0.7.0

S3 cli backuper
Documentation
use crate::clients::s3::S3Client;
use crate::config::{Config, config_path};
use crate::error::Result;
use dialoguer::{Input, Password};

fn input_credentials() -> Result<(String, String)> {
    let access: String = Input::new()
        .with_prompt("AWS Access Key ID")
        .interact_text()?;

    let secret = Password::new()
        .with_prompt("AWS Secret Access Key")
        .interact()?;

    Ok((access, secret))
}

fn store_credentials(access_key: &str, secret_key: &str) -> Result<()> {
    println!(
        "Storing:\n  access = {}\n  secret = {}",
        access_key, secret_key
    );
    Ok(())
}

pub async fn run() -> Result<String> {
    let (access, secret) = input_credentials()?;

    let s3_config: Config = Config::load(&config_path())?;

    let s3_client = S3Client::new(&access, &secret, None, Some(&s3_config.endpoint)).await?;
    let ok = s3_client.check_bucket_access(&s3_config.bucket).await?;

    if ok {
        store_credentials(&access, &secret)?;
        return Ok("Credentials stored successfully".to_string());
    }

    Ok("Credentials not stored".to_string())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn store_credentials_always_succeeds() {
        let result = store_credentials("AKCCESSKEYEXAMPLE123", "SECRETKEYEXAMPLE123");
        assert!(result.is_ok(), "store_credentials() should return Ok(())");
    }
}