diff --git a/Cargo.lock b/Cargo.lock index 58dc6f5a9..8750b2337 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3291,12 +3291,14 @@ checksum = "8f54a172d0620933a27a4360d3db3e2ae0dd6cceae9730751a036bbf182c4b23" name = "vecdb" version = "0.6.8" dependencies = [ + "itoa", "libc", "log", "lz4_flex 0.12.0", "parking_lot", "pco", "rawdb", + "ryu", "schemars", "serde", "serde_json", diff --git a/crates/brk_types/src/anyaddressindex.rs b/crates/brk_types/src/anyaddressindex.rs index 704ce5840..ba27f8e7e 100644 --- a/crates/brk_types/src/anyaddressindex.rs +++ b/crates/brk_types/src/anyaddressindex.rs @@ -62,8 +62,8 @@ impl fmt::Display for AnyAddressIndex { impl Formattable for AnyAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/basis_points_16.rs b/crates/brk_types/src/basis_points_16.rs index 8dbd55c00..f25349970 100644 --- a/crates/brk_types/src/basis_points_16.rs +++ b/crates/brk_types/src/basis_points_16.rs @@ -164,9 +164,8 @@ impl std::fmt::Display for BasisPoints16 { impl Formattable for BasisPoints16 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/basis_points_32.rs b/crates/brk_types/src/basis_points_32.rs index bed6c5921..ef4a26db7 100644 --- a/crates/brk_types/src/basis_points_32.rs +++ b/crates/brk_types/src/basis_points_32.rs @@ -137,9 +137,8 @@ impl std::fmt::Display for BasisPoints32 { impl Formattable for BasisPoints32 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/basis_points_signed_16.rs b/crates/brk_types/src/basis_points_signed_16.rs index 65aaf06ec..532ce8ae0 100644 --- a/crates/brk_types/src/basis_points_signed_16.rs +++ b/crates/brk_types/src/basis_points_signed_16.rs @@ -160,9 +160,8 @@ impl std::fmt::Display for BasisPointsSigned16 { impl Formattable for BasisPointsSigned16 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/basis_points_signed_32.rs b/crates/brk_types/src/basis_points_signed_32.rs index 12117b279..0926addeb 100644 --- a/crates/brk_types/src/basis_points_signed_32.rs +++ b/crates/brk_types/src/basis_points_signed_32.rs @@ -166,9 +166,8 @@ impl std::fmt::Display for BasisPointsSigned32 { impl Formattable for BasisPointsSigned32 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/bitcoin.rs b/crates/brk_types/src/bitcoin.rs index 59965be5f..d77454327 100644 --- a/crates/brk_types/src/bitcoin.rs +++ b/crates/brk_types/src/bitcoin.rs @@ -143,9 +143,8 @@ impl std::fmt::Display for Bitcoin { impl Formattable for Bitcoin { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/blkposition.rs b/crates/brk_types/src/blkposition.rs index 3f9658708..342b91db9 100644 --- a/crates/brk_types/src/blkposition.rs +++ b/crates/brk_types/src/blkposition.rs @@ -39,9 +39,8 @@ impl std::fmt::Display for BlkPosition { impl Formattable for BlkPosition { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/blockhash.rs b/crates/brk_types/src/blockhash.rs index 922a86394..71dca3638 100644 --- a/crates/brk_types/src/blockhash.rs +++ b/crates/brk_types/src/blockhash.rs @@ -93,9 +93,16 @@ impl<'de> Deserialize<'de> for BlockHash { } impl Formattable for BlockHash { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/cents.rs b/crates/brk_types/src/cents.rs index c37684346..d11f4ae3d 100644 --- a/crates/brk_types/src/cents.rs +++ b/crates/brk_types/src/cents.rs @@ -282,9 +282,8 @@ impl std::fmt::Display for Cents { impl Formattable for Cents { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/cents_sats.rs b/crates/brk_types/src/cents_sats.rs index 01f94cb6b..2d2e2efe5 100644 --- a/crates/brk_types/src/cents_sats.rs +++ b/crates/brk_types/src/cents_sats.rs @@ -114,10 +114,9 @@ impl Div for CentsSats { impl Formattable for CentsSats { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/cents_signed.rs b/crates/brk_types/src/cents_signed.rs index 15c5a8d52..f82d97e99 100644 --- a/crates/brk_types/src/cents_signed.rs +++ b/crates/brk_types/src/cents_signed.rs @@ -261,9 +261,8 @@ impl std::fmt::Display for CentsSigned { impl Formattable for CentsSigned { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/cents_squared_sats.rs b/crates/brk_types/src/cents_squared_sats.rs index 007036f3c..9306fc8ed 100644 --- a/crates/brk_types/src/cents_squared_sats.rs +++ b/crates/brk_types/src/cents_squared_sats.rs @@ -109,10 +109,9 @@ impl Div for CentsSquaredSats { impl Formattable for CentsSquaredSats { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/date.rs b/crates/brk_types/src/date.rs index 725f63900..485fd3a11 100644 --- a/crates/brk_types/src/date.rs +++ b/crates/brk_types/src/date.rs @@ -260,10 +260,17 @@ impl FromStr for Date { } impl Formattable for Date { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/day1.rs b/crates/brk_types/src/day1.rs index 19587d2fd..6a754f55a 100644 --- a/crates/brk_types/src/day1.rs +++ b/crates/brk_types/src/day1.rs @@ -216,9 +216,8 @@ impl fmt::Display for Day1 { impl Formattable for Day1 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/day3.rs b/crates/brk_types/src/day3.rs index 658d92254..2d701448c 100644 --- a/crates/brk_types/src/day3.rs +++ b/crates/brk_types/src/day3.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Day3 { impl Formattable for Day3 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/difficultyepoch.rs b/crates/brk_types/src/difficultyepoch.rs index 206479b13..b3d07b555 100644 --- a/crates/brk_types/src/difficultyepoch.rs +++ b/crates/brk_types/src/difficultyepoch.rs @@ -110,10 +110,9 @@ impl std::fmt::Display for DifficultyEpoch { impl Formattable for DifficultyEpoch { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/dollars.rs b/crates/brk_types/src/dollars.rs index 2832b7a8d..0f700f9e1 100644 --- a/crates/brk_types/src/dollars.rs +++ b/crates/brk_types/src/dollars.rs @@ -434,9 +434,8 @@ impl std::fmt::Display for Dollars { impl Formattable for Dollars { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/emptyaddressdata.rs b/crates/brk_types/src/emptyaddressdata.rs index bc4594762..2da33adc7 100644 --- a/crates/brk_types/src/emptyaddressdata.rs +++ b/crates/brk_types/src/emptyaddressdata.rs @@ -49,16 +49,28 @@ impl std::fmt::Display for EmptyAddressData { } impl Formattable for EmptyAddressData { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for EmptyAddressData { diff --git a/crates/brk_types/src/emptyaddressindex.rs b/crates/brk_types/src/emptyaddressindex.rs index c5bbcfda3..18de6922b 100644 --- a/crates/brk_types/src/emptyaddressindex.rs +++ b/crates/brk_types/src/emptyaddressindex.rs @@ -82,7 +82,7 @@ impl std::fmt::Display for EmptyAddressIndex { impl Formattable for EmptyAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/emptyoutputindex.rs b/crates/brk_types/src/emptyoutputindex.rs index 562ffe975..75b88efa2 100644 --- a/crates/brk_types/src/emptyoutputindex.rs +++ b/crates/brk_types/src/emptyoutputindex.rs @@ -79,7 +79,7 @@ impl fmt::Display for EmptyOutputIndex { impl Formattable for EmptyOutputIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/feerate.rs b/crates/brk_types/src/feerate.rs index 51c73b4d3..2a236f7f6 100644 --- a/crates/brk_types/src/feerate.rs +++ b/crates/brk_types/src/feerate.rs @@ -122,9 +122,8 @@ impl std::fmt::Display for FeeRate { impl Formattable for FeeRate { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/fundedaddressdata.rs b/crates/brk_types/src/fundedaddressdata.rs index 6fe673471..b45421ff9 100644 --- a/crates/brk_types/src/fundedaddressdata.rs +++ b/crates/brk_types/src/fundedaddressdata.rs @@ -169,16 +169,28 @@ impl std::fmt::Display for FundedAddressData { } impl Formattable for FundedAddressData { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for FundedAddressData { diff --git a/crates/brk_types/src/fundedaddressindex.rs b/crates/brk_types/src/fundedaddressindex.rs index da82e8bfc..b3f1107ff 100644 --- a/crates/brk_types/src/fundedaddressindex.rs +++ b/crates/brk_types/src/fundedaddressindex.rs @@ -78,7 +78,7 @@ impl std::fmt::Display for FundedAddressIndex { impl Formattable for FundedAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/halvingepoch.rs b/crates/brk_types/src/halvingepoch.rs index 4e8fb78b2..205ecbb78 100644 --- a/crates/brk_types/src/halvingepoch.rs +++ b/crates/brk_types/src/halvingepoch.rs @@ -116,10 +116,9 @@ impl std::fmt::Display for HalvingEpoch { impl Formattable for HalvingEpoch { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/height.rs b/crates/brk_types/src/height.rs index b8887f172..25cdbc94b 100644 --- a/crates/brk_types/src/height.rs +++ b/crates/brk_types/src/height.rs @@ -286,10 +286,9 @@ impl std::fmt::Display for Height { impl Formattable for Height { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/hour1.rs b/crates/brk_types/src/hour1.rs index 03a05c0fe..1088365d3 100644 --- a/crates/brk_types/src/hour1.rs +++ b/crates/brk_types/src/hour1.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Hour1 { impl Formattable for Hour1 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/hour12.rs b/crates/brk_types/src/hour12.rs index 9e110afde..6dc33fcf7 100644 --- a/crates/brk_types/src/hour12.rs +++ b/crates/brk_types/src/hour12.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Hour12 { impl Formattable for Hour12 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/hour4.rs b/crates/brk_types/src/hour4.rs index 4b58d8b51..198cfe054 100644 --- a/crates/brk_types/src/hour4.rs +++ b/crates/brk_types/src/hour4.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Hour4 { impl Formattable for Hour4 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/minute10.rs b/crates/brk_types/src/minute10.rs index d1b882da1..531933ed4 100644 --- a/crates/brk_types/src/minute10.rs +++ b/crates/brk_types/src/minute10.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Minute10 { impl Formattable for Minute10 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/minute30.rs b/crates/brk_types/src/minute30.rs index fd3fe6fd1..251291b85 100644 --- a/crates/brk_types/src/minute30.rs +++ b/crates/brk_types/src/minute30.rs @@ -81,9 +81,8 @@ impl std::fmt::Display for Minute30 { impl Formattable for Minute30 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/month1.rs b/crates/brk_types/src/month1.rs index df6fc6290..2181e3389 100644 --- a/crates/brk_types/src/month1.rs +++ b/crates/brk_types/src/month1.rs @@ -135,9 +135,8 @@ impl std::fmt::Display for Month1 { impl Formattable for Month1 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/month3.rs b/crates/brk_types/src/month3.rs index e2be587df..ddbb45626 100644 --- a/crates/brk_types/src/month3.rs +++ b/crates/brk_types/src/month3.rs @@ -129,9 +129,8 @@ impl std::fmt::Display for Month3 { impl Formattable for Month3 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/month6.rs b/crates/brk_types/src/month6.rs index ba9268788..b256d1552 100644 --- a/crates/brk_types/src/month6.rs +++ b/crates/brk_types/src/month6.rs @@ -121,9 +121,8 @@ impl std::fmt::Display for Month6 { impl Formattable for Month6 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/ohlc.rs b/crates/brk_types/src/ohlc.rs index bee8089be..54ba7fef2 100644 --- a/crates/brk_types/src/ohlc.rs +++ b/crates/brk_types/src/ohlc.rs @@ -128,16 +128,28 @@ impl Display for OHLCCents { } impl Formattable for OHLCCents { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for OHLCCents { @@ -259,16 +271,28 @@ impl Display for OHLCDollars { } impl Formattable for OHLCDollars { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for OHLCDollars { @@ -359,16 +383,28 @@ impl Display for OHLCSats { } impl Formattable for OHLCSats { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for OHLCSats { @@ -518,10 +554,17 @@ impl Formattable for Open where T: Display, { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } @@ -650,10 +693,17 @@ impl Formattable for High where T: Display, { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } @@ -782,10 +832,17 @@ impl Formattable for Low where T: Display, { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } @@ -937,9 +994,16 @@ impl Formattable for Close where T: Display, { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/opreturnindex.rs b/crates/brk_types/src/opreturnindex.rs index 9f35d5ca8..ab632036f 100644 --- a/crates/brk_types/src/opreturnindex.rs +++ b/crates/brk_types/src/opreturnindex.rs @@ -84,7 +84,7 @@ impl std::fmt::Display for OpReturnIndex { impl Formattable for OpReturnIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/oracle_bins.rs b/crates/brk_types/src/oracle_bins.rs index 01391b86d..85b49b2d9 100644 --- a/crates/brk_types/src/oracle_bins.rs +++ b/crates/brk_types/src/oracle_bins.rs @@ -144,10 +144,17 @@ impl Bytes for OracleBins { } impl Formattable for OracleBins { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } @@ -300,9 +307,16 @@ impl Bytes for OracleBinsV2 { } impl Formattable for OracleBinsV2 { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/outpoint.rs b/crates/brk_types/src/outpoint.rs index 4308c192c..7393c8c3b 100644 --- a/crates/brk_types/src/outpoint.rs +++ b/crates/brk_types/src/outpoint.rs @@ -47,16 +47,28 @@ impl std::fmt::Display for OutPoint { } impl Formattable for OutPoint { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Serialize for OutPoint { diff --git a/crates/brk_types/src/outputtype.rs b/crates/brk_types/src/outputtype.rs index 65bb19989..77a89b4b0 100644 --- a/crates/brk_types/src/outputtype.rs +++ b/crates/brk_types/src/outputtype.rs @@ -205,10 +205,17 @@ impl TryFrom for AddressType { } impl Formattable for OutputType { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/p2aaddressindex.rs b/crates/brk_types/src/p2aaddressindex.rs index fb3ea8caf..0a89fa8c2 100644 --- a/crates/brk_types/src/p2aaddressindex.rs +++ b/crates/brk_types/src/p2aaddressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2AAddressIndex { impl Formattable for P2AAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2abytes.rs b/crates/brk_types/src/p2abytes.rs index 1c1acff68..56b61350c 100644 --- a/crates/brk_types/src/p2abytes.rs +++ b/crates/brk_types/src/p2abytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2ABytes { } impl Formattable for P2ABytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2msoutputindex.rs b/crates/brk_types/src/p2msoutputindex.rs index 63b4c8534..5b228ad83 100644 --- a/crates/brk_types/src/p2msoutputindex.rs +++ b/crates/brk_types/src/p2msoutputindex.rs @@ -84,7 +84,7 @@ impl std::fmt::Display for P2MSOutputIndex { impl Formattable for P2MSOutputIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2pk33addressindex.rs b/crates/brk_types/src/p2pk33addressindex.rs index 4ad20f765..9eba5f2de 100644 --- a/crates/brk_types/src/p2pk33addressindex.rs +++ b/crates/brk_types/src/p2pk33addressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2PK33AddressIndex { impl Formattable for P2PK33AddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2pk33bytes.rs b/crates/brk_types/src/p2pk33bytes.rs index 9f7bd9e52..19fd5af2a 100644 --- a/crates/brk_types/src/p2pk33bytes.rs +++ b/crates/brk_types/src/p2pk33bytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2PK33Bytes { } impl Formattable for P2PK33Bytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2pk65addressindex.rs b/crates/brk_types/src/p2pk65addressindex.rs index cbc6899b3..515d93c87 100644 --- a/crates/brk_types/src/p2pk65addressindex.rs +++ b/crates/brk_types/src/p2pk65addressindex.rs @@ -104,7 +104,7 @@ impl std::fmt::Display for P2PK65AddressIndex { impl Formattable for P2PK65AddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2pk65bytes.rs b/crates/brk_types/src/p2pk65bytes.rs index 70bd5ef93..0faf55eb9 100644 --- a/crates/brk_types/src/p2pk65bytes.rs +++ b/crates/brk_types/src/p2pk65bytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2PK65Bytes { } impl Formattable for P2PK65Bytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2pkhaddressindex.rs b/crates/brk_types/src/p2pkhaddressindex.rs index d2a490098..65508aec8 100644 --- a/crates/brk_types/src/p2pkhaddressindex.rs +++ b/crates/brk_types/src/p2pkhaddressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2PKHAddressIndex { impl Formattable for P2PKHAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2pkhbytes.rs b/crates/brk_types/src/p2pkhbytes.rs index 12cc13e03..77807cc4e 100644 --- a/crates/brk_types/src/p2pkhbytes.rs +++ b/crates/brk_types/src/p2pkhbytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2PKHBytes { } impl Formattable for P2PKHBytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2shaddressindex.rs b/crates/brk_types/src/p2shaddressindex.rs index 4c34be532..08aa0e788 100644 --- a/crates/brk_types/src/p2shaddressindex.rs +++ b/crates/brk_types/src/p2shaddressindex.rs @@ -112,7 +112,7 @@ impl std::fmt::Display for P2SHAddressIndex { impl Formattable for P2SHAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2shbytes.rs b/crates/brk_types/src/p2shbytes.rs index ae8c04276..56fac3024 100644 --- a/crates/brk_types/src/p2shbytes.rs +++ b/crates/brk_types/src/p2shbytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2SHBytes { } impl Formattable for P2SHBytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2traddressindex.rs b/crates/brk_types/src/p2traddressindex.rs index 9bdf01122..ff9df5fc5 100644 --- a/crates/brk_types/src/p2traddressindex.rs +++ b/crates/brk_types/src/p2traddressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2TRAddressIndex { impl Formattable for P2TRAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2trbytes.rs b/crates/brk_types/src/p2trbytes.rs index 2cfc8d05e..d29f56a1f 100644 --- a/crates/brk_types/src/p2trbytes.rs +++ b/crates/brk_types/src/p2trbytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2TRBytes { } impl Formattable for P2TRBytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2wpkhaddressindex.rs b/crates/brk_types/src/p2wpkhaddressindex.rs index 8d227d0d3..7c58e7e49 100644 --- a/crates/brk_types/src/p2wpkhaddressindex.rs +++ b/crates/brk_types/src/p2wpkhaddressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2WPKHAddressIndex { impl Formattable for P2WPKHAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2wpkhbytes.rs b/crates/brk_types/src/p2wpkhbytes.rs index 9968201b1..da419e337 100644 --- a/crates/brk_types/src/p2wpkhbytes.rs +++ b/crates/brk_types/src/p2wpkhbytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2WPKHBytes { } impl Formattable for P2WPKHBytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/p2wshaddressindex.rs b/crates/brk_types/src/p2wshaddressindex.rs index 163e5952e..4b116d04e 100644 --- a/crates/brk_types/src/p2wshaddressindex.rs +++ b/crates/brk_types/src/p2wshaddressindex.rs @@ -105,7 +105,7 @@ impl std::fmt::Display for P2WSHAddressIndex { impl Formattable for P2WSHAddressIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/p2wshbytes.rs b/crates/brk_types/src/p2wshbytes.rs index 5f11a85bf..4b3dcb7d5 100644 --- a/crates/brk_types/src/p2wshbytes.rs +++ b/crates/brk_types/src/p2wshbytes.rs @@ -44,14 +44,26 @@ impl fmt::Display for P2WSHBytes { } impl Formattable for P2WSHBytes { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/pairoutputindex.rs b/crates/brk_types/src/pairoutputindex.rs index f7a403256..54442eb94 100644 --- a/crates/brk_types/src/pairoutputindex.rs +++ b/crates/brk_types/src/pairoutputindex.rs @@ -115,9 +115,8 @@ impl std::fmt::Display for PairOutputIndex { impl Formattable for PairOutputIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/poolslug.rs b/crates/brk_types/src/poolslug.rs index 70c0052da..4f5aadc39 100644 --- a/crates/brk_types/src/poolslug.rs +++ b/crates/brk_types/src/poolslug.rs @@ -410,10 +410,17 @@ impl PoolSlug { } impl Formattable for PoolSlug { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/rawlocktime.rs b/crates/brk_types/src/rawlocktime.rs index a61576e1c..9dbf8b851 100644 --- a/crates/brk_types/src/rawlocktime.rs +++ b/crates/brk_types/src/rawlocktime.rs @@ -38,14 +38,26 @@ impl std::fmt::Display for RawLockTime { } impl Formattable for RawLockTime { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } diff --git a/crates/brk_types/src/sats.rs b/crates/brk_types/src/sats.rs index d354f9bb6..86f0bab97 100644 --- a/crates/brk_types/src/sats.rs +++ b/crates/brk_types/src/sats.rs @@ -346,9 +346,8 @@ impl std::fmt::Display for Sats { impl Formattable for Sats { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/sats_signed.rs b/crates/brk_types/src/sats_signed.rs index e975c81ca..2309af00c 100644 --- a/crates/brk_types/src/sats_signed.rs +++ b/crates/brk_types/src/sats_signed.rs @@ -214,9 +214,8 @@ impl std::fmt::Display for SatsSigned { impl Formattable for SatsSigned { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/satsfract.rs b/crates/brk_types/src/satsfract.rs index 061e8ea5e..8e8420aac 100644 --- a/crates/brk_types/src/satsfract.rs +++ b/crates/brk_types/src/satsfract.rs @@ -188,10 +188,9 @@ impl std::fmt::Display for SatsFract { impl Formattable for SatsFract { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_bool.rs b/crates/brk_types/src/stored_bool.rs index 4d7c8fe5b..2f2b41321 100644 --- a/crates/brk_types/src/stored_bool.rs +++ b/crates/brk_types/src/stored_bool.rs @@ -70,8 +70,7 @@ impl std::fmt::Display for StoredBool { impl Formattable for StoredBool { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - f.push_str(if self.is_true() { "true" } else { "false" }); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + buf.extend_from_slice(if self.is_true() { b"true" } else { b"false" }); } } diff --git a/crates/brk_types/src/stored_f32.rs b/crates/brk_types/src/stored_f32.rs index d466838a2..c7987e398 100644 --- a/crates/brk_types/src/stored_f32.rs +++ b/crates/brk_types/src/stored_f32.rs @@ -273,9 +273,8 @@ impl std::fmt::Display for StoredF32 { impl Formattable for StoredF32 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_f64.rs b/crates/brk_types/src/stored_f64.rs index 0ba6f7469..2c66347bc 100644 --- a/crates/brk_types/src/stored_f64.rs +++ b/crates/brk_types/src/stored_f64.rs @@ -246,9 +246,8 @@ impl std::fmt::Display for StoredF64 { impl Formattable for StoredF64 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = ryu::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = ryu::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_i16.rs b/crates/brk_types/src/stored_i16.rs index b4912c539..24a5593a1 100644 --- a/crates/brk_types/src/stored_i16.rs +++ b/crates/brk_types/src/stored_i16.rs @@ -117,9 +117,8 @@ impl std::fmt::Display for StoredI16 { impl Formattable for StoredI16 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_i64.rs b/crates/brk_types/src/stored_i64.rs index d185100d2..7c49f8e95 100644 --- a/crates/brk_types/src/stored_i64.rs +++ b/crates/brk_types/src/stored_i64.rs @@ -132,9 +132,8 @@ impl std::fmt::Display for StoredI64 { impl Formattable for StoredI64 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_i8.rs b/crates/brk_types/src/stored_i8.rs index 2b641ad27..87dbd1f9d 100644 --- a/crates/brk_types/src/stored_i8.rs +++ b/crates/brk_types/src/stored_i8.rs @@ -117,9 +117,8 @@ impl std::fmt::Display for StoredI8 { impl Formattable for StoredI8 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_u16.rs b/crates/brk_types/src/stored_u16.rs index d75b722ee..a4a3f9dee 100644 --- a/crates/brk_types/src/stored_u16.rs +++ b/crates/brk_types/src/stored_u16.rs @@ -208,9 +208,8 @@ impl std::fmt::Display for StoredU16 { impl Formattable for StoredU16 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_u32.rs b/crates/brk_types/src/stored_u32.rs index 09bd8282c..8d35f2e23 100644 --- a/crates/brk_types/src/stored_u32.rs +++ b/crates/brk_types/src/stored_u32.rs @@ -260,9 +260,8 @@ impl std::fmt::Display for StoredU32 { impl Formattable for StoredU32 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_u64.rs b/crates/brk_types/src/stored_u64.rs index af0f851bd..057c32387 100644 --- a/crates/brk_types/src/stored_u64.rs +++ b/crates/brk_types/src/stored_u64.rs @@ -275,9 +275,8 @@ impl std::fmt::Display for StoredU64 { impl Formattable for StoredU64 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/stored_u8.rs b/crates/brk_types/src/stored_u8.rs index 25b543e5b..2b932d045 100644 --- a/crates/brk_types/src/stored_u8.rs +++ b/crates/brk_types/src/stored_u8.rs @@ -108,9 +108,8 @@ impl std::fmt::Display for StoredU8 { impl Formattable for StoredU8 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/supply_state.rs b/crates/brk_types/src/supply_state.rs index 4da00ecd4..f322d5ecd 100644 --- a/crates/brk_types/src/supply_state.rs +++ b/crates/brk_types/src/supply_state.rs @@ -82,16 +82,28 @@ impl fmt::Display for SupplyState { } impl Formattable for SupplyState { - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { let start = f.len(); - write!(f, "{}", self)?; + self.fmt_into(f); if f.as_bytes()[start..].contains(&b',') { f.insert(start, '"'); f.push('"'); } Ok(()) } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); + } } impl Bytes for SupplyState { diff --git a/crates/brk_types/src/timestamp.rs b/crates/brk_types/src/timestamp.rs index 55c2cd594..80655bd90 100644 --- a/crates/brk_types/src/timestamp.rs +++ b/crates/brk_types/src/timestamp.rs @@ -189,9 +189,8 @@ impl std::fmt::Display for Timestamp { impl Formattable for Timestamp { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/txid.rs b/crates/brk_types/src/txid.rs index 173f6881f..82e1562af 100644 --- a/crates/brk_types/src/txid.rs +++ b/crates/brk_types/src/txid.rs @@ -84,9 +84,16 @@ impl<'de> Deserialize<'de> for Txid { } impl Formattable for Txid { - #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { + fn write_to(&self, buf: &mut Vec) { use std::fmt::Write; - write!(f, "{}", self) + let mut s = String::new(); + write!(s, "{}", self).unwrap(); + buf.extend_from_slice(s.as_bytes()); + } + + fn fmt_json(&self, buf: &mut Vec) { + buf.push(b'"'); + self.write_to(buf); + buf.push(b'"'); } } diff --git a/crates/brk_types/src/txindex.rs b/crates/brk_types/src/txindex.rs index 4d8a9f835..28832cad5 100644 --- a/crates/brk_types/src/txindex.rs +++ b/crates/brk_types/src/txindex.rs @@ -170,9 +170,8 @@ impl std::fmt::Display for TxIndex { impl Formattable for TxIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/txinindex.rs b/crates/brk_types/src/txinindex.rs index b7df41ffb..24a0c5ffe 100644 --- a/crates/brk_types/src/txinindex.rs +++ b/crates/brk_types/src/txinindex.rs @@ -131,9 +131,8 @@ impl std::fmt::Display for TxInIndex { impl Formattable for TxInIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/txoutindex.rs b/crates/brk_types/src/txoutindex.rs index e5e60a28a..2c40855ba 100644 --- a/crates/brk_types/src/txoutindex.rs +++ b/crates/brk_types/src/txoutindex.rs @@ -132,9 +132,8 @@ impl std::fmt::Display for TxOutIndex { impl Formattable for TxOutIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/txversion.rs b/crates/brk_types/src/txversion.rs index d2f2111ec..a11a1c2ae 100644 --- a/crates/brk_types/src/txversion.rs +++ b/crates/brk_types/src/txversion.rs @@ -65,9 +65,8 @@ impl std::fmt::Display for TxVersion { impl Formattable for TxVersion { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/typeindex.rs b/crates/brk_types/src/typeindex.rs index 3b6a7be88..81f9a12cd 100644 --- a/crates/brk_types/src/typeindex.rs +++ b/crates/brk_types/src/typeindex.rs @@ -147,9 +147,8 @@ impl std::fmt::Display for TypeIndex { impl Formattable for TypeIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/unknownoutputindex.rs b/crates/brk_types/src/unknownoutputindex.rs index ddf58fe93..dbef942f0 100644 --- a/crates/brk_types/src/unknownoutputindex.rs +++ b/crates/brk_types/src/unknownoutputindex.rs @@ -79,7 +79,7 @@ impl std::fmt::Display for UnknownOutputIndex { impl Formattable for UnknownOutputIndex { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - self.0.fmt_csv(f) + fn write_to(&self, buf: &mut Vec) { + self.0.write_to(buf); } } diff --git a/crates/brk_types/src/vout.rs b/crates/brk_types/src/vout.rs index 6fb0fdf64..ffba19f48 100644 --- a/crates/brk_types/src/vout.rs +++ b/crates/brk_types/src/vout.rs @@ -98,9 +98,8 @@ impl std::fmt::Display for Vout { impl Formattable for Vout { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/vsize.rs b/crates/brk_types/src/vsize.rs index bc15897b0..fec226b09 100644 --- a/crates/brk_types/src/vsize.rs +++ b/crates/brk_types/src/vsize.rs @@ -121,9 +121,8 @@ impl std::fmt::Display for VSize { impl Formattable for VSize { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/week1.rs b/crates/brk_types/src/week1.rs index 001e85e08..5886d3967 100644 --- a/crates/brk_types/src/week1.rs +++ b/crates/brk_types/src/week1.rs @@ -145,9 +145,8 @@ impl std::fmt::Display for Week1 { impl Formattable for Week1 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/weight.rs b/crates/brk_types/src/weight.rs index f53f5d2a2..83332452c 100644 --- a/crates/brk_types/src/weight.rs +++ b/crates/brk_types/src/weight.rs @@ -137,9 +137,8 @@ impl std::fmt::Display for Weight { impl Formattable for Weight { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/year.rs b/crates/brk_types/src/year.rs index 0072722b5..4c34a3d6f 100644 --- a/crates/brk_types/src/year.rs +++ b/crates/brk_types/src/year.rs @@ -124,9 +124,8 @@ impl std::fmt::Display for Year { impl Formattable for Year { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/year1.rs b/crates/brk_types/src/year1.rs index 9ba687c4b..b27cbc789 100644 --- a/crates/brk_types/src/year1.rs +++ b/crates/brk_types/src/year1.rs @@ -142,9 +142,8 @@ impl std::fmt::Display for Year1 { impl Formattable for Year1 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } } diff --git a/crates/brk_types/src/year10.rs b/crates/brk_types/src/year10.rs index 2a3565c15..8aad0843d 100644 --- a/crates/brk_types/src/year10.rs +++ b/crates/brk_types/src/year10.rs @@ -144,9 +144,8 @@ impl std::fmt::Display for Year10 { impl Formattable for Year10 { #[inline(always)] - fn fmt_csv(&self, f: &mut String) -> std::fmt::Result { - let mut buf = itoa::Buffer::new(); - f.push_str(buf.format(self.0)); - Ok(()) + fn write_to(&self, buf: &mut Vec) { + let mut b = itoa::Buffer::new(); + buf.extend_from_slice(b.format(self.0).as_bytes()); } }