1use crate::de::DeserializeSeed;
2use crate::time_duration::TimeDuration;
3use crate::timestamp::Timestamp;
4use crate::{i256, u256, AlgebraicValue, WithTypespace};
5use crate::{ser, ProductType, ProductTypeElement};
6use core::fmt;
7use core::fmt::Write as _;
8use derive_more::{From, Into};
9
10pub trait Satn: ser::Serialize {
12 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
14 Writer::with(f, |f| self.serialize(SatnFormatter { f }))?;
15 Ok(())
16 }
17
18 fn fmt_psql(&self, f: &mut fmt::Formatter, ty: &PsqlType<'_>) -> fmt::Result {
20 Writer::with(f, |f| {
21 self.serialize(PsqlFormatter {
22 fmt: SatnFormatter { f },
23 ty,
24 })
25 })?;
26 Ok(())
27 }
28
29 fn to_satn(&self) -> String {
31 Wrapper::from_ref(self).to_string()
32 }
33
34 fn to_satn_pretty(&self) -> String {
36 format!("{:#}", Wrapper::from_ref(self))
37 }
38}
39
40impl<T: ser::Serialize + ?Sized> Satn for T {}
41
42#[repr(transparent)]
46pub struct Wrapper<T: ?Sized>(pub T);
47
48impl<T: ?Sized> Wrapper<T> {
49 pub fn from_ref(t: &T) -> &Self {
51 unsafe { &*(t as *const T as *const Self) }
54 }
55}
56
57impl<T: Satn + ?Sized> fmt::Display for Wrapper<T> {
58 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 self.0.fmt(f)
60 }
61}
62
63impl<T: Satn + ?Sized> fmt::Debug for Wrapper<T> {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65 self.0.fmt(f)
66 }
67}
68
69pub struct PsqlWrapper<'a, T: ?Sized> {
73 pub ty: PsqlType<'a>,
74 pub value: T,
75}
76
77impl<T: ?Sized> PsqlWrapper<'_, T> {
78 pub fn from_ref(t: &T) -> &Self {
80 unsafe { &*(t as *const T as *const Self) }
83 }
84}
85
86impl<T: Satn + ?Sized> fmt::Display for PsqlWrapper<'_, T> {
87 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
88 self.value.fmt_psql(f, &self.ty)
89 }
90}
91
92impl<T: Satn + ?Sized> fmt::Debug for PsqlWrapper<'_, T> {
93 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
94 self.value.fmt_psql(f, &self.ty)
95 }
96}
97
98struct EntryWrapper<'a, 'f, const SEP: char> {
100 fmt: Writer<'a, 'f>,
102 has_fields: bool,
105}
106
107impl<'a, 'f, const SEP: char> EntryWrapper<'a, 'f, SEP> {
108 fn new(fmt: Writer<'a, 'f>) -> Self {
110 Self { fmt, has_fields: false }
111 }
112
113 fn entry(&mut self, entry: impl FnOnce(Writer) -> fmt::Result) -> fmt::Result {
117 let res = (|| match &mut self.fmt {
118 Writer::Pretty(f) => {
119 if !self.has_fields {
120 f.write_char('\n')?;
121 }
122 f.state.indent += 1;
123 entry(Writer::Pretty(f.as_mut()))?;
124 f.write_char(SEP)?;
125 f.write_char('\n')?;
126 f.state.indent -= 1;
127 Ok(())
128 }
129 Writer::Normal(f) => {
130 if self.has_fields {
131 f.write_char(SEP)?;
132 f.write_char(' ')?;
133 }
134 entry(Writer::Normal(f))
135 }
136 })();
137 self.has_fields = true;
138 res
139 }
140}
141
142enum Writer<'a, 'f> {
144 Normal(&'a mut fmt::Formatter<'f>),
146 Pretty(IndentedWriter<'a, 'f>),
148}
149
150impl<'f> Writer<'_, 'f> {
151 fn with<R>(f: &mut fmt::Formatter<'_>, func: impl FnOnce(Writer<'_, '_>) -> R) -> R {
153 let mut state;
154 let f = if f.alternate() {
156 state = IndentState {
157 indent: 0,
158 on_newline: true,
159 };
160 Writer::Pretty(IndentedWriter { f, state: &mut state })
161 } else {
162 Writer::Normal(f)
163 };
164 func(f)
165 }
166
167 fn as_mut(&mut self) -> Writer<'_, 'f> {
169 match self {
170 Writer::Normal(f) => Writer::Normal(f),
171 Writer::Pretty(f) => Writer::Pretty(f.as_mut()),
172 }
173 }
174}
175
176struct IndentedWriter<'a, 'f> {
178 f: &'a mut fmt::Formatter<'f>,
179 state: &'a mut IndentState,
180}
181
182struct IndentState {
184 indent: u32,
186 on_newline: bool,
188}
189
190impl<'f> IndentedWriter<'_, 'f> {
191 fn as_mut(&mut self) -> IndentedWriter<'_, 'f> {
193 IndentedWriter {
194 f: self.f,
195 state: self.state,
196 }
197 }
198}
199
200impl fmt::Write for IndentedWriter<'_, '_> {
201 fn write_str(&mut self, s: &str) -> fmt::Result {
202 for s in s.split_inclusive('\n') {
203 if self.state.on_newline {
204 for _ in 0..self.state.indent {
206 self.f.write_str(" ")?;
207 }
208 }
209
210 self.state.on_newline = s.ends_with('\n');
211 self.f.write_str(s)?;
212 }
213 Ok(())
214 }
215}
216
217impl fmt::Write for Writer<'_, '_> {
218 fn write_str(&mut self, s: &str) -> fmt::Result {
219 match self {
220 Writer::Normal(f) => f.write_str(s),
221 Writer::Pretty(f) => f.write_str(s),
222 }
223 }
224}
225
226struct SatnFormatter<'a, 'f> {
228 f: Writer<'a, 'f>,
230}
231
232#[derive(From, Into)]
234struct SatnError(fmt::Error);
235
236impl ser::Error for SatnError {
237 fn custom<T: fmt::Display>(_msg: T) -> Self {
238 Self(fmt::Error)
239 }
240}
241
242impl SatnFormatter<'_, '_> {
243 #[inline(always)]
245 fn write_fmt(&mut self, args: fmt::Arguments) -> Result<(), SatnError> {
246 self.f.write_fmt(args)?;
247 Ok(())
248 }
249}
250
251impl<'a, 'f> ser::Serializer for SatnFormatter<'a, 'f> {
252 type Ok = ();
253 type Error = SatnError;
254 type SerializeArray = ArrayFormatter<'a, 'f>;
255 type SerializeSeqProduct = SeqFormatter<'a, 'f>;
256 type SerializeNamedProduct = NamedFormatter<'a, 'f>;
257
258 fn serialize_bool(mut self, v: bool) -> Result<Self::Ok, Self::Error> {
259 write!(self, "{v}")
260 }
261 fn serialize_u8(mut self, v: u8) -> Result<Self::Ok, Self::Error> {
262 write!(self, "{v}")
263 }
264 fn serialize_u16(mut self, v: u16) -> Result<Self::Ok, Self::Error> {
265 write!(self, "{v}")
266 }
267 fn serialize_u32(mut self, v: u32) -> Result<Self::Ok, Self::Error> {
268 write!(self, "{v}")
269 }
270 fn serialize_u64(mut self, v: u64) -> Result<Self::Ok, Self::Error> {
271 write!(self, "{v}")
272 }
273 fn serialize_u128(mut self, v: u128) -> Result<Self::Ok, Self::Error> {
274 write!(self, "{v}")
275 }
276 fn serialize_u256(mut self, v: u256) -> Result<Self::Ok, Self::Error> {
277 write!(self, "{v}")
278 }
279 fn serialize_i8(mut self, v: i8) -> Result<Self::Ok, Self::Error> {
280 write!(self, "{v}")
281 }
282 fn serialize_i16(mut self, v: i16) -> Result<Self::Ok, Self::Error> {
283 write!(self, "{v}")
284 }
285 fn serialize_i32(mut self, v: i32) -> Result<Self::Ok, Self::Error> {
286 write!(self, "{v}")
287 }
288 fn serialize_i64(mut self, v: i64) -> Result<Self::Ok, Self::Error> {
289 write!(self, "{v}")
290 }
291 fn serialize_i128(mut self, v: i128) -> Result<Self::Ok, Self::Error> {
292 write!(self, "{v}")
293 }
294 fn serialize_i256(mut self, v: i256) -> Result<Self::Ok, Self::Error> {
295 write!(self, "{v}")
296 }
297 fn serialize_f32(mut self, v: f32) -> Result<Self::Ok, Self::Error> {
298 write!(self, "{v}")
299 }
300 fn serialize_f64(mut self, v: f64) -> Result<Self::Ok, Self::Error> {
301 write!(self, "{v}")
302 }
303
304 fn serialize_str(mut self, v: &str) -> Result<Self::Ok, Self::Error> {
305 write!(self, "\"{v}\"")
306 }
307
308 fn serialize_bytes(mut self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
309 write!(self, "0x{}", hex::encode(v))
310 }
311
312 fn serialize_array(mut self, _len: usize) -> Result<Self::SerializeArray, Self::Error> {
313 write!(self, "[")?; Ok(ArrayFormatter {
315 f: EntryWrapper::new(self.f),
316 })
317 }
318
319 fn serialize_seq_product(self, len: usize) -> Result<Self::SerializeSeqProduct, Self::Error> {
320 self.serialize_named_product(len).map(|inner| SeqFormatter { inner })
322 }
323
324 fn serialize_named_product(mut self, _len: usize) -> Result<Self::SerializeNamedProduct, Self::Error> {
325 write!(self, "(")?; Ok(NamedFormatter {
327 f: EntryWrapper::new(self.f),
328 idx: 0,
329 })
330 }
331
332 fn serialize_variant<T: ser::Serialize + ?Sized>(
333 mut self,
334 _tag: u8,
335 name: Option<&str>,
336 value: &T,
337 ) -> Result<Self::Ok, Self::Error> {
338 write!(self, "(")?;
339 EntryWrapper::<','>::new(self.f.as_mut()).entry(|mut f| {
340 if let Some(name) = name {
341 write!(f, "{name}")?;
342 }
343 write!(f, " = ")?;
344 value.serialize(SatnFormatter { f })?;
345 Ok(())
346 })?;
347 write!(self, ")")
348 }
349}
350
351struct ArrayFormatter<'a, 'f> {
353 f: EntryWrapper<'a, 'f, ','>,
355}
356
357impl ser::SerializeArray for ArrayFormatter<'_, '_> {
358 type Ok = ();
359 type Error = SatnError;
360
361 fn serialize_element<T: ser::Serialize + ?Sized>(&mut self, elem: &T) -> Result<(), Self::Error> {
362 self.f.entry(|f| elem.serialize(SatnFormatter { f }).map_err(|e| e.0))?;
363 Ok(())
364 }
365
366 fn end(mut self) -> Result<Self::Ok, Self::Error> {
367 write!(self.f.fmt, "]")?;
368 Ok(())
369 }
370}
371
372struct SeqFormatter<'a, 'f> {
374 inner: NamedFormatter<'a, 'f>,
376}
377
378impl ser::SerializeSeqProduct for SeqFormatter<'_, '_> {
379 type Ok = ();
380 type Error = SatnError;
381
382 fn serialize_element<T: ser::Serialize + ?Sized>(&mut self, elem: &T) -> Result<(), Self::Error> {
383 ser::SerializeNamedProduct::serialize_element(&mut self.inner, None, elem)
384 }
385
386 fn end(self) -> Result<Self::Ok, Self::Error> {
387 ser::SerializeNamedProduct::end(self.inner)
388 }
389}
390
391struct NamedFormatter<'a, 'f> {
393 f: EntryWrapper<'a, 'f, ','>,
395 idx: usize,
397}
398
399impl ser::SerializeNamedProduct for NamedFormatter<'_, '_> {
400 type Ok = ();
401 type Error = SatnError;
402
403 fn serialize_element<T: ser::Serialize + ?Sized>(
404 &mut self,
405 name: Option<&str>,
406 elem: &T,
407 ) -> Result<(), Self::Error> {
408 let res = self.f.entry(|mut f| {
409 if let Some(name) = name {
411 write!(f, "{name}")?;
412 } else {
413 write!(f, "{}", self.idx)?;
414 }
415 write!(f, " = ")?;
416 elem.serialize(SatnFormatter { f })?;
417 Ok(())
418 });
419 self.idx += 1;
420 res?;
421 Ok(())
422 }
423
424 fn end(mut self) -> Result<Self::Ok, Self::Error> {
425 write!(self.f.fmt, ")")?;
426 Ok(())
427 }
428}
429
430struct PsqlEntryWrapper<'a, 'f, const SEP: char> {
431 entry: EntryWrapper<'a, 'f, SEP>,
432 idx: usize,
434 ty: &'a PsqlType<'a>,
435}
436
437struct PsqlNamedFormatter<'a, 'f> {
439 f: PsqlEntryWrapper<'a, 'f, ','>,
441 start: bool,
443 use_fmt: PsqlPrintFmt,
445}
446
447impl<'a, 'f> PsqlNamedFormatter<'a, 'f> {
448 pub fn new(ty: &'a PsqlType<'a>, f: Writer<'a, 'f>) -> Self {
449 Self {
450 start: true,
451 f: PsqlEntryWrapper {
452 entry: EntryWrapper::new(f),
453 idx: 0,
454 ty,
455 },
456 use_fmt: PsqlPrintFmt::Satn,
458 }
459 }
460}
461
462impl ser::SerializeNamedProduct for PsqlNamedFormatter<'_, '_> {
463 type Ok = ();
464 type Error = SatnError;
465
466 fn serialize_element<T: Satn + ser::Serialize + ?Sized>(
467 &mut self,
468 name: Option<&str>,
469 elem: &T,
470 ) -> Result<(), Self::Error> {
471 self.use_fmt = self.f.ty.use_fmt(name);
474 let res = self.f.entry.entry(|mut f| {
475 let PsqlType { tuple, field, idx } = self.f.ty;
476 if !self.use_fmt.is_special() {
477 if self.start {
478 write!(f, "(")?;
479 self.start = false;
480 }
481 if let Some(name) = name {
483 write!(f, "{name}")?;
484 } else {
485 write!(f, "{idx}")?;
486 }
487 write!(f, " = ")?;
488 }
489 let (tuple, field, idx) = if let Some(product) = field.algebraic_type.as_product() {
491 (product, &product.elements[self.f.idx], self.f.idx)
492 } else {
493 (*tuple, *field, *idx)
494 };
495
496 elem.serialize(PsqlFormatter {
497 fmt: SatnFormatter { f },
498 ty: &PsqlType { tuple, field, idx },
499 })?;
500
501 Ok(())
502 });
503
504 if !self.use_fmt.is_special() {
506 self.f.idx += 1;
507 }
508
509 res?;
510
511 Ok(())
512 }
513
514 fn end(mut self) -> Result<Self::Ok, Self::Error> {
515 if !self.use_fmt.is_special() {
516 write!(self.f.entry.fmt, ")")?;
517 }
518 Ok(())
519 }
520}
521
522struct PsqlSeqFormatter<'a, 'f> {
524 inner: PsqlNamedFormatter<'a, 'f>,
526}
527
528impl ser::SerializeSeqProduct for PsqlSeqFormatter<'_, '_> {
529 type Ok = ();
530 type Error = SatnError;
531
532 fn serialize_element<T: ser::Serialize + ?Sized>(&mut self, elem: &T) -> Result<(), Self::Error> {
533 ser::SerializeNamedProduct::serialize_element(&mut self.inner, None, elem)
534 }
535
536 fn end(self) -> Result<Self::Ok, Self::Error> {
537 ser::SerializeNamedProduct::end(self.inner)
538 }
539}
540
541#[derive(PartialEq)]
543pub enum PsqlPrintFmt {
544 Hex,
546 Timestamp,
548 Duration,
550 Satn,
552}
553
554impl PsqlPrintFmt {
555 fn is_special(&self) -> bool {
556 self != &PsqlPrintFmt::Satn
557 }
558}
559
560#[derive(Debug, Clone)]
562pub struct PsqlType<'a> {
563 pub tuple: &'a ProductType,
565 pub field: &'a ProductTypeElement,
567 pub idx: usize,
569}
570
571impl PsqlType<'_> {
572 fn use_fmt(&self, name: Option<&str>) -> PsqlPrintFmt {
576 if self.tuple.is_identity()
577 || self.tuple.is_connection_id()
578 || self.field.algebraic_type.is_identity()
579 || self.field.algebraic_type.is_connection_id()
580 || name.map(ProductType::is_identity_tag).unwrap_or_default()
581 || name.map(ProductType::is_connection_id_tag).unwrap_or_default()
582 {
583 return PsqlPrintFmt::Hex;
584 };
585
586 if self.tuple.is_timestamp()
587 || self.field.algebraic_type.is_timestamp()
588 || name.map(ProductType::is_timestamp_tag).unwrap_or_default()
589 {
590 return PsqlPrintFmt::Timestamp;
591 };
592
593 if self.tuple.is_time_duration()
594 || self.field.algebraic_type.is_time_duration()
595 || name.map(ProductType::is_time_duration_tag).unwrap_or_default()
596 {
597 return PsqlPrintFmt::Duration;
598 };
599
600 PsqlPrintFmt::Satn
601 }
602}
603
604struct PsqlFormatter<'a, 'f> {
606 fmt: SatnFormatter<'a, 'f>,
607 ty: &'a PsqlType<'a>,
608}
609
610impl<'a, 'f> ser::Serializer for PsqlFormatter<'a, 'f> {
611 type Ok = ();
612 type Error = SatnError;
613 type SerializeArray = ArrayFormatter<'a, 'f>;
614 type SerializeSeqProduct = PsqlSeqFormatter<'a, 'f>;
615 type SerializeNamedProduct = PsqlNamedFormatter<'a, 'f>;
616
617 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
618 self.fmt.serialize_bool(v)
619 }
620 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
621 self.fmt.serialize_u8(v)
622 }
623 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
624 self.fmt.serialize_u16(v)
625 }
626 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
627 self.fmt.serialize_u32(v)
628 }
629 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
630 self.fmt.serialize_u64(v)
631 }
632 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
633 match self.ty.use_fmt(None) {
634 PsqlPrintFmt::Hex => self.serialize_bytes(&v.to_be_bytes()),
635 _ => self.fmt.serialize_u128(v),
636 }
637 }
638 fn serialize_u256(self, v: u256) -> Result<Self::Ok, Self::Error> {
639 match self.ty.use_fmt(None) {
640 PsqlPrintFmt::Hex => self.serialize_bytes(&v.to_be_bytes()),
641 _ => self.fmt.serialize_u256(v),
642 }
643 }
644 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
645 self.fmt.serialize_i8(v)
646 }
647 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
648 self.fmt.serialize_i16(v)
649 }
650 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
651 self.fmt.serialize_i32(v)
652 }
653 fn serialize_i64(mut self, v: i64) -> Result<Self::Ok, Self::Error> {
654 match self.ty.use_fmt(None) {
655 PsqlPrintFmt::Duration => {
656 write!(self.fmt, "{}", TimeDuration::from_micros(v))?;
657 Ok(())
658 }
659 PsqlPrintFmt::Timestamp => {
660 write!(self.fmt, "{}", Timestamp::from_micros_since_unix_epoch(v))?;
661 Ok(())
662 }
663 _ => self.fmt.serialize_i64(v),
664 }
665 }
666 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
667 self.fmt.serialize_i128(v)
668 }
669 fn serialize_i256(self, v: i256) -> Result<Self::Ok, Self::Error> {
670 self.fmt.serialize_i256(v)
671 }
672 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
673 self.fmt.serialize_f32(v)
674 }
675 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
676 self.fmt.serialize_f64(v)
677 }
678
679 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
680 self.fmt.serialize_str(v)
681 }
682
683 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
684 self.fmt.serialize_bytes(v)
685 }
686
687 fn serialize_array(self, len: usize) -> Result<Self::SerializeArray, Self::Error> {
688 self.fmt.serialize_array(len)
689 }
690
691 fn serialize_seq_product(self, len: usize) -> Result<Self::SerializeSeqProduct, Self::Error> {
692 Ok(PsqlSeqFormatter {
693 inner: self.serialize_named_product(len)?,
694 })
695 }
696
697 fn serialize_named_product(self, _len: usize) -> Result<Self::SerializeNamedProduct, Self::Error> {
698 Ok(PsqlNamedFormatter::new(self.ty, self.fmt.f))
699 }
700
701 fn serialize_variant<T: ser::Serialize + ?Sized>(
702 self,
703 tag: u8,
704 name: Option<&str>,
705 value: &T,
706 ) -> Result<Self::Ok, Self::Error> {
707 self.fmt.serialize_variant(tag, name, value)
708 }
709
710 unsafe fn serialize_bsatn<Ty>(self, ty: &Ty, bsatn: &[u8]) -> Result<Self::Ok, Self::Error>
711 where
712 for<'b, 'de> WithTypespace<'b, Ty>: DeserializeSeed<'de, Output: Into<AlgebraicValue>>,
713 {
714 unsafe { self.fmt.serialize_bsatn(ty, bsatn) }
716 }
717
718 unsafe fn serialize_bsatn_in_chunks<'c, Ty, I: Clone + Iterator<Item = &'c [u8]>>(
719 self,
720 ty: &Ty,
721 total_bsatn_len: usize,
722 bsatn: I,
723 ) -> Result<Self::Ok, Self::Error>
724 where
725 for<'b, 'de> WithTypespace<'b, Ty>: DeserializeSeed<'de, Output: Into<AlgebraicValue>>,
726 {
727 unsafe { self.fmt.serialize_bsatn_in_chunks(ty, total_bsatn_len, bsatn) }
729 }
730
731 unsafe fn serialize_str_in_chunks<'c, I: Clone + Iterator<Item = &'c [u8]>>(
732 self,
733 total_len: usize,
734 string: I,
735 ) -> Result<Self::Ok, Self::Error> {
736 unsafe { self.fmt.serialize_str_in_chunks(total_len, string) }
738 }
739}