use leo_errors::{PackageError, Result};
use snarkvm_console::{account::PrivateKey, prelude::Network};
use serde::Deserialize;
use std::{borrow::Cow, fs::File, io::Write, marker::PhantomData, path::Path};
pub static ENV_FILENAME: &str = ".env";
#[derive(Deserialize, Default)]
pub struct Env<N: Network> {
data: String,
_phantom: PhantomData<N>,
}
impl<N: Network> Env<N> {
pub fn new() -> Result<Self> {
Ok(Self { data: Self::template()?, _phantom: PhantomData })
}
pub fn from(data: String) -> Self {
Self { data, _phantom: PhantomData }
}
pub fn exists_at(path: &Path) -> bool {
let mut path = Cow::from(path);
if path.is_dir() {
path.to_mut().push(ENV_FILENAME);
}
path.exists()
}
pub fn write_to(self, path: &Path) -> Result<()> {
let mut path = Cow::from(path);
if path.is_dir() {
path.to_mut().push(ENV_FILENAME);
}
let mut file = File::create(&path).map_err(PackageError::io_error_env_file)?;
file.write_all(self.data.as_bytes()).map_err(PackageError::io_error_env_file)?;
Ok(())
}
fn template() -> Result<String> {
let rng = &mut rand::thread_rng();
let private_key = PrivateKey::<N>::new(rng)?;
Ok(format!("NETWORK=testnet3\nPRIVATE_KEY={private_key}\n"))
}
}