args-cli 0.1.1

Command-line interface for args
Documentation
use crate::{
    client::ArgsClient,
    config::UserConfig,
    client::GitClient,
    client::GitCredentialClient,
    util::review::{get_remote_owner_repo, push_for_review},
};

pub async fn create_review(
    config: UserConfig,
    git: &GitClient,
    message: Option<String>,
) -> anyhow::Result<()> {
    let default_branch = git.default_branch().await?;
    git.pull_rebase(&default_branch).await?;
    let result = push_for_review(git, &default_branch, None).await?;

    match result {
        Some(n) => {
            let (owner, repo) = get_remote_owner_repo(git).await?;

            if let Some(msg) = message {
                let (title, description) = parse_message(&msg);
                let token = GitCredentialClient::get(&config.args_server_url, &config.user_name)?;
                let client = ArgsClient::from_user_config(&config).with_token(token);
                client
                    .update_review(
                        &owner,
                        &repo,
                        n,
                        Some(title),
                        if description.is_empty() {
                            None
                        } else {
                            Some(description)
                        },
                    )
                    .await?;
            }

            let url = format!(
                "{}/{}/{}/reviews/{}",
                config.args_web_url.trim_end_matches('/'),
                owner,
                repo,
                n
            );
            println!("Review created: {}", url);
        }
        None => println!("Review created"),
    }

    Ok(())
}

fn parse_message(message: &str) -> (String, String) {
    let message = message.replace("\\n", "\n");
    match message.splitn(2, '\n').collect::<Vec<_>>().as_slice() {
        [title] => (title.trim().to_string(), String::new()),
        [title, rest] => (title.trim().to_string(), rest.trim().to_string()),
        _ => (String::new(), String::new()),
    }
}