use serde::{Deserialize, Serialize};
use std::borrow::Borrow;
use std::fmt;
use std::ops::Deref;
use std::path::Path;
macro_rules! define_newtype_string {
($name:ident, $doc:expr) => {
#[doc = $doc]
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
#[cfg_attr(feature = "flow", derive(flowjs_rs::Flow))]
#[cfg_attr(feature = "ts", ts(export))]
#[cfg_attr(feature = "flow", flow(export))]
#[serde(transparent)]
pub struct $name(String);
impl Deref for $name {
type Target = str;
#[inline]
fn deref(&self) -> &str {
&self.0
}
}
impl AsRef<str> for $name {
#[inline]
fn as_ref(&self) -> &str {
&self.0
}
}
impl Borrow<str> for $name {
#[inline]
fn borrow(&self) -> &str {
&self.0
}
}
impl fmt::Display for $name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.0)
}
}
impl From<String> for $name {
#[inline]
fn from(s: String) -> Self {
Self(s)
}
}
impl From<&str> for $name {
#[inline]
fn from(s: &str) -> Self {
Self(s.to_owned())
}
}
impl PartialEq<str> for $name {
#[inline]
fn eq(&self, other: &str) -> bool {
self.0 == other
}
}
impl PartialEq<&str> for $name {
#[inline]
fn eq(&self, other: &&str) -> bool {
self.0 == *other
}
}
impl PartialEq<String> for $name {
#[inline]
fn eq(&self, other: &String) -> bool {
self.0 == *other
}
}
};
}
define_newtype_string!(NodeKind, "tree-sitter AST node kind identifier.");
define_newtype_string!(RelativePath, "Source file path relative to project root.");
impl AsRef<Path> for RelativePath {
#[inline]
fn as_ref(&self) -> &Path {
Path::new(&self.0)
}
}