use crate::output::path;
use crate::util;
use std::sync::Arc;
#[derive(Clone, Debug, Default)]
pub struct Identifier {
name: Option<String>,
anchor_path: Option<path::PathBuf>,
}
impl PartialEq for Identifier {
fn eq(&self, other: &Self) -> bool {
self.name == other.name
}
}
impl Eq for Identifier {}
impl std::hash::Hash for Identifier {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.name.hash(state);
}
}
impl std::fmt::Display for Identifier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(name) = &self.name {
write!(f, "{}", util::string::as_ident_or_string(name))
} else {
write!(f, "?")
}
}
}
impl From<String> for Identifier {
fn from(name: String) -> Self {
Identifier {
name: Some(name),
anchor_path: None,
}
}
}
impl From<&str> for Identifier {
fn from(name: &str) -> Self {
Identifier {
name: Some(name.to_string()),
anchor_path: None,
}
}
}
impl Identifier {
pub fn new<S: ToString>(
name: Option<S>,
anchor_path: Option<path::PathBuf>,
) -> Arc<Identifier> {
Arc::new(Identifier {
name: name.map(|x| x.to_string()),
anchor_path,
})
}
pub fn new_by_name<S: ToString>(name: S) -> Arc<Identifier> {
Arc::new(Identifier {
name: Some(name.to_string()),
anchor_path: None,
})
}
pub fn new_unknown() -> Arc<Identifier> {
Arc::default()
}
pub fn name(&self) -> Option<&str> {
self.name.as_ref().map(|s| &s[..])
}
pub fn anchor_path(&self) -> Option<&path::PathBuf> {
self.anchor_path.as_ref()
}
}
#[derive(Debug)]
pub struct Data<T> {
pub name: Arc<Identifier>,
pub uri: Arc<Identifier>,
pub definition: Option<Arc<T>>,
}
impl<T> Clone for Data<T> {
fn clone(&self) -> Self {
Self {
name: self.name.clone(),
uri: self.uri.clone(),
definition: self.definition.clone(),
}
}
}
impl<T> Default for Data<T> {
fn default() -> Self {
Self {
name: Default::default(),
uri: Default::default(),
definition: Default::default(),
}
}
}
impl<T> PartialEq for Data<T> {
fn eq(&self, other: &Self) -> bool {
self.name == other.name && self.uri == other.uri
}
}
impl<T> Eq for Data<T> {}
impl<T> std::hash::Hash for Data<T> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.name.hash(state);
self.uri.hash(state);
}
}
impl<T> std::fmt::Display for Data<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}::{}", self.uri, self.name)
}
}
impl<T> From<String> for Data<T> {
fn from(name: String) -> Self {
Data {
name: Arc::new(name.into()),
uri: Arc::default(),
definition: None,
}
}
}
impl<T> From<&str> for Data<T> {
fn from(name: &str) -> Self {
Data {
name: Arc::new(name.into()),
uri: Arc::default(),
definition: None,
}
}
}
pub type Reference<T> = Arc<Data<T>>;