use crate::ProgramId;
use itertools::Itertools;
use leo_span::{Symbol, sym};
use serde::{Deserialize, Serialize};
use snarkvm::prelude::{Locator, Network};
use std::fmt::Display;
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Location {
pub program: Symbol,
pub path: Vec<Symbol>,
}
impl Location {
pub fn new(program: Symbol, path: Vec<Symbol>) -> Location {
Location { program, path }
}
pub fn dynamic() -> Location {
Location { program: sym::__dynamic__, path: vec![sym::__dynamic__] }
}
pub fn is_dynamic(&self) -> bool {
self.program == sym::__dynamic__
}
}
impl Display for Location {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}/{}", self.program, self.path.iter().format("::"))
}
}
impl<N: Network> From<Locator<N>> for Location {
fn from(locator: Locator<N>) -> Self {
Location {
program: ProgramId::from(locator.program_id()).as_symbol(),
path: vec![Symbol::intern(&locator.resource().to_string())],
}
}
}