#![forbid(unsafe_code)]
use leo_errors::{PackageError, Result, UtilError};
use leo_span::Symbol;
use std::path::Path;
mod dependency;
pub use dependency::*;
mod env;
pub use env::*;
mod location;
pub use location::*;
mod manifest;
pub use manifest::*;
mod network_name;
pub use network_name::*;
mod package;
pub use package::*;
mod program;
pub use program::*;
pub const SOURCE_DIRECTORY: &str = "src";
pub const MAIN_FILENAME: &str = "main.leo";
pub const IMPORTS_DIRECTORY: &str = "build/imports";
pub const OUTPUTS_DIRECTORY: &str = "outputs";
pub const BUILD_DIRECTORY: &str = "build";
pub const TESTS_DIRECTORY: &str = "tests";
pub const TEST_PRIVATE_KEY: &str = "APrivateKey1zkp8CZNn3yeCseEtxuVPbDCwSyhGW6yZKUYKfgXmcpoGPWH";
fn symbol(name: &str) -> Result<Symbol> {
name.strip_suffix(".aleo").map(Symbol::intern).ok_or_else(|| PackageError::invalid_network_name(name).into())
}
pub fn is_valid_aleo_name(name: &str) -> bool {
let Some(rest) = name.strip_suffix(".aleo") else {
return false;
};
if rest.is_empty() {
tracing::error!("Aleo names must be nonempty");
return false;
}
let first = rest.chars().next().unwrap();
if first == '_' {
tracing::error!("Aleo names cannot begin with an underscore");
return false;
}
if first.is_numeric() {
tracing::error!("Aleo names cannot begin with a number");
return false;
}
if rest.chars().any(|c| !c.is_ascii_alphanumeric() && c != '_') {
tracing::error!("Aleo names must can only contain ASCII alphanumeric characters and underscores.");
return false;
}
true
}
pub fn fetch_from_network(url: &str) -> Result<String, UtilError> {
let response = ureq::AgentBuilder::new()
.redirects(0)
.build()
.get(url)
.set("X-Leo-Version", env!("CARGO_PKG_VERSION"))
.call()
.map_err(|err| UtilError::failed_to_retrieve_from_endpoint(err, Default::default()))?;
match response.status() {
200 => Ok(response.into_string().unwrap().replace("\\n", "\n").replace('\"', "")),
301 => Err(UtilError::endpoint_moved_error(url)),
_ => Err(UtilError::network_error(url, response.status(), Default::default())),
}
}
pub fn verify_valid_program(name: &str, program: &str) -> Result<(), UtilError> {
use snarkvm::prelude::{Program, TestnetV0};
use std::str::FromStr as _;
match Program::<TestnetV0>::from_str(program) {
Ok(_) => Ok(()),
Err(_) => Err(UtilError::snarkvm_parsing_error(name)),
}
}
pub fn filename_no_leo_extension(path: &Path) -> Option<&str> {
filename_no_extension(path, ".leo")
}
pub fn filename_no_aleo_extension(path: &Path) -> Option<&str> {
filename_no_extension(path, ".aleo")
}
fn filename_no_extension<'a>(path: &'a Path, extension: &'static str) -> Option<&'a str> {
path.file_name().and_then(|os_str| os_str.to_str()).and_then(|s| s.strip_suffix(extension))
}