fn0_deploy/
credentials.rs1use 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}