1use leo_errors::{PackageError, Result};
19use leo_retriever::NetworkName;
20use snarkvm::console::account::PrivateKey;
21
22use snarkvm::prelude::{MainnetV0, Network, TestnetV0};
23
24use serde::Deserialize;
25use std::{borrow::Cow, fmt, fs::File, io::Write, path::Path};
26
27pub static ENV_FILENAME: &str = ".env";
28
29#[derive(Deserialize)]
30pub struct Env<N: Network> {
31 #[serde(bound(deserialize = ""))]
32 private_key: PrivateKey<N>,
33 endpoint: String,
34}
35
36impl<N: Network> Env<N> {
37 pub fn new(private_key: Option<PrivateKey<N>>, endpoint: String) -> Result<Self> {
38 let rng = &mut rand::thread_rng();
40
41 let private_key = match private_key {
43 Some(private_key) => private_key,
44 None => PrivateKey::<N>::new(rng)?,
45 };
46
47 Ok(Self { private_key, endpoint })
48 }
49
50 pub fn exists_at(path: &Path) -> bool {
51 let mut path = Cow::from(path);
52 if path.is_dir() {
53 path.to_mut().push(ENV_FILENAME);
54 }
55 path.exists()
56 }
57
58 pub fn write_to(self, path: &Path) -> Result<()> {
59 let mut path = Cow::from(path);
60 if path.is_dir() {
61 path.to_mut().push(ENV_FILENAME);
62 }
63
64 let mut file = File::create(&path).map_err(PackageError::io_error_env_file)?;
65 file.write_all(self.to_string().as_bytes()).map_err(PackageError::io_error_env_file)?;
66 Ok(())
67 }
68}
69
70impl<N: Network> fmt::Display for Env<N> {
71 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72 let network = match N::ID {
74 MainnetV0::ID => NetworkName::MainnetV0,
75 TestnetV0::ID => NetworkName::TestnetV0,
76 _ => unimplemented!("Unsupported network"),
77 };
78 write!(f, "NETWORK={network}\nPRIVATE_KEY={}\nENDPOINT={}\n", self.private_key, self.endpoint)
80 }
81}