1use crate::prelude::*;
24use core::ops::Deref;
25
26pub(crate) const MAGIC_FLOW_SEQ: &str = "__noya_flow_seq";
29pub(crate) const MAGIC_FLOW_MAP: &str = "__noya_flow_map";
30pub(crate) const MAGIC_LIT_STR: &str = "__noya_lit_str";
31pub(crate) const MAGIC_FOLD_STR: &str = "__noya_fold_str";
32pub(crate) const MAGIC_COMMENTED: &str = "__noya_commented";
33pub(crate) const MAGIC_SPACE_AFTER: &str = "__noya_space_after";
34pub(crate) const MAGIC_ANCHOR_DEF: &str = "__noya_anchor_def";
35pub(crate) const MAGIC_ANCHOR_REF: &str = "__noya_anchor_ref";
36pub(crate) const MAGIC_TAGGED: &str = "__noya_tagged";
43
44#[derive(Clone, PartialEq, Eq, Hash)]
56pub struct FlowSeq<T>(pub T);
57
58impl<T: fmt::Debug> fmt::Debug for FlowSeq<T> {
59 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
60 f.debug_tuple("FlowSeq").field(&self.0).finish()
61 }
62}
63
64impl<T> Deref for FlowSeq<T> {
65 type Target = T;
66 fn deref(&self) -> &T {
67 &self.0
68 }
69}
70
71impl<T> From<T> for FlowSeq<T> {
72 fn from(v: T) -> Self {
73 Self(v)
74 }
75}
76
77impl<T> FlowSeq<T> {
78 pub fn into_inner(self) -> T {
88 self.0
89 }
90}
91
92impl<T: serde_core::Serialize> serde_core::Serialize for FlowSeq<T> {
93 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
94 where
95 S: serde_core::Serializer,
96 {
97 serializer.serialize_newtype_struct(MAGIC_FLOW_SEQ, &self.0)
98 }
99}
100
101impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for FlowSeq<T> {
102 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
103 where
104 D: serde_core::Deserializer<'de>,
105 {
106 T::deserialize(deserializer).map(FlowSeq)
107 }
108}
109
110#[derive(Clone, PartialEq, Eq, Hash)]
125pub struct FlowMap<T>(pub T);
126
127impl<T: fmt::Debug> fmt::Debug for FlowMap<T> {
128 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
129 f.debug_tuple("FlowMap").field(&self.0).finish()
130 }
131}
132
133impl<T> Deref for FlowMap<T> {
134 type Target = T;
135 fn deref(&self) -> &T {
136 &self.0
137 }
138}
139
140impl<T> From<T> for FlowMap<T> {
141 fn from(v: T) -> Self {
142 Self(v)
143 }
144}
145
146impl<T> FlowMap<T> {
147 pub fn into_inner(self) -> T {
160 self.0
161 }
162}
163
164impl<T: serde_core::Serialize> serde_core::Serialize for FlowMap<T> {
165 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
166 where
167 S: serde_core::Serializer,
168 {
169 serializer.serialize_newtype_struct(MAGIC_FLOW_MAP, &self.0)
170 }
171}
172
173impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for FlowMap<T> {
174 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
175 where
176 D: serde_core::Deserializer<'de>,
177 {
178 T::deserialize(deserializer).map(FlowMap)
179 }
180}
181
182#[derive(Clone, PartialEq, Eq, Hash)]
192pub struct LitStr<'a>(pub &'a str);
193
194impl fmt::Debug for LitStr<'_> {
195 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
196 f.debug_tuple("LitStr").field(&self.0).finish()
197 }
198}
199
200impl Deref for LitStr<'_> {
201 type Target = str;
202 fn deref(&self) -> &str {
203 self.0
204 }
205}
206
207impl<'a> From<&'a str> for LitStr<'a> {
208 fn from(v: &'a str) -> Self {
209 Self(v)
210 }
211}
212
213impl<'a> LitStr<'a> {
214 #[must_use]
224 pub fn as_str(&self) -> &str {
225 self.0
226 }
227
228 #[must_use]
238 pub fn into_inner(self) -> &'a str {
239 self.0
240 }
241}
242
243impl serde_core::Serialize for LitStr<'_> {
244 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
245 where
246 S: serde_core::Serializer,
247 {
248 serializer.serialize_newtype_struct(MAGIC_LIT_STR, self.0)
249 }
250}
251
252#[derive(Clone, PartialEq, Eq, Hash)]
262pub struct LitString(pub String);
263
264impl fmt::Debug for LitString {
265 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
266 f.debug_tuple("LitString").field(&self.0).finish()
267 }
268}
269
270impl Deref for LitString {
271 type Target = str;
272 fn deref(&self) -> &str {
273 &self.0
274 }
275}
276
277impl From<String> for LitString {
278 fn from(v: String) -> Self {
279 Self(v)
280 }
281}
282
283impl From<&str> for LitString {
284 fn from(v: &str) -> Self {
285 Self(v.to_owned())
286 }
287}
288
289impl LitString {
290 #[must_use]
300 pub fn into_inner(self) -> String {
301 self.0
302 }
303}
304
305impl serde_core::Serialize for LitString {
306 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
307 where
308 S: serde_core::Serializer,
309 {
310 serializer.serialize_newtype_struct(MAGIC_LIT_STR, &self.0)
311 }
312}
313
314impl<'de> serde_core::Deserialize<'de> for LitString {
315 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
316 where
317 D: serde_core::Deserializer<'de>,
318 {
319 String::deserialize(deserializer).map(LitString)
320 }
321}
322
323#[derive(Clone, PartialEq, Eq, Hash)]
333pub struct FoldStr<'a>(pub &'a str);
334
335impl fmt::Debug for FoldStr<'_> {
336 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
337 f.debug_tuple("FoldStr").field(&self.0).finish()
338 }
339}
340
341impl Deref for FoldStr<'_> {
342 type Target = str;
343 fn deref(&self) -> &str {
344 self.0
345 }
346}
347
348impl<'a> From<&'a str> for FoldStr<'a> {
349 fn from(v: &'a str) -> Self {
350 Self(v)
351 }
352}
353
354impl<'a> FoldStr<'a> {
355 #[must_use]
364 pub fn as_str(&self) -> &str {
365 self.0
366 }
367
368 #[must_use]
377 pub fn into_inner(self) -> &'a str {
378 self.0
379 }
380}
381
382impl serde_core::Serialize for FoldStr<'_> {
383 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
384 where
385 S: serde_core::Serializer,
386 {
387 serializer.serialize_newtype_struct(MAGIC_FOLD_STR, self.0)
388 }
389}
390
391#[derive(Clone, PartialEq, Eq, Hash)]
401pub struct FoldString(pub String);
402
403impl fmt::Debug for FoldString {
404 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
405 f.debug_tuple("FoldString").field(&self.0).finish()
406 }
407}
408
409impl Deref for FoldString {
410 type Target = str;
411 fn deref(&self) -> &str {
412 &self.0
413 }
414}
415
416impl From<String> for FoldString {
417 fn from(v: String) -> Self {
418 Self(v)
419 }
420}
421
422impl From<&str> for FoldString {
423 fn from(v: &str) -> Self {
424 Self(v.to_owned())
425 }
426}
427
428impl FoldString {
429 #[must_use]
438 pub fn into_inner(self) -> String {
439 self.0
440 }
441}
442
443impl serde_core::Serialize for FoldString {
444 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
445 where
446 S: serde_core::Serializer,
447 {
448 serializer.serialize_newtype_struct(MAGIC_FOLD_STR, &self.0)
449 }
450}
451
452impl<'de> serde_core::Deserialize<'de> for FoldString {
453 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
454 where
455 D: serde_core::Deserializer<'de>,
456 {
457 String::deserialize(deserializer).map(FoldString)
458 }
459}
460
461#[derive(Clone, PartialEq, Eq, Hash)]
479pub struct Commented<T> {
480 pub value: T,
482 pub comment: String,
484}
485
486impl<T: fmt::Debug> fmt::Debug for Commented<T> {
487 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
488 f.debug_struct("Commented")
489 .field("value", &self.value)
490 .field("comment", &self.comment)
491 .finish()
492 }
493}
494
495impl<T> Commented<T> {
496 pub fn new(value: T, comment: impl Into<String>) -> Self {
507 Self {
508 value,
509 comment: comment.into(),
510 }
511 }
512
513 pub fn into_inner(self) -> T {
523 self.value
524 }
525}
526
527impl<T> Deref for Commented<T> {
528 type Target = T;
529 fn deref(&self) -> &T {
530 &self.value
531 }
532}
533
534impl<T: serde_core::Serialize> serde_core::Serialize for Commented<T> {
535 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
536 where
537 S: serde_core::Serializer,
538 {
539 use serde_core::ser::SerializeTuple as _;
540
541 struct Inner<'a, T>(&'a T, &'a str);
543
544 impl<T: serde_core::Serialize> serde_core::Serialize for Inner<'_, T> {
545 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
546 where
547 S: serde_core::Serializer,
548 {
549 let mut tup = serializer.serialize_tuple(2)?;
550 tup.serialize_element(self.0)?;
551 tup.serialize_element(self.1)?;
552 tup.end()
553 }
554 }
555
556 serializer.serialize_newtype_struct(MAGIC_COMMENTED, &Inner(&self.value, &self.comment))
557 }
558}
559
560impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for Commented<T> {
561 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
562 where
563 D: serde_core::Deserializer<'de>,
564 {
565 T::deserialize(deserializer).map(|v| Self {
568 value: v,
569 comment: String::new(),
570 })
571 }
572}
573
574#[derive(Clone, PartialEq, Eq, Hash)]
584pub struct SpaceAfter<T>(pub T);
585
586impl<T: fmt::Debug> fmt::Debug for SpaceAfter<T> {
587 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
588 f.debug_tuple("SpaceAfter").field(&self.0).finish()
589 }
590}
591
592impl<T> Deref for SpaceAfter<T> {
593 type Target = T;
594 fn deref(&self) -> &T {
595 &self.0
596 }
597}
598
599impl<T> From<T> for SpaceAfter<T> {
600 fn from(v: T) -> Self {
601 Self(v)
602 }
603}
604
605impl<T> SpaceAfter<T> {
606 pub fn into_inner(self) -> T {
615 self.0
616 }
617}
618
619impl<T: serde_core::Serialize> serde_core::Serialize for SpaceAfter<T> {
620 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
621 where
622 S: serde_core::Serializer,
623 {
624 serializer.serialize_newtype_struct(MAGIC_SPACE_AFTER, &self.0)
625 }
626}
627
628impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for SpaceAfter<T> {
629 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
630 where
631 D: serde_core::Deserializer<'de>,
632 {
633 T::deserialize(deserializer).map(SpaceAfter)
634 }
635}