use leo_errors::{PackageError, Result};
use leo_retriever::NetworkName;
use snarkvm::console::account::PrivateKey;
use snarkvm::prelude::{MainnetV0, Network, TestnetV0};
use serde::Deserialize;
use std::{borrow::Cow, fmt, fs::File, io::Write, path::Path};
pub static ENV_FILENAME: &str = ".env";
#[derive(Deserialize)]
pub struct Env<N: Network> {
#[serde(bound(deserialize = ""))]
private_key: PrivateKey<N>,
endpoint: String,
}
impl<N: Network> Env<N> {
pub fn new(private_key: Option<PrivateKey<N>>, endpoint: String) -> Result<Self> {
let rng = &mut rand::thread_rng();
let private_key = match private_key {
Some(private_key) => private_key,
None => PrivateKey::<N>::new(rng)?,
};
Ok(Self { private_key, endpoint })
}
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.to_string().as_bytes()).map_err(PackageError::io_error_env_file)?;
Ok(())
}
}
impl<N: Network> fmt::Display for Env<N> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let network = match N::ID {
MainnetV0::ID => NetworkName::MainnetV0,
TestnetV0::ID => NetworkName::TestnetV0,
_ => unimplemented!("Unsupported network"),
};
write!(f, "NETWORK={network}\nPRIVATE_KEY={}\nENDPOINT={}\n", self.private_key, self.endpoint)
}
}