[INFO] fetching crate diffly 0.2.0...
[INFO] checking diffly-0.2.0 against master#8a703520e80d87d4423c01f9d4fbc9e5f6533a02 for pr-154205-1
[INFO] extracting crate diffly 0.2.0 into /workspace/builds/worker-6-tc1/source
[INFO] started tweaking crates.io crate diffly 0.2.0
[INFO] removed 0 missing examples
[INFO] finished tweaking crates.io crate diffly 0.2.0
[INFO] tweaked toml for crates.io crate diffly 0.2.0 written to /workspace/builds/worker-6-tc1/source/Cargo.toml
[INFO] validating manifest of crates.io crate diffly 0.2.0 on toolchain 8a703520e80d87d4423c01f9d4fbc9e5f6533a02
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate diffly 0.2.0 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr] Updating crates.io index
[INFO] [stderr] Downloading crates ...
[INFO] [stderr] Downloaded zmij v1.0.20
[INFO] [stderr] Downloaded vte v0.10.1
[INFO] [stderr] Downloaded ansi-str v0.8.0
[INFO] [stderr] Downloaded tabled_derive v0.9.0
[INFO] [stderr] Downloaded redox_syscall v0.7.1
[INFO] [stderr] Downloaded sailfish-macros v0.10.1
[INFO] [stderr] Downloaded ansitok v0.2.0
[INFO] [stderr] Downloaded sailfish v0.10.1
[INFO] [stderr] Downloaded sailfish-compiler v0.10.1
[INFO] [stderr] Downloaded toml_parser v1.0.7+spec-1.1.0
[INFO] [stderr] Downloaded papergrid v0.13.0
[INFO] [stderr] Downloaded itoap v1.0.1
[INFO] [stderr] Downloaded rsa v0.9.10
[INFO] [stderr] Downloaded tabled v0.17.0
[INFO] [stderr] Downloaded libc v0.2.181
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] 049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c
[INFO] running `Command { std: "docker" "start" "-a" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }`
[INFO] [stdout] 049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] 25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec
[INFO] running `Command { std: "docker" "start" "-a" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }`
[INFO] [stderr] Compiling proc-macro2 v1.0.106
[INFO] [stderr] Compiling libc v0.2.181
[INFO] [stderr] Compiling serde_core v1.0.228
[INFO] [stderr] Checking smallvec v1.15.1
[INFO] [stderr] Compiling serde v1.0.228
[INFO] [stderr] Compiling crossbeam-utils v0.8.21
[INFO] [stderr] Compiling getrandom v0.3.4
[INFO] [stderr] Compiling toml_write v0.1.2
[INFO] [stderr] Compiling winnow v0.7.14
[INFO] [stderr] Compiling zmij v1.0.20
[INFO] [stderr] Compiling indexmap v2.13.0
[INFO] [stderr] Compiling serde_json v1.0.149
[INFO] [stderr] Compiling sailfish-compiler v0.10.1
[INFO] [stderr] Compiling rustls v0.23.36
[INFO] [stderr] Compiling cfg-if v1.0.4
[INFO] [stderr] Checking form_urlencoded v1.2.2
[INFO] [stderr] Checking futures-io v0.3.31
[INFO] [stderr] Checking futures-sink v0.3.31
[INFO] [stderr] Checking parking v2.2.1
[INFO] [stderr] Compiling home v0.5.12
[INFO] [stderr] Checking crc v3.4.0
[INFO] [stderr] Checking futures-util v0.3.31
[INFO] [stderr] Checking sha2 v0.10.9
[INFO] [stderr] Checking webpki-roots v0.26.11
[INFO] [stderr] Checking hashlink v0.10.0
[INFO] [stderr] Compiling sailfish v0.10.1
[INFO] [stderr] Checking unicode-segmentation v1.12.0
[INFO] [stderr] Checking base64 v0.22.1
[INFO] [stderr] Checking option-ext v0.2.0
[INFO] [stderr] Checking pathdiff v0.2.3
[INFO] [stderr] Checking ryu v1.0.23
[INFO] [stderr] Checking itoap v1.0.1
[INFO] [stderr] Checking concurrent-queue v2.5.0
[INFO] [stderr] Checking crossbeam-queue v0.3.12
[INFO] [stderr] Checking convert_case v0.6.0
[INFO] [stderr] Checking event-listener v5.4.1
[INFO] [stderr] Compiling quote v1.0.44
[INFO] [stderr] Compiling syn v2.0.114
[INFO] [stderr] Compiling filetime v0.2.27
[INFO] [stderr] Checking toml_parser v1.0.7+spec-1.1.0
[INFO] [stderr] Checking parking_lot_core v0.9.12
[INFO] [stderr] Checking getrandom v0.2.17
[INFO] [stderr] Checking errno v0.3.14
[INFO] [stderr] Checking mio v1.1.1
[INFO] [stderr] Checking socket2 v0.6.2
[INFO] [stderr] Checking dirs-sys v0.4.1
[INFO] [stderr] Checking ring v0.17.14
[INFO] [stderr] Checking signal-hook-registry v1.4.8
[INFO] [stderr] Checking dirs v5.0.1
[INFO] [stderr] Checking parking_lot v0.12.5
[INFO] [stderr] Checking tempfile v3.25.0
[INFO] [stderr] Checking futures-intrusive v0.5.0
[INFO] [stderr] Checking uuid v1.20.0
[INFO] [stderr] Checking serde_spanned v1.0.4
[INFO] [stderr] Checking toml_datetime v0.7.5+spec-1.1.0
[INFO] [stderr] Checking toml v0.9.12+spec-1.1.0
[INFO] [stderr] Checking rustls-webpki v0.103.9
[INFO] [stderr] Checking config v0.15.19
[INFO] [stderr] Compiling synstructure v0.13.2
[INFO] [stderr] Compiling zerovec-derive v0.11.2
[INFO] [stderr] Compiling serde_derive v1.0.228
[INFO] [stderr] Compiling displaydoc v0.2.5
[INFO] [stderr] Compiling tokio-macros v2.6.0
[INFO] [stderr] Compiling thiserror-impl v2.0.18
[INFO] [stderr] Compiling tracing-attributes v0.1.31
[INFO] [stderr] Compiling async-trait v0.1.89
[INFO] [stderr] Compiling zerofrom-derive v0.1.6
[INFO] [stderr] Compiling yoke-derive v0.8.1
[INFO] [stderr] Checking tokio v1.49.0
[INFO] [stderr] Checking thiserror v2.0.18
[INFO] [stderr] Checking zerofrom v0.1.6
[INFO] [stderr] Checking tracing v0.1.44
[INFO] [stderr] Checking yoke v0.8.1
[INFO] [stderr] Checking zerovec v0.11.5
[INFO] [stderr] Checking zerotrie v0.2.3
[INFO] [stderr] Checking tinystr v0.8.2
[INFO] [stderr] Checking potential_utf v0.1.4
[INFO] [stderr] Checking icu_collections v2.1.1
[INFO] [stderr] Checking icu_locale_core v2.1.1
[INFO] [stderr] Checking icu_provider v2.1.1
[INFO] [stderr] Checking icu_properties v2.1.2
[INFO] [stderr] Checking icu_normalizer v2.1.1
[INFO] [stderr] Checking either v1.15.0
[INFO] [stderr] Checking chrono v0.4.43
[INFO] [stderr] Compiling serde_spanned v0.6.9
[INFO] [stderr] Compiling toml_datetime v0.6.11
[INFO] [stderr] Compiling toml_edit v0.22.27
[INFO] [stderr] Checking idna_adapter v1.2.1
[INFO] [stderr] Checking idna v1.1.0
[INFO] [stderr] Checking url v2.5.8
[INFO] [stderr] Checking tokio-stream v0.1.18
[INFO] [stderr] Checking sqlx-core v0.8.6
[INFO] [stderr] Compiling toml v0.8.23
[INFO] [stderr] Compiling sailfish-macros v0.10.1
[INFO] [stderr] Checking sqlx v0.8.6
[INFO] [stderr] Checking diffly v0.2.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unnecessary braces around block return value
[INFO] [stdout] --> /opt/rustwide/target/debug/build/sailfish-compiler-538dd34e892f4514/out/templates/acb4512fb34a59c6-1811e2eaaa1204b8:2:19186
[INFO] [stdout] |
[INFO] [stdout] 2 | ... ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __...
[INFO] [stdout] | ^^ ^^
[INFO] [stdout] |
[INFO] [stdout] = note: `#[warn(unused_braces)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: remove these braces
[INFO] [stdout] |
[INFO] [stdout] 2 - { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n\n
\n
Diffly
\n \n \n
📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n \n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
Updates
\n
\n \n \n | PK | Column | Before | After | \n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } }
[INFO] [stdout] 2 + { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n\n
\n
Diffly
\n \n \n
📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n \n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
Updates
\n
\n \n \n | PK | Column | Before | After | \n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } }
[INFO] [stdout] |
[INFO] [stdout]
[INFO] [stdout]
[INFO] [stdout] warning: unnecessary braces around block return value
[INFO] [stdout] --> /opt/rustwide/target/debug/build/sailfish-compiler-538dd34e892f4514/out/templates/acb4512fb34a59c6-1811e2eaaa1204b8:2:19186
[INFO] [stdout] |
[INFO] [stdout] 2 | ... ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __...
[INFO] [stdout] | ^^ ^^
[INFO] [stdout] |
[INFO] [stdout] = note: `#[warn(unused_braces)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] help: remove these braces
[INFO] [stdout] |
[INFO] [stdout] 2 - { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n\n
\n
Diffly
\n \n \n
📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n \n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
Updates
\n
\n \n \n | PK | Column | Before | After | \n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } }
[INFO] [stdout] 2 + { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n\n
\n
Diffly
\n \n \n
📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n \n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
Updates
\n
\n \n \n | PK | Column | Before | After | \n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n | \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n
⏱ Performance
\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n
\n \n \n | Operation | \n Table | \n Rows | \n Time (ms) | \n
\n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n | ") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , " | \n ") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , " | \n
\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } }
[INFO] [stdout] |
[INFO] [stdout]
[INFO] [stdout]
[INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 21.88s
[INFO] running `Command { std: "docker" "inspect" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }`
[INFO] [stdout] 25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec