use crate::{Expression, Node, NodeID, Path, simple_node_impl};
use leo_span::{Span, Symbol};
use snarkvm::{console::program::Identifier as IdentifierCore, prelude::Network};
use std::{
fmt,
hash::{Hash, Hasher},
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Default, Serialize, Deserialize)]
pub struct Identifier {
pub name: Symbol,
pub span: Span,
pub id: NodeID,
}
simple_node_impl!(Identifier);
impl Identifier {
pub fn new(name: Symbol, id: NodeID) -> Self {
Self { name, span: Span::default(), id }
}
pub fn matches(&self, other: &Self) -> bool {
self.name == other.name
}
}
impl fmt::Display for Identifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.name.fmt(f)
}
}
impl fmt::Debug for Identifier {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.name.fmt(f)
}
}
impl PartialEq for Identifier {
fn eq(&self, other: &Self) -> bool {
self.name == other.name && self.span == other.span
}
}
impl Eq for Identifier {}
impl Hash for Identifier {
fn hash<H: Hasher>(&self, state: &mut H) {
self.name.hash(state);
self.span.hash(state);
}
}
impl<N: Network> From<&IdentifierCore<N>> for Identifier {
fn from(id: &IdentifierCore<N>) -> Self {
Self { name: Symbol::intern(&id.to_string()), span: Default::default(), id: Default::default() }
}
}
impl From<Identifier> for Expression {
fn from(value: Identifier) -> Self {
Expression::Path(crate::Path::from(value))
}
}
impl From<Identifier> for Path {
fn from(value: Identifier) -> Self {
Path::new(None, vec![], value, value.span, value.id)
}
}