diff --git a/Cargo.lock b/Cargo.lock index 991eb26e..6456c685 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -360,6 +360,7 @@ dependencies = [ "console", "csv", "globset", + "json-pretty-compact", "once_cell", "pest", "pest_derive", @@ -367,6 +368,7 @@ dependencies = [ "ron", "rustc_version", "serde", + "serde_json", "similar", "similar-asserts", "toml", @@ -444,6 +446,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" +[[package]] +name = "json-pretty-compact" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62a9c1f06b173b0da0ccc8cae00599d7b3ceda6e76d68be9b6bc2c941adafe0e" +dependencies = [ + "serde_json", + "thiserror", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -677,18 +689,28 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.164" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -697,13 +719,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.85" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa 1.0.3", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -778,18 +802,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", diff --git a/insta/Cargo.toml b/insta/Cargo.toml index 3ea73abe..ce173fe1 100644 --- a/insta/Cargo.toml +++ b/insta/Cargo.toml @@ -39,6 +39,7 @@ json = ["serde"] ron = ["dep:ron", "serde"] toml = ["dep:toml", "serde"] yaml = ["serde"] +json-pretty-compact = ["dep:json-pretty-compact", "dep:serde_json", "serde"] # internal feature exclusive to cargo-insta _cargo_insta_internal = ["clap"] @@ -60,6 +61,8 @@ regex = { version = "1.6.0", default-features = false, optional = true, features serde = { version = "1.0.117", optional = true } once_cell = "1.20.2" clap = { workspace = true, optional = true } +serde_json = { version = "1.0.145", optional = true } +json-pretty-compact = { version = "0.1.2", optional = true } [dev-dependencies] rustc_version = "0.4.0" diff --git a/insta/src/macros.rs b/insta/src/macros.rs index 3898d93d..d04467b1 100644 --- a/insta/src/macros.rs +++ b/insta/src/macros.rs @@ -240,6 +240,15 @@ macro_rules! assert_compact_json_snapshot { }; } +#[cfg(feature = "json-pretty-compact")] +#[cfg_attr(docsrs, doc(cfg(feature = "json")))] +#[macro_export] +macro_rules! assert_compact_pretty_json_snapshot { + ($($arg:tt)*) => { + $crate::_assert_serialized_snapshot!(format=JsonPrettyCompact, $($arg)*); + }; +} + // This macro handles optional trailing commas. #[doc(hidden)] #[macro_export] diff --git a/insta/src/serialization.rs b/insta/src/serialization.rs index 48f64c9d..cc966992 100644 --- a/insta/src/serialization.rs +++ b/insta/src/serialization.rs @@ -14,6 +14,8 @@ pub enum SerializationFormat { Yaml, Json, JsonCompact, + #[cfg(feature = "json-pretty-compact")] + JsonPrettyCompact, } #[derive(Debug)] @@ -40,6 +42,16 @@ pub fn serialize_content(mut content: Content, format: SerializationFormat) -> S SerializationFormat::Yaml => yaml::to_string(&content)[4..].to_string(), SerializationFormat::Json => json::to_string_pretty(&content), SerializationFormat::JsonCompact => json::to_string_compact(&content), + #[cfg(feature = "json-pretty-compact")] + SerializationFormat::JsonPrettyCompact => { + let mut buf = Vec::new(); + let mut ser = serde_json::Serializer::with_formatter( + &mut buf, + json_pretty_compact::PrettyCompactFormatter::new(), + ); + content.serialize(&mut ser).unwrap(); + String::from_utf8(buf).unwrap() + } #[cfg(feature = "csv")] SerializationFormat::Csv => { let mut buf = Vec::with_capacity(128);