cherrygh 0.1.0

Library to make use of `gh` CLI nicely
Documentation
pub mod pr {
    use std::process::{Command, Stdio};

    pub struct Pr {
        pub target_branch: String,
        pub reviewers: Vec<String>,
        pub is_draft: bool,
    }

    impl Pr {
        pub fn create(self) -> Result<Self, std::io::Error> {
            let mut cmd = Command::new("gh");
            let cmd = cmd.stdin(Stdio::inherit()).stdout(Stdio::inherit());
            let cmd = cmd
                .args(["pr", "create"])
                .args(["--base", self.target_branch.as_str()])
                .args(["--assignee", "@me"]);

            if self.is_draft {
                cmd.arg("--draft");
            }

            if !self.reviewers.is_empty() {
                cmd.args(["--reviewer", &self.reviewers.join(",")]);
            }

            cmd.status()?;

            Ok(self)
        }

        pub fn open(self) -> Result<Self, std::io::Error> {
            let mut cmd = Command::new("gh");
            let cmd = cmd.args(["pr", "view", "-w"]);

            cmd.status()?;

            Ok(self)
        }
    }
}

pub mod profile {
    use std::{
        env,
        fs::OpenOptions,
        io::Write,
        path::PathBuf,
        process::Command,
    };

    pub fn switch() -> anyhow::Result<()> {
        Command::new("gh").args(["auth", "switch"]).output()?;

        let home_dir = env::var("HOME").expect("HOME directory doesn't exist");
        let cache_target_path = PathBuf::from(format!("{}/.local/share/gh_profile.txt", home_dir));

        let mut file = OpenOptions::new()
            .write(true)
            .create(true)
            .open(cache_target_path)?;

        let output = Command::new("gh").args(["auth", "status"]).output()?;

        if !output.status.success() {
            return Err(anyhow::anyhow!(
                "Couldn't run the github auth status command"
            ));
        }

        let output = String::from_utf8_lossy(&output.stdout).to_string();

        write!(file, "{}", output)?;

        Ok(())
    }
}