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 DIRECTIVES: [&str; 8] = [
40 MAGIC_FLOW_SEQ,
41 MAGIC_FLOW_MAP,
42 MAGIC_LIT_STR,
43 MAGIC_FOLD_STR,
44 MAGIC_COMMENTED,
45 MAGIC_SPACE_AFTER,
46 MAGIC_ANCHOR_DEF,
47 MAGIC_ANCHOR_REF,
48];
49pub(crate) const MAGIC_TAGGED: &str = "__noya_tagged";
56
57#[derive(Clone, PartialEq, Eq, Hash)]
69pub struct FlowSeq<T>(pub T);
70
71impl<T: fmt::Debug> fmt::Debug for FlowSeq<T> {
72 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
73 f.debug_tuple("FlowSeq").field(&self.0).finish()
74 }
75}
76
77impl<T> Deref for FlowSeq<T> {
78 type Target = T;
79 fn deref(&self) -> &T {
80 &self.0
81 }
82}
83
84impl<T> From<T> for FlowSeq<T> {
85 fn from(v: T) -> Self {
86 Self(v)
87 }
88}
89
90impl<T> FlowSeq<T> {
91 pub fn into_inner(self) -> T {
101 self.0
102 }
103}
104
105impl<T: serde_core::Serialize> serde_core::Serialize for FlowSeq<T> {
106 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
107 where
108 S: serde_core::Serializer,
109 {
110 serializer.serialize_newtype_struct(MAGIC_FLOW_SEQ, &self.0)
111 }
112}
113
114impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for FlowSeq<T> {
115 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
116 where
117 D: serde_core::Deserializer<'de>,
118 {
119 T::deserialize(deserializer).map(FlowSeq)
120 }
121}
122
123#[derive(Clone, PartialEq, Eq, Hash)]
138pub struct FlowMap<T>(pub T);
139
140impl<T: fmt::Debug> fmt::Debug for FlowMap<T> {
141 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142 f.debug_tuple("FlowMap").field(&self.0).finish()
143 }
144}
145
146impl<T> Deref for FlowMap<T> {
147 type Target = T;
148 fn deref(&self) -> &T {
149 &self.0
150 }
151}
152
153impl<T> From<T> for FlowMap<T> {
154 fn from(v: T) -> Self {
155 Self(v)
156 }
157}
158
159impl<T> FlowMap<T> {
160 pub fn into_inner(self) -> T {
173 self.0
174 }
175}
176
177impl<T: serde_core::Serialize> serde_core::Serialize for FlowMap<T> {
178 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
179 where
180 S: serde_core::Serializer,
181 {
182 serializer.serialize_newtype_struct(MAGIC_FLOW_MAP, &self.0)
183 }
184}
185
186impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for FlowMap<T> {
187 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
188 where
189 D: serde_core::Deserializer<'de>,
190 {
191 T::deserialize(deserializer).map(FlowMap)
192 }
193}
194
195#[derive(Clone, PartialEq, Eq, Hash)]
205pub struct LitStr<'a>(pub &'a str);
206
207impl fmt::Debug for LitStr<'_> {
208 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
209 f.debug_tuple("LitStr").field(&self.0).finish()
210 }
211}
212
213impl Deref for LitStr<'_> {
214 type Target = str;
215 fn deref(&self) -> &str {
216 self.0
217 }
218}
219
220impl<'a> From<&'a str> for LitStr<'a> {
221 fn from(v: &'a str) -> Self {
222 Self(v)
223 }
224}
225
226impl<'a> LitStr<'a> {
227 #[must_use]
237 pub fn as_str(&self) -> &str {
238 self.0
239 }
240
241 #[must_use]
251 pub fn into_inner(self) -> &'a str {
252 self.0
253 }
254}
255
256impl serde_core::Serialize for LitStr<'_> {
257 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
258 where
259 S: serde_core::Serializer,
260 {
261 serializer.serialize_newtype_struct(MAGIC_LIT_STR, self.0)
262 }
263}
264
265#[derive(Clone, PartialEq, Eq, Hash)]
275pub struct LitString(pub String);
276
277impl fmt::Debug for LitString {
278 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
279 f.debug_tuple("LitString").field(&self.0).finish()
280 }
281}
282
283impl Deref for LitString {
284 type Target = str;
285 fn deref(&self) -> &str {
286 &self.0
287 }
288}
289
290impl From<String> for LitString {
291 fn from(v: String) -> Self {
292 Self(v)
293 }
294}
295
296impl From<&str> for LitString {
297 fn from(v: &str) -> Self {
298 Self(v.to_owned())
299 }
300}
301
302impl LitString {
303 #[must_use]
313 pub fn into_inner(self) -> String {
314 self.0
315 }
316}
317
318impl serde_core::Serialize for LitString {
319 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
320 where
321 S: serde_core::Serializer,
322 {
323 serializer.serialize_newtype_struct(MAGIC_LIT_STR, &self.0)
324 }
325}
326
327impl<'de> serde_core::Deserialize<'de> for LitString {
328 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
329 where
330 D: serde_core::Deserializer<'de>,
331 {
332 String::deserialize(deserializer).map(LitString)
333 }
334}
335
336#[derive(Clone, PartialEq, Eq, Hash)]
346pub struct FoldStr<'a>(pub &'a str);
347
348impl fmt::Debug for FoldStr<'_> {
349 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
350 f.debug_tuple("FoldStr").field(&self.0).finish()
351 }
352}
353
354impl Deref for FoldStr<'_> {
355 type Target = str;
356 fn deref(&self) -> &str {
357 self.0
358 }
359}
360
361impl<'a> From<&'a str> for FoldStr<'a> {
362 fn from(v: &'a str) -> Self {
363 Self(v)
364 }
365}
366
367impl<'a> FoldStr<'a> {
368 #[must_use]
377 pub fn as_str(&self) -> &str {
378 self.0
379 }
380
381 #[must_use]
390 pub fn into_inner(self) -> &'a str {
391 self.0
392 }
393}
394
395impl serde_core::Serialize for FoldStr<'_> {
396 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
397 where
398 S: serde_core::Serializer,
399 {
400 serializer.serialize_newtype_struct(MAGIC_FOLD_STR, self.0)
401 }
402}
403
404#[derive(Clone, PartialEq, Eq, Hash)]
414pub struct FoldString(pub String);
415
416impl fmt::Debug for FoldString {
417 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
418 f.debug_tuple("FoldString").field(&self.0).finish()
419 }
420}
421
422impl Deref for FoldString {
423 type Target = str;
424 fn deref(&self) -> &str {
425 &self.0
426 }
427}
428
429impl From<String> for FoldString {
430 fn from(v: String) -> Self {
431 Self(v)
432 }
433}
434
435impl From<&str> for FoldString {
436 fn from(v: &str) -> Self {
437 Self(v.to_owned())
438 }
439}
440
441impl FoldString {
442 #[must_use]
451 pub fn into_inner(self) -> String {
452 self.0
453 }
454}
455
456impl serde_core::Serialize for FoldString {
457 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
458 where
459 S: serde_core::Serializer,
460 {
461 serializer.serialize_newtype_struct(MAGIC_FOLD_STR, &self.0)
462 }
463}
464
465impl<'de> serde_core::Deserialize<'de> for FoldString {
466 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
467 where
468 D: serde_core::Deserializer<'de>,
469 {
470 String::deserialize(deserializer).map(FoldString)
471 }
472}
473
474#[derive(Clone, PartialEq, Eq, Hash)]
492pub struct Commented<T> {
493 pub value: T,
495 pub comment: String,
497}
498
499impl<T: fmt::Debug> fmt::Debug for Commented<T> {
500 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
501 f.debug_struct("Commented")
502 .field("value", &self.value)
503 .field("comment", &self.comment)
504 .finish()
505 }
506}
507
508impl<T> Commented<T> {
509 pub fn new(value: T, comment: impl Into<String>) -> Self {
520 Self {
521 value,
522 comment: comment.into(),
523 }
524 }
525
526 pub fn into_inner(self) -> T {
536 self.value
537 }
538}
539
540impl<T> Deref for Commented<T> {
541 type Target = T;
542 fn deref(&self) -> &T {
543 &self.value
544 }
545}
546
547impl<T: serde_core::Serialize> serde_core::Serialize for Commented<T> {
548 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
549 where
550 S: serde_core::Serializer,
551 {
552 use serde_core::ser::SerializeTuple as _;
553
554 struct Inner<'a, T>(&'a T, &'a str);
556
557 impl<T: serde_core::Serialize> serde_core::Serialize for Inner<'_, T> {
558 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
559 where
560 S: serde_core::Serializer,
561 {
562 let mut tup = serializer.serialize_tuple(2)?;
563 tup.serialize_element(self.0)?;
564 tup.serialize_element(self.1)?;
565 tup.end()
566 }
567 }
568
569 serializer.serialize_newtype_struct(MAGIC_COMMENTED, &Inner(&self.value, &self.comment))
570 }
571}
572
573impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for Commented<T> {
574 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
575 where
576 D: serde_core::Deserializer<'de>,
577 {
578 T::deserialize(deserializer).map(|v| Self {
581 value: v,
582 comment: String::new(),
583 })
584 }
585}
586
587#[derive(Clone, PartialEq, Eq, Hash)]
597pub struct SpaceAfter<T>(pub T);
598
599impl<T: fmt::Debug> fmt::Debug for SpaceAfter<T> {
600 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
601 f.debug_tuple("SpaceAfter").field(&self.0).finish()
602 }
603}
604
605impl<T> Deref for SpaceAfter<T> {
606 type Target = T;
607 fn deref(&self) -> &T {
608 &self.0
609 }
610}
611
612impl<T> From<T> for SpaceAfter<T> {
613 fn from(v: T) -> Self {
614 Self(v)
615 }
616}
617
618impl<T> SpaceAfter<T> {
619 pub fn into_inner(self) -> T {
628 self.0
629 }
630}
631
632impl<T: serde_core::Serialize> serde_core::Serialize for SpaceAfter<T> {
633 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
634 where
635 S: serde_core::Serializer,
636 {
637 serializer.serialize_newtype_struct(MAGIC_SPACE_AFTER, &self.0)
638 }
639}
640
641impl<'de, T: serde_core::Deserialize<'de>> serde_core::Deserialize<'de> for SpaceAfter<T> {
642 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
643 where
644 D: serde_core::Deserializer<'de>,
645 {
646 T::deserialize(deserializer).map(SpaceAfter)
647 }
648}