use crate::prelude::*;
use core::ops::Deref;
use serde::{Deserialize, Serialize};
pub(crate) const MAGIC_FLOW_SEQ: &str = "__noya_flow_seq";
pub(crate) const MAGIC_FLOW_MAP: &str = "__noya_flow_map";
pub(crate) const MAGIC_LIT_STR: &str = "__noya_lit_str";
pub(crate) const MAGIC_FOLD_STR: &str = "__noya_fold_str";
pub(crate) const MAGIC_COMMENTED: &str = "__noya_commented";
pub(crate) const MAGIC_SPACE_AFTER: &str = "__noya_space_after";
pub(crate) const MAGIC_ANCHOR_DEF: &str = "__noya_anchor_def";
pub(crate) const MAGIC_ANCHOR_REF: &str = "__noya_anchor_ref";
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct FlowSeq<T>(pub T);
impl<T: fmt::Debug> fmt::Debug for FlowSeq<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("FlowSeq").field(&self.0).finish()
}
}
impl<T> Deref for FlowSeq<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> From<T> for FlowSeq<T> {
fn from(v: T) -> Self {
Self(v)
}
}
impl<T> FlowSeq<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<T: Serialize> Serialize for FlowSeq<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_FLOW_SEQ, &self.0)
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for FlowSeq<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
T::deserialize(deserializer).map(FlowSeq)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct FlowMap<T>(pub T);
impl<T: fmt::Debug> fmt::Debug for FlowMap<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("FlowMap").field(&self.0).finish()
}
}
impl<T> Deref for FlowMap<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> From<T> for FlowMap<T> {
fn from(v: T) -> Self {
Self(v)
}
}
impl<T> FlowMap<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<T: Serialize> Serialize for FlowMap<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_FLOW_MAP, &self.0)
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for FlowMap<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
T::deserialize(deserializer).map(FlowMap)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct LitStr<'a>(pub &'a str);
impl fmt::Debug for LitStr<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("LitStr").field(&self.0).finish()
}
}
impl Deref for LitStr<'_> {
type Target = str;
fn deref(&self) -> &str {
self.0
}
}
impl<'a> From<&'a str> for LitStr<'a> {
fn from(v: &'a str) -> Self {
Self(v)
}
}
impl<'a> LitStr<'a> {
pub fn as_str(&self) -> &str {
self.0
}
pub fn into_inner(self) -> &'a str {
self.0
}
}
impl Serialize for LitStr<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_LIT_STR, self.0)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct LitString(pub String);
impl fmt::Debug for LitString {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("LitString").field(&self.0).finish()
}
}
impl Deref for LitString {
type Target = str;
fn deref(&self) -> &str {
&self.0
}
}
impl From<String> for LitString {
fn from(v: String) -> Self {
Self(v)
}
}
impl From<&str> for LitString {
fn from(v: &str) -> Self {
Self(v.to_owned())
}
}
impl LitString {
pub fn into_inner(self) -> String {
self.0
}
}
impl Serialize for LitString {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_LIT_STR, &self.0)
}
}
impl<'de> Deserialize<'de> for LitString {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
String::deserialize(deserializer).map(LitString)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct FoldStr<'a>(pub &'a str);
impl fmt::Debug for FoldStr<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("FoldStr").field(&self.0).finish()
}
}
impl Deref for FoldStr<'_> {
type Target = str;
fn deref(&self) -> &str {
self.0
}
}
impl<'a> From<&'a str> for FoldStr<'a> {
fn from(v: &'a str) -> Self {
Self(v)
}
}
impl<'a> FoldStr<'a> {
pub fn as_str(&self) -> &str {
self.0
}
pub fn into_inner(self) -> &'a str {
self.0
}
}
impl Serialize for FoldStr<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_FOLD_STR, self.0)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct FoldString(pub String);
impl fmt::Debug for FoldString {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("FoldString").field(&self.0).finish()
}
}
impl Deref for FoldString {
type Target = str;
fn deref(&self) -> &str {
&self.0
}
}
impl From<String> for FoldString {
fn from(v: String) -> Self {
Self(v)
}
}
impl From<&str> for FoldString {
fn from(v: &str) -> Self {
Self(v.to_owned())
}
}
impl FoldString {
pub fn into_inner(self) -> String {
self.0
}
}
impl Serialize for FoldString {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_FOLD_STR, &self.0)
}
}
impl<'de> Deserialize<'de> for FoldString {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
String::deserialize(deserializer).map(FoldString)
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Commented<T> {
pub value: T,
pub comment: String,
}
impl<T: fmt::Debug> fmt::Debug for Commented<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Commented")
.field("value", &self.value)
.field("comment", &self.comment)
.finish()
}
}
impl<T> Commented<T> {
pub fn new(value: T, comment: impl Into<String>) -> Self {
Self {
value,
comment: comment.into(),
}
}
pub fn into_inner(self) -> T {
self.value
}
}
impl<T> Deref for Commented<T> {
type Target = T;
fn deref(&self) -> &T {
&self.value
}
}
impl<T: Serialize> Serialize for Commented<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeTuple;
struct Inner<'a, T>(&'a T, &'a str);
impl<T: Serialize> Serialize for Inner<'_, T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let mut tup = serializer.serialize_tuple(2)?;
tup.serialize_element(self.0)?;
tup.serialize_element(self.1)?;
tup.end()
}
}
serializer.serialize_newtype_struct(MAGIC_COMMENTED, &Inner(&self.value, &self.comment))
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Commented<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
T::deserialize(deserializer).map(|v| Commented {
value: v,
comment: String::new(),
})
}
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct SpaceAfter<T>(pub T);
impl<T: fmt::Debug> fmt::Debug for SpaceAfter<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("SpaceAfter").field(&self.0).finish()
}
}
impl<T> Deref for SpaceAfter<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> From<T> for SpaceAfter<T> {
fn from(v: T) -> Self {
Self(v)
}
}
impl<T> SpaceAfter<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<T: Serialize> Serialize for SpaceAfter<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_newtype_struct(MAGIC_SPACE_AFTER, &self.0)
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for SpaceAfter<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
T::deserialize(deserializer).map(SpaceAfter)
}
}