1use std::env;
2use std::path::Path;
3
4use super::types::{AuthContext, BoxFuture};
5
6pub struct DefaultAuthContext;
8
9impl DefaultAuthContext {
10 pub fn new() -> Self {
11 Self
12 }
13}
14
15impl Default for DefaultAuthContext {
16 fn default() -> Self {
17 Self::new()
18 }
19}
20
21impl AuthContext for DefaultAuthContext {
22 fn env<'a>(&'a self, name: &'a str) -> BoxFuture<'a, Option<String>> {
23 Box::pin(async move { env::var(name).ok().filter(|v| !v.trim().is_empty()) })
24 }
25
26 fn file_exists<'a>(&'a self, path: &'a str) -> BoxFuture<'a, bool> {
27 let path = path.to_string();
28 Box::pin(async move {
29 let home = env::var_os("HOME").map(std::path::PathBuf::from);
30 let resolved = if let Some(rest) = path.strip_prefix("~/") {
31 home.map(|h| h.join(rest))
32 .unwrap_or_else(|| Path::new(&path).to_path_buf())
33 } else if path == "~" {
34 home.unwrap_or_else(|| Path::new(&path).to_path_buf())
35 } else {
36 Path::new(&path).to_path_buf()
37 };
38 resolved.exists()
39 })
40 }
41}
42
43pub fn default_auth_context() -> DefaultAuthContext {
44 DefaultAuthContext::new()
45}