Skip to main content

fn0_deploy/
credentials.rs

1use anyhow::{Result, anyhow};
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4
5const DEFAULT_CONTROL_URL: &str = "https://fn0-control.fn0.dev";
6
7#[derive(Debug, Serialize, Deserialize)]
8pub struct Credentials {
9    pub token: String,
10    pub control_url: String,
11}
12
13pub fn path() -> Result<PathBuf> {
14    let dir = dirs::config_dir().ok_or_else(|| anyhow!("could not locate user config dir"))?;
15    Ok(dir.join("fn0").join("credentials"))
16}
17
18pub fn load() -> Result<Option<Credentials>> {
19    let p = path()?;
20    if !p.exists() {
21        return Ok(None);
22    }
23    let content = std::fs::read_to_string(&p)?;
24    let creds: Credentials = toml::from_str(&content)?;
25    Ok(Some(creds))
26}
27
28pub fn require() -> Result<Credentials> {
29    load()?.ok_or_else(|| {
30        anyhow!(
31            "not signed in. Run `fn0 login` first (credentials would be at {}).",
32            path().map(|p| p.display().to_string()).unwrap_or_default()
33        )
34    })
35}
36
37pub fn default_control_url() -> String {
38    std::env::var("FN0_CONTROL_URL").unwrap_or_else(|_| DEFAULT_CONTROL_URL.to_string())
39}