ffrelay 0.0.4

Command-line interface for Firefox Relay email forwarding service
Documentation
use std::{fs, io::Write, path::PathBuf};

use anyhow::{Result, anyhow, bail};
use serde::{Deserialize, Serialize};

const FF_CONFIG_DIR: &str = env!("CARGO_PKG_NAME");

#[derive(Serialize, Deserialize)]
struct TokenFile {
    token: String,
}

fn get_token_file() -> Result<PathBuf> {
    let config_dir = dirs::cache_dir().ok_or_else(|| anyhow!("unable to find cache dir"))?;

    let config_dir = config_dir.join(FF_CONFIG_DIR);

    if !config_dir.exists() {
        fs::create_dir_all(&config_dir)?;
    }

    Ok(config_dir.join("token.json"))
}

pub fn save_token<T>(token: T) -> Result<()>
where
    T: Into<String>,
{
    let config_file = get_token_file()?;

    let data = TokenFile {
        token: token.into(),
    };

    let token_data = serde_json::to_string_pretty(&data)?;

    let mut f = fs::OpenOptions::new()
        .create(true)
        .write(true)
        .truncate(true)
        .open(config_file)?;

    f.write_all(token_data.as_bytes())?;

    Ok(())
}

pub fn find_token() -> Result<String> {
    let config_file = get_token_file()?;

    if !config_file.exists() {
        bail!("{} doesn't exist", config_file.display())
    }

    let file_data = fs::read_to_string(&config_file)?;

    let data: TokenFile = serde_json::from_str(&file_data)?;

    Ok(data.token)
}