diff --git a/Cargo.lock b/Cargo.lock index 35cbaec..ed44430 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -49,12 +49,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -72,9 +66,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -87,9 +81,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -102,29 +96,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -146,9 +140,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -173,9 +167,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -183,7 +177,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.0", ] [[package]] @@ -222,9 +216,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block-buffer" @@ -246,9 +240,9 @@ dependencies = [ [[package]] name = "build-target" -version = "0.4.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832133bbabbbaa9fbdba793456a2827627a7d2b8fb96032fa1e7666d7895832b" +checksum = "78e2ceaf91e22593e194211930aea78a41af58e49e872474ebf4335bf649aad1" [[package]] name = "bumpalo" @@ -258,9 +252,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "bytes" @@ -312,10 +306,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.29" +version = "1.2.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -323,9 +318,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -335,17 +330,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -387,9 +381,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -397,9 +391,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -409,14 +403,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -482,9 +476,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -588,8 +582,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -603,7 +607,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", ] [[package]] @@ -612,9 +630,20 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", ] [[package]] @@ -635,23 +664,23 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -669,10 +698,10 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -682,7 +711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -702,7 +731,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -723,7 +752,7 @@ checksum = "133a7fa5cffeec6867fb2847335ec2d688f5bbee6318889d2a137ce1d226b180" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -775,8 +804,8 @@ checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", - "redox_users 0.5.0", - "windows-sys 0.60.2", + "redox_users 0.5.2", + "windows-sys 0.61.1", ] [[package]] @@ -798,7 +827,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -821,7 +850,7 @@ checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -838,9 +867,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "either" @@ -874,7 +903,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -919,12 +948,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.1", ] [[package]] @@ -973,23 +1002,29 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + [[package]] name = "flatbuffers" -version = "25.2.10" +version = "25.9.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1045398c1bfd89168b5fd3f1fc11f6e70b34f6f66300c87d44d3de849463abf1" +checksum = "09b6620799e7340ebd9968d2e0708eb82cf1971e9a16821e2091b6d6e475eed5" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "rustc_version", ] @@ -1029,9 +1064,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1092,7 +1127,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1158,7 +1193,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -1171,20 +1206,20 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1192,7 +1227,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1226,9 +1261,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "hashlink" @@ -1390,19 +1425,21 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1422,7 +1459,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -1443,9 +1480,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64", "bytes", @@ -1469,9 +1506,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1591,9 +1628,9 @@ checksum = "dfdd7caa900436d8f13b2346fe10257e0c05c1f1f9e351f4f5d57c03bd5f45da" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1642,13 +1679,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -1693,11 +1731,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -1771,14 +1809,14 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -1786,9 +1824,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1802,7 +1840,7 @@ checksum = "ccfb0b7ce7938f84a5ecbdca5d0a991e46bc9d6d078934ad5e92c5270fe547db" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1838,15 +1876,15 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libbz2-rs-sys" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" +checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libloading" @@ -1860,19 +1898,19 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-link 0.2.0", ] [[package]] name = "liblzma" -version = "0.4.2" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0791ab7e08ccc8e0ce893f6906eb2703ed8739d8e89b57c0714e71bad09024c8" +checksum = "73c36d08cad03a3fbe2c4e7bb3a9e84c57e4ee4135ed0b065cade3d98480c648" dependencies = [ "liblzma-sys", ] @@ -1896,13 +1934,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", ] [[package]] @@ -1928,9 +1966,9 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" dependencies = [ "zlib-rs", ] @@ -1960,9 +1998,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -1982,9 +2020,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru-slab" @@ -2003,11 +2041,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -2028,15 +2066,15 @@ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -2073,7 +2111,7 @@ version = "0.59.3" dependencies = [ "base16ct", "base64-simd", - "bitflags 2.9.1", + "bitflags 2.9.4", "bytemuck", "chrono", "clap", @@ -2085,8 +2123,8 @@ dependencies = [ "hdf5", "hdf5-sys", "identity-hash", - "indexmap 2.10.0", - "libloading 0.8.8", + "indexmap 2.11.4", + "libloading 0.8.9", "libz-sys", "log", "md5", @@ -2110,7 +2148,7 @@ dependencies = [ "tempfile", "test-log", "thermorawfilereader", - "thiserror 2.0.12", + "thiserror 2.0.17", "timsrust", "tokio", "zstd", @@ -2129,9 +2167,9 @@ dependencies = [ [[package]] name = "mzsignal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6198b598306bc2cc12197ce7e09a114b3f0503b7f002d3ecd2936261881d4f0" +checksum = "6d1bba49ea594cc8898df3977f9c2195ada0da4ee2ef2d057c41f00d1402d271" dependencies = [ "cfg-if", "libm", @@ -2143,7 +2181,7 @@ dependencies = [ "num-traits", "rayon", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -2170,7 +2208,7 @@ checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2238,15 +2276,15 @@ dependencies = [ "nethost-sys", "num_enum", "once_cell", - "thiserror 2.0.12", + "thiserror 2.0.17", "widestring", ] [[package]] name = "nethost-sys" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612f9cfa04414f0a5231607641d50f9c76e67299afc71aec8f680b82a5be142c" +checksum = "f06c88d4ba240e6bb908f9225095d32077eb427789697d435b19b6211627f581" dependencies = [ "build-target", "cargo-emit", @@ -2269,12 +2307,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -2351,7 +2388,7 @@ checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2362,9 +2399,9 @@ checksum = "a2dcdf7709b8d8f136a3e084c019e31add1505408f2670263fba9475e882bb46" [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -2431,23 +2468,23 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "openblas-build" -version = "0.10.12" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d313e94cc8dd9212790bd697ed547f7019309462693a1bfbc2312dae970b24a" +checksum = "9bc3f001b5b7e354f30da04b91978523092224e4f71d017a28fd0da9474449c6" dependencies = [ "anyhow", "cc", "flate2", "tar", - "thiserror 2.0.12", - "ureq 3.0.12", + "thiserror 2.0.17", + "ureq 3.1.2", ] [[package]] name = "openblas-src" -version = "0.10.12" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659be974d3226615ca8d47b7e4eda2f1bdbfdbb5866f61c04b2ec9df34ed03f2" +checksum = "08d348e7a5bfbc68f6068d6c46543a2abcd8121e2925715a69000013aba8f29e" dependencies = [ "dirs", "openblas-build", @@ -2461,7 +2498,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -2478,7 +2515,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2511,12 +2548,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parking_lot" version = "0.11.2" @@ -2560,7 +2591,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -2592,9 +2623,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" @@ -2659,9 +2690,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -2706,14 +2737,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2731,9 +2762,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -2743,7 +2774,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -2751,20 +2782,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -2772,23 +2803,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -2812,9 +2843,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -2866,9 +2897,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -2876,9 +2907,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2895,11 +2926,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", ] [[package]] @@ -2915,84 +2946,69 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64", "bytes", @@ -3031,7 +3047,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] @@ -3054,7 +3070,7 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -3064,9 +3080,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -3085,22 +3101,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.1", - "errno 0.3.13", + "bitflags 2.9.4", + "errno 0.3.14", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "log", "once_cell", @@ -3132,9 +3148,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -3143,9 +3159,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -3173,11 +3189,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] @@ -3216,7 +3232,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "libc", @@ -3225,9 +3241,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -3235,16 +3251,17 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -3257,27 +3274,37 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -3303,15 +3330,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.4", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -3323,14 +3350,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3372,9 +3399,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx 0.5.1", "num-complex", @@ -3391,9 +3418,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -3403,12 +3430,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3439,7 +3466,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3461,9 +3488,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -3487,7 +3514,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3496,7 +3523,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "system-configuration-sys", ] @@ -3524,15 +3551,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.20.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] @@ -3554,7 +3581,7 @@ checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3580,11 +3607,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -3595,18 +3622,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3620,9 +3647,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -3635,15 +3662,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -3686,9 +3713,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -3701,9 +3728,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -3714,7 +3741,7 @@ dependencies = [ "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3725,7 +3752,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3740,9 +3767,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -3750,9 +3777,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -3788,7 +3815,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "serde", "serde_spanned", "toml_datetime", @@ -3823,7 +3850,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", "futures-util", "http", @@ -3880,14 +3907,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "thread_local", "tracing", @@ -3909,9 +3936,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-xid" @@ -3945,9 +3972,9 @@ dependencies = [ [[package]] name = "ureq" -version = "3.0.12" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f0fde9bc91026e381155f8c67cb354bcd35260b2f4a29bcc84639f762760c39" +checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" dependencies = [ "base64", "der", @@ -3958,14 +3985,14 @@ dependencies = [ "rustls-pki-types", "ureq-proto", "utf-8", - "webpki-root-certs 0.26.11", + "webpki-root-certs", ] [[package]] name = "ureq-proto" -version = "0.4.2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59db78ad1923f2b1be62b6da81fe80b173605ca0d57f85da2e005382adf693f7" +checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" dependencies = [ "base64", "http", @@ -3975,13 +4002,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -4004,9 +4032,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -4064,44 +4092,54 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen-rt", + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -4112,9 +4150,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4122,31 +4160,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -4164,18 +4202,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "0.26.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" -dependencies = [ - "webpki-root-certs 1.0.1", -] - -[[package]] -name = "webpki-root-certs" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86138b15b2b7d561bc4469e77027b8dd005a43dc502e9031d1f5afc8ce1f280e" +checksum = "4e4ffd8df1c57e87c325000a3d6ef93db75279dc3a231125aac571650f22b12a" dependencies = [ "rustls-pki-types", ] @@ -4186,14 +4215,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.2", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -4232,11 +4261,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.1", ] [[package]] @@ -4247,37 +4276,37 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4286,15 +4315,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-registry" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -4303,7 +4338,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -4312,7 +4356,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -4348,7 +4401,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.4", +] + +[[package]] +name = "windows-sys" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -4384,10 +4446,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ + "windows-link 0.2.0", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -4538,9 +4601,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -4556,13 +4619,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -4572,9 +4632,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "xattr" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", "rustix", @@ -4600,28 +4660,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4641,15 +4701,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -4662,7 +4722,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4678,9 +4738,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -4695,14 +4755,14 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "zip" -version = "4.3.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" +checksum = "caa8cd6af31c3b31c6631b8f483848b91589021b28fffe50adada48d4f4d2ed1" dependencies = [ "aes", "arbitrary", @@ -4713,7 +4773,7 @@ dependencies = [ "flate2", "getrandom 0.3.3", "hmac", - "indexmap 2.10.0", + "indexmap 2.11.4", "liblzma", "memchr", "pbkdf2", @@ -4727,9 +4787,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" @@ -4763,9 +4823,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index be157a4..1f7dc06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mzdata" version = "0.59.3" -edition = "2021" +edition = "2024" keywords = ['mass-spectrometry', 'mzml', 'mgf'] categories = ["science", "parser-implementations", "data-structures"] diff --git a/benches/mzml.rs b/benches/mzml.rs index 0f6d25c..4d70542 100644 --- a/benches/mzml.rs +++ b/benches/mzml.rs @@ -1,4 +1,4 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, black_box, criterion_group, criterion_main}; use std::fs; diff --git a/examples/async_mzcat.rs b/examples/async_mzcat.rs index ae3c942..dae64a0 100644 --- a/examples/async_mzcat.rs +++ b/examples/async_mzcat.rs @@ -48,7 +48,8 @@ async fn scan_file(reader: &mut mzml::AsyncMzMLReader) { #[tokio::main(flavor = "multi_thread", worker_threads = 10)] async fn main() -> io::Result<()> { let path = path::PathBuf::from( - env::args().nth(1) + env::args() + .nth(1) .expect("Please pass an MS data file path"), ); if let Some(ext) = path.extension() { diff --git a/examples/from_stdin.rs b/examples/from_stdin.rs index 87cd347..9c9eede 100644 --- a/examples/from_stdin.rs +++ b/examples/from_stdin.rs @@ -5,8 +5,8 @@ use std::io::{self, Seek}; use std::time::Instant; use mzdata::io::{ - infer_from_stream, MassSpectrometryFormat, PreBufferedStream, RestartableGzDecoder, - SpectrumSource, + MassSpectrometryFormat, PreBufferedStream, RestartableGzDecoder, SpectrumSource, + infer_from_stream, }; use mzdata::{MGFReader, MzMLReader}; diff --git a/examples/get_scan_by.rs b/examples/get_scan_by.rs index 3f04ccf..d56d842 100644 --- a/examples/get_scan_by.rs +++ b/examples/get_scan_by.rs @@ -34,8 +34,16 @@ fn main() -> io::Result<()> { }; // dbg!(spectrum); - println!("ID: {}; Index: {}; Time: {}", spectrum.id(), spectrum.index(), spectrum.start_time()); - println!("Num data points: {}", spectrum.raw_arrays().unwrap().mzs().unwrap().len()); + println!( + "ID: {}; Index: {}; Time: {}", + spectrum.id(), + spectrum.index(), + spectrum.start_time() + ); + println!( + "Num data points: {}", + spectrum.raw_arrays().unwrap().mzs().unwrap().len() + ); Ok(()) } diff --git a/examples/infer_format.rs b/examples/infer_format.rs index 360e3ae..a3bd611 100644 --- a/examples/infer_format.rs +++ b/examples/infer_format.rs @@ -6,7 +6,7 @@ use std::env; use std::io; use std::process::exit; -use mzdata::io::{infer_format, infer_from_stream, PreBufferedStream}; +use mzdata::io::{PreBufferedStream, infer_format, infer_from_stream}; fn main() -> io::Result<()> { let input = env::args().nth(1).unwrap_or_else(|| { diff --git a/examples/mzcat.rs b/examples/mzcat.rs index cb48790..ef6f47a 100644 --- a/examples/mzcat.rs +++ b/examples/mzcat.rs @@ -2,7 +2,7 @@ use std::time; use std::{env, io, path}; use mzdata::spectrum::MultiLayerSpectrum; -use mzdata::{prelude::*, MZReader}; +use mzdata::{MZReader, prelude::*}; use rayon::prelude::*; fn scan_file + Send>(reader: &mut R) { diff --git a/examples/mzconvert.rs b/examples/mzconvert.rs index f8e7303..4ea9613 100644 --- a/examples/mzconvert.rs +++ b/examples/mzconvert.rs @@ -2,7 +2,11 @@ use std::any::Any; use std::fs::File; use std::io; use std::path::PathBuf; -use std::sync::{mpsc::sync_channel, Arc, atomic::{AtomicU64, Ordering as AtomicOrdering}}; +use std::sync::{ + Arc, + atomic::{AtomicU64, Ordering as AtomicOrdering}, + mpsc::sync_channel, +}; use std::thread; use std::time; @@ -10,19 +14,19 @@ use clap::Parser; use log::info; use mzdata::io::MassSpectrometryFormat; -use mzdata::io::{checksum_file, MassSpectrometryReadWriteProcess, Sink, Source}; -use mzdata::meta::custom_software_name; +use mzdata::io::{MassSpectrometryReadWriteProcess, Sink, Source, checksum_file}; use mzdata::meta::Software; +use mzdata::meta::custom_software_name; use mzdata::meta::{DataProcessing, ProcessingMethod, SourceFile}; use mzdata::params::ControlledVocabulary; use mzdata::prelude::*; -use mzdata::spectrum::bindata::BinaryCompressionType; +use mzdata::MzMLWriter; use mzdata::spectrum::ArrayType; use mzdata::spectrum::ArrayType::IntensityArray; use mzdata::spectrum::ArrayType::MZArray; use mzdata::spectrum::BinaryDataArrayType; -use mzdata::MzMLWriter; +use mzdata::spectrum::bindata::BinaryCompressionType; use mzpeaks::{CentroidPeak, DeconvolutedPeak}; fn compression_parser(compression: &str) -> Result { @@ -32,9 +36,11 @@ fn compression_parser(compression: &str) -> Result io::Result<()> { let (send, recv) = sync_channel(self.buffer_size); - let buffered= Arc::new(AtomicU64::default()); + let buffered = Arc::new(AtomicU64::default()); let buffered_w = Arc::clone(&buffered); let reader_handle = thread::spawn(move || { reader.enumerate().for_each(|(i, s)| { @@ -111,9 +117,10 @@ impl MZConvert { for s in recv.iter() { let i = s.index(); buffered_w.fetch_sub(1, AtomicOrdering::SeqCst); - writer.write_owned(s).inspect_err(|e| { - log::error!("Failed to write spectrum {i}: {e}") - }).unwrap(); + writer + .write_owned(s) + .inspect_err(|e| log::error!("Failed to write spectrum {i}: {e}")) + .unwrap(); } writer.close().unwrap(); }); @@ -190,7 +197,6 @@ impl MZConvert { self.ion_mobility_compression, ); } - } } } @@ -251,7 +257,7 @@ impl MassSpectrometryReadWriteProcess for MZConv Default::default() } else { info!("Computing checksum for {}", pb.display()); - + checksum_file(&pb)? }; let has_already = reader diff --git a/examples/mzinfo.rs b/examples/mzinfo.rs index 16c5bcf..6427784 100644 --- a/examples/mzinfo.rs +++ b/examples/mzinfo.rs @@ -8,12 +8,12 @@ use std::time; use std::sync::mpsc::sync_channel; +use mzdata::MZReader; use mzdata::io::Source; use mzdata::prelude::*; use mzdata::spectrum::{ DeconvolutedSpectrum, MultiLayerSpectrum, RefPeakDataLevel, SignalContinuity, SpectrumLike, }; -use mzdata::MZReader; struct MSDataFileSummary { pub start_time: f64, @@ -22,7 +22,7 @@ struct MSDataFileSummary { pub charge_table: HashMap, pub peak_charge_table: HashMap>, pub peak_mode_table: HashMap, - pub has_ion_mobility: bool + pub has_ion_mobility: bool, } impl Default for MSDataFileSummary { @@ -112,11 +112,10 @@ impl MSDataFileSummary { let start = time::Instant::now(); let (sender, receiver) = sync_channel(2usize.pow(12)); let read_handle = spawn(move || { - reader.into_iter() + reader + .into_iter() .enumerate() - .for_each(|(i, scan)| { - sender.send((i, scan)).unwrap() - }); + .for_each(|(i, scan)| sender.send((i, scan)).unwrap()); }); let i = receiver.iter().fold(0, |_, (i, scan)| { if i % 10000 == 0 && i > 0 { @@ -134,7 +133,10 @@ impl MSDataFileSummary { read_handle.join().unwrap(); let end = time::Instant::now(); let elapsed = end - start; - println!("{:0.3} seconds elapsed, handled {i} spectra", elapsed.as_secs_f64()); + println!( + "{:0.3} seconds elapsed, handled {i} spectra", + elapsed.as_secs_f64() + ); } pub fn write_out(&self) { diff --git a/src/io/compression.rs b/src/io/compression.rs index 422ee70..6f65ecc 100644 --- a/src/io/compression.rs +++ b/src/io/compression.rs @@ -115,4 +115,4 @@ mod test { assert!(buf.contains("controllerType=0 controllerNumber=1 scan=1")); Ok(()) } -} \ No newline at end of file +} diff --git a/src/io/infer_format/dispatch.rs b/src/io/infer_format/dispatch.rs index 29268cb..392c7ca 100644 --- a/src/io/infer_format/dispatch.rs +++ b/src/io/infer_format/dispatch.rs @@ -1,20 +1,35 @@ #![allow(clippy::type_complexity, clippy::large_enum_variant)] -use std::{fmt::Debug, fs, io, marker::PhantomData, path::{self, Path}}; +use std::{ + fmt::Debug, + fs, io, + marker::PhantomData, + path::{self, Path}, +}; use flate2::read::GzDecoder; -use mzpeaks::{prelude::FeatureLike, CentroidLike, CentroidPeak, DeconvolutedCentroidLike, DeconvolutedPeak, KnownCharge}; -use mzpeaks::{feature::{ChargedFeature, Feature}, IonMobility, Mass, MZ}; +use mzpeaks::{ + CentroidLike, CentroidPeak, DeconvolutedCentroidLike, DeconvolutedPeak, KnownCharge, + prelude::FeatureLike, +}; +use mzpeaks::{ + IonMobility, MZ, Mass, + feature::{ChargedFeature, Feature}, +}; -#[allow(unused)] -use crate::{io::{Generic3DIonMobilityFrameSource, - IonMobilityFrameSource, - IntoIonMobilityFrameSource, - PreBufferedStream, - RandomAccessIonMobilityFrameIterator}, - spectrum::MultiLayerIonMobilityFrame}; -use crate::io::{traits::{MZFileReader, RandomAccessSpectrumIterator, SpectrumSource}, RestartableGzDecoder}; #[cfg(feature = "mzmlb")] pub use crate::io::mzmlb::MzMLbReaderType; +use crate::io::{ + RestartableGzDecoder, + traits::{MZFileReader, RandomAccessSpectrumIterator, SpectrumSource}, +}; +#[allow(unused)] +use crate::{ + io::{ + Generic3DIonMobilityFrameSource, IntoIonMobilityFrameSource, IonMobilityFrameSource, + PreBufferedStream, RandomAccessIonMobilityFrameIterator, + }, + spectrum::MultiLayerIonMobilityFrame, +}; #[cfg(feature = "mgf")] use crate::io::mgf::MGFReaderType; @@ -22,20 +37,19 @@ use crate::io::mgf::MGFReaderType; use crate::io::mzml::MzMLReaderType; use crate::meta::MSDataFileMetadata; -use crate::spectrum::bindata::BuildFromArrayMap; use crate::spectrum::MultiLayerSpectrum; +use crate::spectrum::bindata::BuildFromArrayMap; #[cfg(feature = "thermo")] use crate::io::thermo::ThermoRawReaderType; #[cfg(feature = "bruker_tdf")] -use crate::io::tdf::{TDFSpectrumReaderType, TDFFrameReaderType}; +use crate::io::tdf::{TDFFrameReaderType, TDFSpectrumReaderType}; use crate::io::traits::{ChromatogramSource, StreamingSpectrumIterator}; use crate::io::{DetailLevel, SpectrumSourceWithMetadata}; -use super::{infer_format, infer_from_stream, MassSpectrometryFormat}; - +use super::{MassSpectrometryFormat, infer_format, infer_from_stream}; /// An explicit file format dispatching ADT that provides the complete [`SpectrumSource`], /// [`RandomAccessSpectrumIterator`], [`MZFileReader`] and [`MSDataFileMetadata`] APIs. @@ -52,9 +66,10 @@ use super::{infer_format, infer_from_stream, MassSpectrometryFormat}; /// unknown size at compile time. #[non_exhaustive] pub enum MZReaderType< - R: io::Read + io::Seek, - C: CentroidLike + From + BuildFromArrayMap=CentroidPeak, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap=DeconvolutedPeak> { + R: io::Read + io::Seek, + C: CentroidLike + From + BuildFromArrayMap = CentroidPeak, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap = DeconvolutedPeak, +> { #[cfg(feature = "mzml")] MzML(MzMLReaderType), #[cfg(feature = "mgf")] @@ -64,56 +79,91 @@ pub enum MZReaderType< #[cfg(feature = "mzmlb")] MzMLb(Box>), #[cfg(feature = "bruker_tdf")] - BrukerTDF(TDFSpectrumReaderType, ChargedFeature, C, D>), - Unknown(Box> + Send + Sync>, PhantomData), + BrukerTDF( + TDFSpectrumReaderType, ChargedFeature, C, D>, + ), + Unknown( + Box> + Send + Sync>, + PhantomData, + ), } impl< - R: io::Read + io::Seek, - C: CentroidLike + From + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap> Debug for MZReaderType { + R: io::Read + io::Seek, + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> Debug for MZReaderType +{ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { #[cfg(feature = "mzml")] - Self::MzML(arg0) => f.debug_tuple("MzML").field(&arg0.source_file_name()).finish(), + Self::MzML(arg0) => f + .debug_tuple("MzML") + .field(&arg0.source_file_name()) + .finish(), #[cfg(feature = "mgf")] - Self::MGF(arg0) => f.debug_tuple("MGF").field(&arg0.source_file_name()).finish(), + Self::MGF(arg0) => f + .debug_tuple("MGF") + .field(&arg0.source_file_name()) + .finish(), #[cfg(feature = "thermo")] - Self::ThermoRaw(arg0) => f.debug_tuple("ThermoRaw").field(&arg0.source_file_name()).finish(), + Self::ThermoRaw(arg0) => f + .debug_tuple("ThermoRaw") + .field(&arg0.source_file_name()) + .finish(), #[cfg(feature = "mzmlb")] - Self::MzMLb(arg0) => f.debug_tuple("MzMLb").field(&arg0.source_file_name()).finish(), + Self::MzMLb(arg0) => f + .debug_tuple("MzMLb") + .field(&arg0.source_file_name()) + .finish(), #[cfg(feature = "bruker_tdf")] - Self::BrukerTDF(arg0) => f.debug_tuple("BrukerTDF").field(&arg0.source_file_name()).finish(), - Self::Unknown(arg0, _) => f.debug_tuple("Unknown").field(&arg0.source_file_name()).finish(), + Self::BrukerTDF(arg0) => f + .debug_tuple("BrukerTDF") + .field(&arg0.source_file_name()) + .finish(), + Self::Unknown(arg0, _) => f + .debug_tuple("Unknown") + .field(&arg0.source_file_name()) + .finish(), } } } - - /// A builder type for [`MZReaderType`]. /// /// To create an instance, see [`MZReaderType::builder`] #[derive(Debug)] pub struct MZReaderBuilder< - C: CentroidLike + From + BuildFromArrayMap=CentroidPeak, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap=DeconvolutedPeak> { + C: CentroidLike + From + BuildFromArrayMap = CentroidPeak, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap = DeconvolutedPeak, +> { buffer_size: Option, detail_level: DetailLevel, _c: PhantomData, _d: PhantomData, } -impl + BuildFromArrayMap, D: DeconvolutedCentroidLike + From + BuildFromArrayMap> Default for MZReaderBuilder { +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> Default for MZReaderBuilder +{ fn default() -> Self { - Self { buffer_size: None, detail_level: Default::default(), _c: Default::default(), _d: Default::default() } + Self { + buffer_size: None, + detail_level: Default::default(), + _c: Default::default(), + _d: Default::default(), + } } } #[allow(unused)] -impl + BuildFromArrayMap, D: DeconvolutedCentroidLike + From + BuildFromArrayMap> MZReaderBuilder { - +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> MZReaderBuilder +{ /// Set the buffer capacity for a streaming reader. pub fn buffer_size(mut self, capacity: usize) -> Self { self.buffer_size = Some(capacity); @@ -140,7 +190,10 @@ impl + BuildFromArrayMap, D: DeconvolutedCe /// # Note /// Not all formats can be read from an `io` type, these will /// fail to open and an error will be returned - pub fn from_read_seek(self, source: R) -> io::Result> { + pub fn from_read_seek( + self, + source: R, + ) -> io::Result> { let mut reader = MZReaderType::open_read_seek(source)?; reader.set_detail_level(self.detail_level); Ok(reader) @@ -156,7 +209,17 @@ impl + BuildFromArrayMap, D: DeconvolutedCe /// # Note /// Not all formats can be read from an `io` type, these will /// fail to open and an error will be returned - pub fn from_read(self, source: R) -> io::Result, MZReaderType, C, D>>> { + pub fn from_read( + self, + source: R, + ) -> io::Result< + StreamingSpectrumIterator< + C, + D, + MultiLayerSpectrum, + MZReaderType, C, D>, + >, + > { let mut reader = if let Some(buffer_size) = self.buffer_size { MZReaderType::open_read_with_buffer_size(source, buffer_size) } else { @@ -167,8 +230,6 @@ impl + BuildFromArrayMap, D: DeconvolutedCe } } - - macro_rules! msfmt_dispatch { ($d:ident, $r:ident, $e:expr) => { match $d { @@ -187,11 +248,12 @@ macro_rules! msfmt_dispatch { }; } - -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap> MZReaderType { - +impl< + R: io::Read + io::Seek, + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> MZReaderType +{ /// Create a [`MZReaderBuilder`] which can be used to configure the /// created reader, setting [`DetailLevel`] and buffer capacity /// The builder can create a reader from any type that the @@ -213,15 +275,13 @@ impl MassSpectrometryFormat::MzMLb, #[cfg(feature = "bruker_tdf")] MZReaderType::BrukerTDF(_) => MassSpectrometryFormat::BrukerTDF, - _ => MassSpectrometryFormat::Unknown + _ => MassSpectrometryFormat::Unknown, } } /// Get the [`DetailLevel`] the reader currently uses pub fn detail_level(&self) -> &DetailLevel { - msfmt_dispatch!(self, reader, { - &reader.detail_level() - }) + msfmt_dispatch!(self, reader, { &reader.detail_level() }) } /// Set the [`DetailLevel`] for the reader, changing @@ -247,16 +307,20 @@ impl io::Result { let (fmt, gzipped) = infer_from_stream(&mut stream)?; if gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "This method does not support gzipped streams")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "This method does not support gzipped streams", + )); } match fmt { #[cfg(feature = "mgf")] MassSpectrometryFormat::MGF => Ok(Self::MGF(MGFReaderType::new_indexed(stream))), #[cfg(feature = "mzml")] MassSpectrometryFormat::MzML => Ok(Self::MzML(MzMLReaderType::new_indexed(stream))), - _ => { - Err(io::Error::new(io::ErrorKind::Unsupported, format!("This method does not support {fmt}"))) - } + _ => Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("This method does not support {fmt}"), + )), } } @@ -268,29 +332,41 @@ impl io::Result>, C, D>> { + pub fn open_gzipped_read_seek( + mut stream: R, + ) -> io::Result>, C, D>> { let (fmt, gzipped) = infer_from_stream(&mut stream)?; if !gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "This method does not support non-gzipped streams")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "This method does not support non-gzipped streams", + )); } let stream = RestartableGzDecoder::new(io::BufReader::new(stream)); match fmt { #[cfg(feature = "mgf")] - MassSpectrometryFormat::MGF => Ok(MZReaderType::MGF(MGFReaderType::new_indexed(stream))), + MassSpectrometryFormat::MGF => { + Ok(MZReaderType::MGF(MGFReaderType::new_indexed(stream))) + } #[cfg(feature = "mzml")] - MassSpectrometryFormat::MzML => Ok(MZReaderType::MzML(MzMLReaderType::new_indexed(stream))), - _ => { - Err(io::Error::new(io::ErrorKind::Unsupported, format!("This method does not support {fmt}"))) + MassSpectrometryFormat::MzML => { + Ok(MZReaderType::MzML(MzMLReaderType::new_indexed(stream))) } + _ => Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("This method does not support {fmt}"), + )), } } } #[allow(unused)] -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap> ChromatogramSource for MZReaderType { - +impl< + R: io::Read + io::Seek, + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> ChromatogramSource for MZReaderType +{ fn get_chromatogram_by_id(&mut self, id: &str) -> Option { match self { #[cfg(feature = "mzml")] @@ -303,7 +379,7 @@ impl r.get_chromatogram_by_id(id), #[cfg(feature = "bruker_tdf")] MZReaderType::BrukerTDF(r) => r.get_chromatogram_by_id(id), - _ => None + _ => None, } } @@ -319,16 +395,18 @@ impl r.get_chromatogram_by_index(index), #[cfg(feature = "bruker_tdf")] MZReaderType::BrukerTDF(r) => r.get_chromatogram_by_index(index), - _ => None + _ => None, } } } #[allow(unused)] -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap> MZReaderType, C, D> { - +impl< + R: io::Read, + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> MZReaderType, C, D> +{ /// Create a reader from a type that supports [`io::Read`]. /// /// This will internally wrap the file in a [`PreBufferedStream`] for metadata @@ -339,12 +417,24 @@ impl io::Result, MZReaderType, C, D>>> { + pub fn open_read( + stream: R, + ) -> io::Result< + StreamingSpectrumIterator< + C, + D, + MultiLayerSpectrum, + MZReaderType, C, D>, + >, + > { let mut stream = PreBufferedStream::new(stream)?; let (fmt, gzipped) = infer_from_stream(&mut stream)?; if gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "This method does not support gzipped streams")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "This method does not support gzipped streams", + )); } let reader = match fmt { @@ -353,7 +443,10 @@ impl Self::MzML(MzMLReaderType::new(stream)), _ => { - return Err(io::Error::new(io::ErrorKind::Unsupported, format!("This method does not support {fmt}"))) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("This method does not support {fmt}"), + )); } }; Ok(StreamingSpectrumIterator::new(reader)) @@ -371,12 +464,24 @@ impl io::Result, MZReaderType>>, C, D>>> { + pub fn open_gzipped_read( + stream: R, + ) -> io::Result< + StreamingSpectrumIterator< + C, + D, + MultiLayerSpectrum, + MZReaderType>>, C, D>, + >, + > { let mut stream = PreBufferedStream::new(stream)?; let (fmt, gzipped) = infer_from_stream(&mut stream)?; if !gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "This method only supports gzipped streams")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "This method only supports gzipped streams", + )); } let mut stream = PreBufferedStream::new(GzDecoder::new(stream))?; @@ -386,7 +491,10 @@ impl MZReaderType::MzML(MzMLReaderType::new(stream)), _ => { - return Err(io::Error::new(io::ErrorKind::Unsupported, format!("This method does not support {fmt}"))) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("This method does not support {fmt}"), + )); } }; Ok(StreamingSpectrumIterator::new(reader)) @@ -397,12 +505,18 @@ impl io::Result, Self>> { + pub fn open_read_with_buffer_size( + stream: R, + buffer_size: usize, + ) -> io::Result, Self>> { let mut stream = PreBufferedStream::new_with_buffer_size(stream, buffer_size)?; let (fmt, gzipped) = infer_from_stream(&mut stream)?; if gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "This method does not support gzipped streams")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "This method does not support gzipped streams", + )); } let reader = match fmt { @@ -411,7 +525,10 @@ impl Self::MzML(MzMLReaderType::new(stream)), _ => { - return Err(io::Error::new(io::ErrorKind::Unsupported, format!("This method does not support {fmt}"))) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("This method does not support {fmt}"), + )); } }; Ok(StreamingSpectrumIterator::new(reader)) @@ -422,9 +539,11 @@ impl = MZReaderType; -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap> MZFileReader> for MZReaderType { - +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> MZFileReader> for MZReaderType +{ fn construct_index_from_stream(&mut self) -> u64 { match self { #[cfg(feature = "mzml")] @@ -442,14 +561,15 @@ impl + BuildFromArrayMap, } fn open_path

(path: P) -> io::Result - where - P: Into + Clone, { + where + P: Into + Clone, + { let (format, is_gzipped) = infer_format(path.clone())?; if is_gzipped { return Err(io::Error::new( io::ErrorKind::Unsupported, "Gzipped files are not supported with this method. See `MZReaderType::open_gzipped_read_seek`.", - )) + )); } match format { #[cfg(feature = "mgf")] @@ -474,9 +594,8 @@ impl + BuildFromArrayMap, } #[cfg(feature = "bruker_tdf")] MassSpectrometryFormat::BrukerTDF => { - let reader = TDFSpectrumReaderType::new(path.clone().into()).map_err(|e| { - io::Error::new(io::ErrorKind::Other, e) - })?; + let reader = TDFSpectrumReaderType::new(path.clone().into()) + .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?; Ok(Self::BrukerTDF(reader)) } _ => Err(io::Error::new( @@ -484,7 +603,6 @@ impl + BuildFromArrayMap, "File format not supported", )), } - } fn open_file(mut source: fs::File) -> io::Result { @@ -494,7 +612,7 @@ impl + BuildFromArrayMap, return Err(io::Error::new( io::ErrorKind::Unsupported, "Gzipped files are not supported", - )) + )); } match format { #[cfg(feature = "mgf")] @@ -525,10 +643,12 @@ impl + BuildFromArrayMap, } } -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap, - R: io::Read + io::Seek> Iterator for MZReaderType { - +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, + R: io::Read + io::Seek, +> Iterator for MZReaderType +{ type Item = MultiLayerSpectrum; fn next(&mut self) -> Option { @@ -536,10 +656,12 @@ impl + BuildFromArrayMap, } } -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap, - R: io::Read + io::Seek> SpectrumSource> for MZReaderType { - +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, + R: io::Read + io::Seek, +> SpectrumSource> for MZReaderType +{ fn reset(&mut self) { msfmt_dispatch!(self, reader, reader.reset()) } @@ -585,15 +707,19 @@ impl + BuildFromArrayMap, } } -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap, - R: io::Read + io::Seek> MSDataFileMetadata for MZReaderType { - +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, + R: io::Read + io::Seek, +> MSDataFileMetadata for MZReaderType +{ fn data_processings(&self) -> &Vec { msfmt_dispatch!(self, reader, reader.data_processings()) } - fn instrument_configurations(&self) -> &std::collections::HashMap { + fn instrument_configurations( + &self, + ) -> &std::collections::HashMap { msfmt_dispatch!(self, reader, reader.instrument_configurations()) } @@ -613,7 +739,9 @@ impl + BuildFromArrayMap, msfmt_dispatch!(self, reader, reader.data_processings_mut()) } - fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap { + fn instrument_configurations_mut( + &mut self, + ) -> &mut std::collections::HashMap { msfmt_dispatch!(self, reader, reader.instrument_configurations_mut()) } @@ -648,40 +776,49 @@ macro_rules! msfmt_dispatch_cap { #[cfg(feature = "mzml")] MZReaderType::MzML($r) => { $e?; - }, + } #[cfg(feature = "mgf")] MZReaderType::MGF($r) => { $e?; - }, + } #[cfg(feature = "thermo")] MZReaderType::ThermoRaw($r) => { $e?; - }, + } #[cfg(feature = "mzmlb")] MZReaderType::MzMLb($r) => { $e?; - }, + } #[cfg(feature = "bruker_tdf")] MZReaderType::BrukerTDF($r) => { $e?; } - MZReaderType::Unknown(_, _) => { - Err(crate::io::SpectrumAccessError::IOError(Some(io::Error::new(io::ErrorKind::Unsupported, "Dynamic adaptor doesn't know how to do random access iterators"))))? - } + MZReaderType::Unknown(_, _) => Err(crate::io::SpectrumAccessError::IOError(Some( + io::Error::new( + io::ErrorKind::Unsupported, + "Dynamic adaptor doesn't know how to do random access iterators", + ), + )))?, }; }; } #[allow(unused)] -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap, - R: io::Read + io::Seek> RandomAccessSpectrumIterator> for MZReaderType { +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, + R: io::Read + io::Seek, +> RandomAccessSpectrumIterator> for MZReaderType +{ fn start_from_id(&mut self, id: &str) -> Result<&mut Self, crate::io::SpectrumAccessError> { msfmt_dispatch_cap!(self, reader, reader.start_from_id(id)); Ok(self) } - fn start_from_index(&mut self, index: usize) -> Result<&mut Self, crate::io::SpectrumAccessError> { + fn start_from_index( + &mut self, + index: usize, + ) -> Result<&mut Self, crate::io::SpectrumAccessError> { msfmt_dispatch_cap!(self, reader, reader.start_from_index(index)); Ok(self) } @@ -693,26 +830,43 @@ impl + BuildFromArrayMap, } #[allow(unused)] -impl + BuildFromArrayMap, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap, - R: io::Read + io::Seek> IntoIonMobilityFrameSource for MZReaderType { - - type IonMobilityFrameSource, DF: FeatureLike + KnownCharge> = IMMZReaderType; - - fn try_into_frame_source, DF: FeatureLike + KnownCharge>(self) -> Result, crate::io::IntoIonMobilityFrameSourceError> { +impl< + C: CentroidLike + From + BuildFromArrayMap, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap, + R: io::Read + io::Seek, +> IntoIonMobilityFrameSource for MZReaderType +{ + type IonMobilityFrameSource< + CF: FeatureLike, + DF: FeatureLike + KnownCharge, + > = IMMZReaderType; + + fn try_into_frame_source< + CF: FeatureLike, + DF: FeatureLike + KnownCharge, + >( + self, + ) -> Result, crate::io::IntoIonMobilityFrameSourceError> + { let view = match self { #[cfg(feature = "mzml")] MZReaderType::MzML(reader) => IMMZReaderType::MzML(reader.try_into_frame_source()?), #[cfg(feature = "mgf")] - MZReaderType::MGF(_) => return Err(crate::io::IntoIonMobilityFrameSourceError::NoIonMobilityFramesFound), - #[cfg(feature="thermo")] - MZReaderType::ThermoRaw(_) => return Err(crate::io::IntoIonMobilityFrameSourceError::NoIonMobilityFramesFound), - #[cfg(feature="mzmlb")] - MZReaderType::MzMLb(reader) => IMMZReaderType::MzMLb(Box::new(reader.try_into_frame_source()?)), - #[cfg(feature="bruker_tdf")] + MZReaderType::MGF(_) => { + return Err(crate::io::IntoIonMobilityFrameSourceError::NoIonMobilityFramesFound); + } + #[cfg(feature = "thermo")] + MZReaderType::ThermoRaw(_) => { + return Err(crate::io::IntoIonMobilityFrameSourceError::NoIonMobilityFramesFound); + } + #[cfg(feature = "mzmlb")] + MZReaderType::MzMLb(reader) => { + IMMZReaderType::MzMLb(Box::new(reader.try_into_frame_source()?)) + } + #[cfg(feature = "bruker_tdf")] MZReaderType::BrukerTDF(reader) => { IMMZReaderType::BrukerTDF(reader.try_into_frame_source()?, PhantomData) - }, + } MZReaderType::Unknown(_, _) => todo!(), }; Ok(view) @@ -723,13 +877,15 @@ impl + BuildFromArrayMap, mod async_impl { use super::*; use io::SeekFrom; - use tokio::io::{AsyncRead, AsyncSeek, AsyncSeekExt, AsyncReadExt}; + use tokio::io::{AsyncRead, AsyncReadExt, AsyncSeek, AsyncSeekExt}; #[cfg(feature = "mgf")] use crate::io::mgf::AsyncMGFReaderType; #[cfg(feature = "mzml")] use crate::io::mzml::AsyncMzMLReaderType; - use crate::io::traits::{AsyncMZFileReader, AsyncRandomAccessSpectrumIterator, AsyncSpectrumSource}; + use crate::io::traits::{ + AsyncMZFileReader, AsyncRandomAccessSpectrumIterator, AsyncSpectrumSource, + }; #[cfg(feature = "thermo")] use crate::io::thermo::AsyncThermoRawReaderType; @@ -748,10 +904,12 @@ mod async_impl { ThermoRaw(AsyncThermoRawReaderType), } - impl + BuildFromArrayMap + Send + Sync, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync> AsyncMZReaderType { - + impl< + R: AsyncRead + AsyncSeek + Unpin + Send, + C: CentroidLike + From + BuildFromArrayMap + Send + Sync, + D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync, + > AsyncMZReaderType + { pub fn builder() -> AsyncMZReaderBuilder { AsyncMZReaderBuilder::default() } @@ -765,22 +923,27 @@ mod async_impl { let (ms_format, gzipped) = infer_from_stream(&mut stream)?; if gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "Cannot read compressed streams with this interface")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "Cannot read compressed streams with this interface", + )); } match ms_format { #[cfg(feature = "mgf")] MassSpectrometryFormat::MGF => { Ok(Self::MGF(AsyncMGFReaderType::new_indexed(source).await)) - }, + } #[cfg(feature = "mzml")] MassSpectrometryFormat::MzML => { Ok(Self::MzML(AsyncMzMLReaderType::new_indexed(source).await)) - }, - _ => Err(io::Error::new(io::ErrorKind::Unsupported, format!("Cannot read {ms_format} files from streams"))) + } + _ => Err(io::Error::new( + io::ErrorKind::Unsupported, + format!("Cannot read {ms_format} files from streams"), + )), } } - } pub type AsyncMZReader = AsyncMZReaderType; @@ -798,15 +961,24 @@ mod async_impl { }; } - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> MSDataFileMetadata for AsyncMZReaderType { - + impl< + R: AsyncRead + AsyncSeek + Unpin + Send, + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > MSDataFileMetadata for AsyncMZReaderType + { fn data_processings(&self) -> &Vec { amsfmt_dispatch!(self, reader, reader.data_processings()) } - fn instrument_configurations(&self) -> &std::collections::HashMap { + fn instrument_configurations( + &self, + ) -> &std::collections::HashMap { amsfmt_dispatch!(self, reader, reader.instrument_configurations()) } @@ -826,7 +998,9 @@ mod async_impl { amsfmt_dispatch!(self, reader, reader.data_processings_mut()) } - fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap { + fn instrument_configurations_mut( + &mut self, + ) -> &mut std::collections::HashMap { amsfmt_dispatch!(self, reader, reader.instrument_configurations_mut()) } @@ -855,10 +1029,17 @@ mod async_impl { } } - - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> AsyncSpectrumSource> for AsyncMZReaderType { + impl< + R: AsyncRead + AsyncSeek + Unpin + Send, + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > AsyncSpectrumSource> for AsyncMZReaderType + { async fn reset(&mut self) { amsfmt_dispatch!(self, reader, reader.reset().await) } @@ -875,7 +1056,10 @@ mod async_impl { amsfmt_dispatch!(self, reader, reader.get_spectrum_by_id(id).await) } - async fn get_spectrum_by_index(&mut self, index: usize) -> Option> { + async fn get_spectrum_by_index( + &mut self, + index: usize, + ) -> Option> { amsfmt_dispatch!(self, reader, reader.get_spectrum_by_index(index).await) } @@ -896,62 +1080,113 @@ mod async_impl { } } - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> AsyncRandomAccessSpectrumIterator> for AsyncMZReaderType { - - async fn start_from_id(&mut self, id: &str) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { - amsfmt_dispatch!(self, reader,{ reader.start_from_id(id).await?;}); + impl< + R: AsyncRead + AsyncSeek + Unpin + Send, + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > AsyncRandomAccessSpectrumIterator> + for AsyncMZReaderType + { + async fn start_from_id( + &mut self, + id: &str, + ) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { + amsfmt_dispatch!(self, reader, { + reader.start_from_id(id).await?; + }); Ok(self) } - async fn start_from_index(&mut self, index: usize) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { - amsfmt_dispatch!(self, reader,{ reader.start_from_index(index).await?;}); + async fn start_from_index( + &mut self, + index: usize, + ) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { + amsfmt_dispatch!(self, reader, { + reader.start_from_index(index).await?; + }); Ok(self) } - async fn start_from_time(&mut self, time: f64) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { - amsfmt_dispatch!(self, reader,{ reader.start_from_time(time).await?;}); + async fn start_from_time( + &mut self, + time: f64, + ) -> Result<&mut Self, crate::prelude::SpectrumAccessError> { + amsfmt_dispatch!(self, reader, { + reader.start_from_time(time).await?; + }); Ok(self) } } #[cfg(feature = "async")] - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> AsyncMZFileReader> for AsyncMZReaderType { - + impl< + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > AsyncMZFileReader> + for AsyncMZReaderType + { async fn construct_index_from_stream(&mut self) -> u64 { amsfmt_dispatch!(self, reader, reader.construct_index_from_stream().await) } async fn open_path

(path: P) -> io::Result - where - P: Into, { + where + P: Into, + { let path: path::PathBuf = path.into(); let (ms_format, gzipped) = infer_format(path.clone())?; if gzipped { - return Err(io::Error::new(io::ErrorKind::Unsupported, "Compressed files are not supported")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "Compressed files are not supported", + )); } match ms_format { #[cfg(feature = "mgf")] MassSpectrometryFormat::MGF => { Ok(Self::MGF(AsyncMGFReaderType::open_path(path).await?)) - }, + } #[cfg(feature = "mzml")] MassSpectrometryFormat::MzML => { Ok(Self::MzML(AsyncMzMLReaderType::open_path(path).await?)) - }, - MassSpectrometryFormat::MzMLb => { - Err(io::Error::new(io::ErrorKind::Unsupported, "MzMLb files are not supported in async mode")) - }, + } + MassSpectrometryFormat::MzMLb => Err(io::Error::new( + io::ErrorKind::Unsupported, + "MzMLb files are not supported in async mode", + )), MassSpectrometryFormat::ThermoRaw => { #[cfg(feature = "thermo")] - {Ok(Self::ThermoRaw(AsyncThermoRawReaderType::open_path(path).await?))} + { + Ok(Self::ThermoRaw( + AsyncThermoRawReaderType::open_path(path).await?, + )) + } #[cfg(not(feature = "thermo"))] - {Err(io::Error::new(io::ErrorKind::Unsupported, "Thermo RAW files are not supported. Enable the 'thermo' feature"))} - }, - MassSpectrometryFormat::BrukerTDF => Err(io::Error::new(io::ErrorKind::Unsupported, "Bruker TDF files are not supported in async mode")), - _ => Err(io::Error::new(io::ErrorKind::Unsupported, "Unknown file format unsupported")), + { + Err(io::Error::new( + io::ErrorKind::Unsupported, + "Thermo RAW files are not supported. Enable the 'thermo' feature", + )) + } + } + MassSpectrometryFormat::BrukerTDF => Err(io::Error::new( + io::ErrorKind::Unsupported, + "Bruker TDF files are not supported in async mode", + )), + _ => Err(io::Error::new( + io::ErrorKind::Unsupported, + "Unknown file format unsupported", + )), } } @@ -959,51 +1194,79 @@ mod async_impl { let mut sync_source = source.into_std().await; let (ms_format, compressed) = infer_from_stream(&mut sync_source)?; if compressed { - return Err(io::Error::new(io::ErrorKind::Unsupported, "Compressed files are not supported")) + return Err(io::Error::new( + io::ErrorKind::Unsupported, + "Compressed files are not supported", + )); } source = tokio::fs::File::from_std(sync_source); match ms_format { #[cfg(feature = "mgf")] MassSpectrometryFormat::MGF => { Ok(Self::MGF(AsyncMGFReaderType::open_file(source).await?)) - }, + } #[cfg(feature = "mzml")] MassSpectrometryFormat::MzML => { Ok(Self::MzML(AsyncMzMLReaderType::open_file(source).await?)) - }, + } _ => Err(io::Error::new( - io::ErrorKind::Unsupported, - "File format not supported", + io::ErrorKind::Unsupported, + "File format not supported", )), } } } - /// A builder type for [`AsyncMZReaderType`]. /// /// To create an instance, see [`AsyncMZReaderType::builder`] #[derive(Debug)] pub struct AsyncMZReaderBuilder< - C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> { + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > { buffer_size: Option, detail_level: DetailLevel, _c: PhantomData, _d: PhantomData, } - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> Default for AsyncMZReaderBuilder { + impl< + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > Default for AsyncMZReaderBuilder + { fn default() -> Self { - Self { buffer_size: None, detail_level: Default::default(), _c: Default::default(), _d: Default::default() } + Self { + buffer_size: None, + detail_level: Default::default(), + _c: Default::default(), + _d: Default::default(), + } } } #[allow(unused)] - impl + BuildFromArrayMap + Send + Sync + 'static, - D: DeconvolutedCentroidLike + From + BuildFromArrayMap + Send + Sync + 'static> AsyncMZReaderBuilder { - + impl< + C: CentroidLike + From + BuildFromArrayMap + Send + Sync + 'static, + D: DeconvolutedCentroidLike + + From + + BuildFromArrayMap + + Send + + Sync + + 'static, + > AsyncMZReaderBuilder + { /// Set the buffer capacity for a streaming reader. pub fn buffer_size(mut self, capacity: usize) -> Self { self.buffer_size = Some(capacity); @@ -1019,8 +1282,12 @@ mod async_impl { #[cfg(feature = "async")] /// Create a reader from a file on the local file system denoted by `path`. - pub async fn from_path>(self, path: P) -> io::Result> { - let mut reader = AsyncMZReaderType::open_path(path::PathBuf::from(path.as_ref())).await?; + pub async fn from_path>( + self, + path: P, + ) -> io::Result> { + let mut reader = + AsyncMZReaderType::open_path(path::PathBuf::from(path.as_ref())).await?; reader.set_detail_level(self.detail_level); Ok(reader) } @@ -1031,7 +1298,12 @@ mod async_impl { /// # Note /// Not all formats can be read from an `io` type, these will /// fail to open and an error will be returned - pub async fn from_read_seek(self, source: R) -> io::Result> { + pub async fn from_read_seek< + R: tokio::io::AsyncRead + tokio::io::AsyncSeek + Unpin + Send, + >( + self, + source: R, + ) -> io::Result> { let mut reader = AsyncMZReaderType::open_read_seek(source).await?; reader.set_detail_level(self.detail_level); Ok(reader) @@ -1057,30 +1329,27 @@ mod async_impl { // Ok(reader) // } } - - } #[cfg(feature = "async_partial")] -pub use async_impl::{AsyncMZReaderType, AsyncMZReader, AsyncMZReaderBuilder}; +pub use async_impl::{AsyncMZReader, AsyncMZReaderBuilder, AsyncMZReaderType}; pub enum IMMZReaderType< - R: io::Read + io::Seek, - C: FeatureLike = Feature, - D: FeatureLike + KnownCharge = ChargedFeature, - CP: CentroidLike + From + BuildFromArrayMap=CentroidPeak, - DP: DeconvolutedCentroidLike + From + BuildFromArrayMap=DeconvolutedPeak, - > { + R: io::Read + io::Seek, + C: FeatureLike = Feature, + D: FeatureLike + KnownCharge = ChargedFeature, + CP: CentroidLike + From + BuildFromArrayMap = CentroidPeak, + DP: DeconvolutedCentroidLike + From + BuildFromArrayMap = DeconvolutedPeak, +> { #[cfg(feature = "mzml")] MzML(Generic3DIonMobilityFrameSource, C, D>), #[cfg(feature = "mzmlb")] MzMLb(Box, C, D>>), #[cfg(feature = "bruker_tdf")] BrukerTDF(TDFFrameReaderType, PhantomData<(R, CP, DP)>), - Unknown(PhantomData<(R, C, D, CP, DP)>) + Unknown(PhantomData<(R, C, D, CP, DP)>), } - macro_rules! immsfmt_dispatch { ($d:ident, $r:ident, $e:expr) => { match $d { @@ -1090,18 +1359,26 @@ macro_rules! immsfmt_dispatch { IMMZReaderType::MzMLb($r) => $e, #[cfg(feature = "bruker_tdf")] IMMZReaderType::BrukerTDF($r, _) => $e, - IMMZReaderType::Unknown(_) => todo!() + IMMZReaderType::Unknown(_) => todo!(), } }; } - -impl, D: FeatureLike + KnownCharge, CP: CentroidLike + From + BuildFromArrayMap, DP: DeconvolutedCentroidLike + From + BuildFromArrayMap> MSDataFileMetadata for IMMZReaderType { +impl< + R: io::Read + io::Seek, + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From + BuildFromArrayMap, + DP: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> MSDataFileMetadata for IMMZReaderType +{ fn data_processings(&self) -> &Vec { immsfmt_dispatch!(self, reader, reader.data_processings()) } - fn instrument_configurations(&self) -> &std::collections::HashMap { + fn instrument_configurations( + &self, + ) -> &std::collections::HashMap { immsfmt_dispatch!(self, reader, reader.instrument_configurations()) } @@ -1121,7 +1398,9 @@ impl, D: FeatureLike &mut std::collections::HashMap { + fn instrument_configurations_mut( + &mut self, + ) -> &mut std::collections::HashMap { immsfmt_dispatch!(self, reader, reader.instrument_configurations_mut()) } @@ -1150,7 +1429,14 @@ impl, D: FeatureLike, D: FeatureLike + KnownCharge, CP: CentroidLike + From + BuildFromArrayMap, DP: DeconvolutedCentroidLike + From + BuildFromArrayMap> Iterator for IMMZReaderType { +impl< + R: io::Read + io::Seek, + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From + BuildFromArrayMap, + DP: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> Iterator for IMMZReaderType +{ type Item = MultiLayerIonMobilityFrame; fn next(&mut self) -> Option { @@ -1159,7 +1445,15 @@ impl, D: FeatureLike, D: FeatureLike + KnownCharge, CP: CentroidLike + From + BuildFromArrayMap, DP: DeconvolutedCentroidLike + From + BuildFromArrayMap> IonMobilityFrameSource> for IMMZReaderType { +impl< + R: io::Read + io::Seek, + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From + BuildFromArrayMap, + DP: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> IonMobilityFrameSource> + for IMMZReaderType +{ fn reset(&mut self) { immsfmt_dispatch!(self, reader, reader.reset()) } @@ -1190,19 +1484,42 @@ impl, D: FeatureLike, D: FeatureLike + KnownCharge, CP: CentroidLike + From + BuildFromArrayMap, DP: DeconvolutedCentroidLike + From + BuildFromArrayMap> RandomAccessIonMobilityFrameIterator> for IMMZReaderType { - fn start_from_id(&mut self, id: &str) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { - immsfmt_dispatch!(self, reader, {reader.start_from_id(id)?;}); +impl< + R: io::Read + io::Seek, + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From + BuildFromArrayMap, + DP: DeconvolutedCentroidLike + From + BuildFromArrayMap, +> RandomAccessIonMobilityFrameIterator> + for IMMZReaderType +{ + fn start_from_id( + &mut self, + id: &str, + ) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { + immsfmt_dispatch!(self, reader, { + reader.start_from_id(id)?; + }); Ok(self) } - fn start_from_index(&mut self, index: usize) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { - immsfmt_dispatch!(self, reader, {reader.start_from_index(index)?;}); + fn start_from_index( + &mut self, + index: usize, + ) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { + immsfmt_dispatch!(self, reader, { + reader.start_from_index(index)?; + }); Ok(self) } - fn start_from_time(&mut self, time: f64) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { - immsfmt_dispatch!(self, reader, {reader.start_from_time(time)?;}); + fn start_from_time( + &mut self, + time: f64, + ) -> Result<&mut Self, crate::io::IonMobilityFrameAccessError> { + immsfmt_dispatch!(self, reader, { + reader.start_from_time(time)?; + }); Ok(self) } } @@ -1223,4 +1540,4 @@ mod test { } Ok(()) } -} \ No newline at end of file +} diff --git a/src/io/infer_format/inference.rs b/src/io/infer_format/inference.rs index 3885655..c16563f 100644 --- a/src/io/infer_format/inference.rs +++ b/src/io/infer_format/inference.rs @@ -2,17 +2,17 @@ use std::{ convert::TryFrom, fmt::Display, fs, - io::{self, prelude::*, BufReader}, + io::{self, BufReader, prelude::*}, path, }; use flate2::bufread::GzDecoder; use crate::{ + Param, io::compression::{is_gzipped, is_gzipped_extension}, meta::FormatConversion, params::ControlledVocabulary, - Param, }; #[cfg(feature = "mgf")] diff --git a/src/io/infer_format/mod.rs b/src/io/infer_format/mod.rs index 8699943..c7f4603 100644 --- a/src/io/infer_format/mod.rs +++ b/src/io/infer_format/mod.rs @@ -1,16 +1,14 @@ -mod inference; mod dispatch; +mod inference; mod pipeline; -pub use dispatch::{MZReader, MZReaderType, MZReaderBuilder, IMMZReaderType}; #[cfg(feature = "async_partial")] -pub use dispatch::{AsyncMZReaderType, AsyncMZReader, AsyncMZReaderBuilder}; - +pub use dispatch::{AsyncMZReader, AsyncMZReaderBuilder, AsyncMZReaderType}; +pub use dispatch::{IMMZReaderType, MZReader, MZReaderBuilder, MZReaderType}; +pub use inference::{MassSpectrometryFormat, infer_format, infer_from_path, infer_from_stream}; -pub use inference::{infer_from_path, infer_from_stream, infer_format, MassSpectrometryFormat}; - -pub use pipeline::{MassSpectrometryReadWriteProcess, Source, Sink}; +pub use pipeline::{MassSpectrometryReadWriteProcess, Sink, Source}; #[cfg(test)] mod test { @@ -19,9 +17,9 @@ mod test { use mzpeaks::{CentroidPeak, DeconvolutedPeak}; use crate::{ + io::DetailLevel, prelude::*, spectrum::{ArrayType, Spectrum}, - io::DetailLevel }; use super::*; @@ -76,14 +74,19 @@ mod test { panic!("Failed to retrieve spectrum by index") } - assert_eq!(reader.get_spectrum_by_id("controllerType=0 controllerNumber=1 scan=11").unwrap().index(), 10); + assert_eq!( + reader + .get_spectrum_by_id("controllerType=0 controllerNumber=1 scan=11") + .unwrap() + .index(), + 10 + ); if let Some(spec) = reader.get_spectrum_by_time(0.358558333333) { assert_eq!(spec.index(), 34); } else { panic!("Failed to retrieve spectrum by time") } - } else { panic!("Failed to open file") } @@ -106,14 +109,19 @@ mod test { panic!("Failed to retrieve spectrum by index") } - assert_eq!(reader.get_spectrum_by_id("controllerType=0 controllerNumber=1 scan=11").unwrap().index(), 10); + assert_eq!( + reader + .get_spectrum_by_id("controllerType=0 controllerNumber=1 scan=11") + .unwrap() + .index(), + 10 + ); if let Some(spec) = reader.get_spectrum_by_time(0.358558333333) { assert_eq!(spec.index(), 34); } else { panic!("Failed to retrieve spectrum by time") } - } else { panic!("Failed to open file") } @@ -124,7 +132,8 @@ mod test { let s = Source::::from("text/path".as_ref()); assert!(matches!(s, Source::PathLike(_))); - let fh = Box::new(io::BufReader::new(fs::File::open("./test/data/small.mgf")?)) as Box; + let fh = Box::new(io::BufReader::new(fs::File::open("./test/data/small.mgf")?)) + as Box; let rs: Source = (fh, MassSpectrometryFormat::MGF).into(); assert!(matches!(rs, Source::Reader(_, _))); @@ -153,7 +162,9 @@ mod test { assert_eq!(form, MassSpectrometryFormat::MzML); assert!(!gzip); - mzml_file = fs::File::open("./test/data/20200204_BU_8B8egg_1ug_uL_7charges_60_min_Slot2-11_1_244.mzML.gz")?; + mzml_file = fs::File::open( + "./test/data/20200204_BU_8B8egg_1ug_uL_7charges_60_min_Slot2-11_1_244.mzML.gz", + )?; let (form, gzip) = infer_from_stream(&mut mzml_file)?; assert_eq!(form, MassSpectrometryFormat::MzML); assert!(gzip); diff --git a/src/io/infer_format/pipeline.rs b/src/io/infer_format/pipeline.rs index ee05f77..5be7e1e 100644 --- a/src/io/infer_format/pipeline.rs +++ b/src/io/infer_format/pipeline.rs @@ -1,20 +1,25 @@ +use std::any::Any; #[allow(unused)] use std::fs; use std::io; use std::path::{Path, PathBuf}; use std::sync::mpsc::{Receiver, Sender, SyncSender}; -use std::any::Any; #[allow(unused)] use flate2::write::GzEncoder; use mzpeaks::{CentroidLike, CentroidPeak, DeconvolutedCentroidLike, DeconvolutedPeak}; #[cfg(feature = "bruker_tdf")] -use mzpeaks::{feature::{ChargedFeature, Feature}, IonMobility, Mass, MZ}; +use mzpeaks::{ + IonMobility, MZ, Mass, + feature::{ChargedFeature, Feature}, +}; use crate::io::PreBufferedStream; #[cfg(feature = "mzmlb")] pub use crate::io::mzmlb::{MzMLbReaderType, MzMLbWriterBuilder}; +use crate::io::SpectrumReceiver; +use crate::io::StreamingSpectrumIterator; #[allow(unused)] use crate::io::compression::RestartableGzDecoder; #[cfg(feature = "mgf")] @@ -22,13 +27,13 @@ use crate::io::mgf::{MGFReaderType, MGFWriterType}; #[cfg(feature = "mzml")] use crate::io::mzml::{MzMLReaderType, MzMLWriterType}; #[allow(unused)] -use crate::io::traits::{RandomAccessSpectrumIterator, SpectrumSource, SpectrumWriter, MZFileReader}; -use crate::io::SpectrumReceiver; -use crate::io::StreamingSpectrumIterator; +use crate::io::traits::{ + MZFileReader, RandomAccessSpectrumIterator, SpectrumSource, SpectrumWriter, +}; use crate::meta::MSDataFileMetadata; use crate::prelude::*; -use crate::spectrum::bindata::{BuildArrayMapFrom, BuildFromArrayMap}; use crate::spectrum::MultiLayerSpectrum; +use crate::spectrum::bindata::{BuildArrayMapFrom, BuildFromArrayMap}; #[cfg(feature = "thermo")] use crate::io::thermo::ThermoRawReaderType; @@ -36,12 +41,10 @@ use crate::io::thermo::ThermoRawReaderType; #[cfg(feature = "bruker_tdf")] use crate::io::tdf::TDFSpectrumReaderType; +use super::MassSpectrometryFormat; use super::infer_format; use super::infer_from_path; use super::infer_from_stream; -use super::MassSpectrometryFormat; - - /// An abstraction over different ways to get a [`SpectrumSource`] from a file path, /// buffer, or pipe. @@ -70,24 +73,41 @@ pub enum Source, Option) + Reader(Box, Option), } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> Source { - +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> Source +{ pub fn index_file_name(&self) -> Option { match &self { Self::PathLike(path) => { - if let Some(stem) = path.file_name() { - if let Some(parent) = path.parent() { - let base = parent.join(stem); - let name = base.with_extension("index.json"); - return Some(name); - } + if let Some(stem) = path.file_name() + && let Some(parent) = path.parent() + { + let base = parent.join(stem); + let name = base.with_extension("index.json"); + return Some(name); } None } - _ => None + _ => None, } } @@ -99,46 +119,145 @@ impl + BuildArrayMapFrom + BuildFromArrayM } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From<&Path> for Source { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From<&Path> for Source +{ fn from(value: &Path) -> Self { Self::PathLike(value.into()) } } - -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From for Source { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From for Source +{ fn from(value: String) -> Self { Self::PathLike(value.into()) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From>> for Source { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From>> for Source +{ fn from(value: SpectrumReceiver>) -> Self { Self::Receiver(Box::new(value)) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From>> for Source { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From>> for Source +{ fn from(value: Receiver>) -> Self { Self::Receiver(Box::new(value.into())) } } impl< - C: CentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From<(Box, MassSpectrometryFormat)> for Source { + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From<(Box, MassSpectrometryFormat)> for Source +{ fn from(value: (Box, MassSpectrometryFormat)) -> Self { Self::Reader(value.0, Some(value.1)) } } impl< - C: CentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From> for Source { + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From> for Source +{ fn from(value: Box) -> Self { Self::Reader(value, None) } @@ -168,46 +287,129 @@ pub enum Sink>), /// A thing implementing [`std::io::Write `], along with an expected format - Writer(Box, MassSpectrometryFormat) + Writer(Box, MassSpectrometryFormat), } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> - From<(Box, MassSpectrometryFormat)> for Sink { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From<(Box, MassSpectrometryFormat)> for Sink +{ fn from(value: (Box, MassSpectrometryFormat)) -> Self { Self::Writer(value.0, value.1) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From<&Path> for Sink { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From<&Path> for Sink +{ fn from(value: &Path) -> Self { Self::PathLike(value.into()) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From for Sink { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From for Sink +{ fn from(value: String) -> Self { Self::PathLike(value.into()) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From>> for Sink { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From>> for Sink +{ fn from(value: Sender>) -> Self { Self::Sender(value) } } -impl + BuildArrayMapFrom + BuildFromArrayMap + Clone + 'static + Sync + Send, - D: DeconvolutedCentroidLike + From + BuildArrayMapFrom + BuildFromArrayMap + Clone + Sync + 'static + Send> From>> for Sink { +impl< + C: CentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + 'static + + Sync + + Send, + D: DeconvolutedCentroidLike + + From + + BuildArrayMapFrom + + BuildFromArrayMap + + Clone + + Sync + + 'static + + Send, +> From>> for Sink +{ fn from(value: SyncSender>) -> Self { Self::SyncSender(value) } } - /// Encapsulate the read-transform-write process for mass spectrometry data sources. /// /// This trait handles all the gory details of file format inference with [`open_reader`](MassSpectrometryReadWriteProcess::open_reader) @@ -597,4 +799,3 @@ pub trait MassSpectrometryReadWriteProcess< writer: W, ) -> Result<(), Self::ErrorType>; } - diff --git a/src/io/mgf/async_reader.rs b/src/io/mgf/async_reader.rs index 24be86b..195150f 100644 --- a/src/io/mgf/async_reader.rs +++ b/src/io/mgf/async_reader.rs @@ -13,8 +13,8 @@ use mzpeaks::{CentroidLike, CentroidPeak, DeconvolutedCentroidLike, Deconvoluted use super::{ super::{offset_index::OffsetIndex, utils::DetailLevel}, + DefaultTitleIndexing, MGFError, MGFIndexing, MGFParserState, reader::{MGFLineParsing, SpectrumBuilder}, - MGFError, MGFParserState, MGFIndexing, DefaultTitleIndexing }; use crate::{ @@ -61,23 +61,24 @@ pub struct MGFReaderType< #[cfg(feature = "async")] impl< - C: CentroidLike + From + Send + Sync, - D: DeconvolutedCentroidLike + From + Send + Sync, - > AsyncMZFileReader> for MGFReaderType + C: CentroidLike + From + Send + Sync, + D: DeconvolutedCentroidLike + From + Send + Sync, +> AsyncMZFileReader> for MGFReaderType { async fn construct_index_from_stream(&mut self) -> u64 { self.build_index().await } - async fn open_file( - source: tokio::fs::File, - ) -> std::io::Result { + async fn open_file(source: tokio::fs::File) -> std::io::Result { Ok(Self::new(source).await) } } -impl, D: DeconvolutedCentroidLike + From> MGFLineParsing - for MGFReaderType +impl< + R: io::AsyncRead, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFLineParsing for MGFReaderType { fn state(&self) -> &MGFParserState { &self.state @@ -101,8 +102,11 @@ impl, D: DeconvolutedCent } } -impl, D: DeconvolutedCentroidLike + From> - MGFReaderType +impl< + R: io::AsyncRead + Unpin, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFReaderType { async fn read_line(&mut self, buffer: &mut String) -> io::Result { self.handle.read_line(buffer).await @@ -239,10 +243,10 @@ impl, D: Deconvol } impl< - R: io::AsyncRead + io::AsyncSeek + Unpin, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MGFReaderType + R: io::AsyncRead + io::AsyncSeek + Unpin, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFReaderType { pub fn as_stream(&mut self) -> impl SpectrumStream> + '_ { Box::pin(stream::unfold(self, |reader| async { @@ -303,7 +307,8 @@ impl< let indexer = self.indexer(); if let Some((key, value)) = string_buffer.split_once('=') { if indexer.is_index_key(key) { - self.index.insert(indexer.handle_key(key, value), last_start); + self.index + .insert(indexer.handle_key(key, value), last_start); found_start = false; last_start = 0; } @@ -324,8 +329,11 @@ impl< /// The MGF format does not contain any consistent metadata, but additional /// information can be included after creation. -impl, D: DeconvolutedCentroidLike + From> - MSDataFileMetadata for MGFReaderType +impl< + R: io::AsyncRead + Unpin, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MSDataFileMetadata for MGFReaderType { crate::impl_metadata_trait!(); @@ -349,10 +357,10 @@ impl, D: Deconvol pub type MGFReader = MGFReaderType; impl< - R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin, - C: CentroidLike + From + Send + Sync, - D: DeconvolutedCentroidLike + From + Send + Sync, - > MGFReaderType + R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin, + C: CentroidLike + From + Send + Sync, + D: DeconvolutedCentroidLike + From + Send + Sync, +> MGFReaderType { /// Helper method to support seeking to an ID fn _offset_of_id(&self, id: &str) -> Option { @@ -485,10 +493,10 @@ impl< } impl< - R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin + Send, - C: CentroidLike + From + Send + Sync, - D: DeconvolutedCentroidLike + From + Send + Sync, - > AsyncSpectrumSource> for MGFReaderType + R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin + Send, + C: CentroidLike + From + Send + Sync, + D: DeconvolutedCentroidLike + From + Send + Sync, +> AsyncSpectrumSource> for MGFReaderType { async fn reset(&mut self) { self.reset().await; @@ -524,18 +532,25 @@ impl< } impl< - R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin + Send, - C: CentroidLike + From + Send + Sync, - D: DeconvolutedCentroidLike + From + Send + Sync, - > AsyncRandomAccessSpectrumIterator> for MGFReaderType { - + R: io::AsyncRead + io::AsyncSeek + io::AsyncSeekExt + Unpin + Send, + C: CentroidLike + From + Send + Sync, + D: DeconvolutedCentroidLike + From + Send + Sync, +> AsyncRandomAccessSpectrumIterator> for MGFReaderType +{ async fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { let idx = match self._offset_of_id(id) { Some(i) => i, - None => return Err(crate::io::SpectrumAccessError::SpectrumIdNotFound(id.to_string())), + None => { + return Err(crate::io::SpectrumAccessError::SpectrumIdNotFound( + id.to_string(), + )); + } }; - self.handle.seek(SeekFrom::Start(idx)).await.map_err(|e| SpectrumAccessError::IOError(Some(e)))?; + self.handle + .seek(SeekFrom::Start(idx)) + .await + .map_err(|e| SpectrumAccessError::IOError(Some(e)))?; Ok(self) } @@ -545,7 +560,10 @@ impl< None => return Err(crate::io::SpectrumAccessError::SpectrumIndexNotFound(index)), }; - self.handle.seek(SeekFrom::Start(idx)).await.map_err(|e| SpectrumAccessError::IOError(Some(e)))?; + self.handle + .seek(SeekFrom::Start(idx)) + .await + .map_err(|e| SpectrumAccessError::IOError(Some(e)))?; Ok(self) } @@ -555,7 +573,10 @@ impl< None => return Err(crate::io::SpectrumAccessError::SpectrumNotFound), }; - self.handle.seek(SeekFrom::Start(idx)).await.map_err(|e| SpectrumAccessError::IOError(Some(e)))?; + self.handle + .seek(SeekFrom::Start(idx)) + .await + .map_err(|e| SpectrumAccessError::IOError(Some(e)))?; Ok(self) } } diff --git a/src/io/mgf/mod.rs b/src/io/mgf/mod.rs index c9025b1..421cb08 100644 --- a/src/io/mgf/mod.rs +++ b/src/io/mgf/mod.rs @@ -7,9 +7,9 @@ mod reader; mod writer; pub use reader::{ - DefaultTitleIndexing, DefaultTitleParser, MGFError, MGFParserState, MGFReader, MGFReaderType, - ScansIndexing, TPPTitleParser, TPPTitleParsingNativeIDIndexing, - TPPTitleParsingScanNumberIndexing, MGFIndexing, MGFTitle, + DefaultTitleIndexing, DefaultTitleParser, MGFError, MGFIndexing, MGFParserState, MGFReader, + MGFReaderType, MGFTitle, ScansIndexing, TPPTitleParser, TPPTitleParsingNativeIDIndexing, + TPPTitleParsingScanNumberIndexing, }; pub use writer::{ MGFHeaderStyle, MGFWriter, MGFWriterType, MZDataMGFStyle, SimpleMGFStyle, SimpleMGFWriter, @@ -31,12 +31,12 @@ pub fn is_mgf(buf: &[u8]) -> bool { #[cfg(test)] mod test { + use crate::CentroidSpectrum; + use crate::io::DetailLevel; use crate::io::mgf::reader::{ TPPTitleParsingNativeIDIndexing, TPPTitleParsingScanNumberIndexing, }; - use crate::io::DetailLevel; use crate::spectrum::RefPeakDataLevel; - use crate::CentroidSpectrum; use crate::{io::RestartableGzDecoder, prelude::*}; use mzpeaks::{CentroidPeak, DeconvolutedPeak, IndexedCoordinate}; diff --git a/src/io/mgf/reader.rs b/src/io/mgf/reader.rs index 12d2b77..f80eb07 100644 --- a/src/io/mgf/reader.rs +++ b/src/io/mgf/reader.rs @@ -2,7 +2,7 @@ use std::{ collections::HashMap, convert::TryInto, fs, - io::{self, prelude::*, SeekFrom}, + io::{self, SeekFrom, prelude::*}, marker::PhantomData, str, }; @@ -25,16 +25,18 @@ use crate::{ meta::{ DataProcessing, FileDescription, InstrumentConfiguration, MSDataFileMetadata, MassSpectrometryRun, Sample, Software, - }, params::Value, prelude::SpectrumLike + }, + params::Value, + prelude::SpectrumLike, }; use crate::params::{ControlledVocabulary, Param, ParamDescribed}; use crate::spectrum::{ - bindata::{BuildArrayMapFrom, BuildFromArrayMap}, - spectrum_types::{CentroidSpectrumType, MultiLayerSpectrum}, Chromatogram, Precursor, PrecursorSelection, SelectedIon, SignalContinuity, SpectrumDescription, + bindata::{BuildArrayMapFrom, BuildFromArrayMap}, + spectrum_types::{CentroidSpectrumType, MultiLayerSpectrum}, }; use crate::utils::neutral_mass; @@ -84,20 +86,16 @@ pub(crate) struct SpectrumBuilder< deconvoluted_type: PhantomData, } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > SpectrumBuilder +impl, D: DeconvolutedCentroidLike + From> + SpectrumBuilder { pub fn is_empty(&self) -> bool { self.empty_metadata && self.mz_array.is_empty() } } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > Default for SpectrumBuilder +impl, D: DeconvolutedCentroidLike + From> + Default for SpectrumBuilder { fn default() -> Self { let description = SpectrumDescription { @@ -120,10 +118,8 @@ impl< } } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > SpectrumBuilder +impl, D: DeconvolutedCentroidLike + From> + SpectrumBuilder { pub fn into_spectrum(self, spectrum: &mut MultiLayerSpectrum) { if self.has_charge > 0 { @@ -163,10 +159,8 @@ impl< } } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > From> for MultiLayerSpectrum +impl, D: DeconvolutedCentroidLike + From> + From> for MultiLayerSpectrum { fn from(builder: SpectrumBuilder) -> MultiLayerSpectrum { let mut spec = MultiLayerSpectrum::default(); @@ -175,10 +169,8 @@ impl< } } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > From> for CentroidSpectrumType +impl, D: DeconvolutedCentroidLike + From> + From> for CentroidSpectrumType where C: BuildFromArrayMap + BuildArrayMapFrom, D: BuildFromArrayMap + BuildArrayMapFrom, @@ -224,7 +216,6 @@ impl MGFTitleParsing for DefaultTitleParser { } } - /// A title parser that recognizes the default Trans-Proteomics Pipeline (TPP) title /// format: `... File:"<^SourcePath>", NativeID:"<^Id>"` /// @@ -260,34 +251,39 @@ impl MGFTitleParsing for TPPTitleParser { .fields .insert("Charge".into(), charge.parse().unwrap()); } - if let Some(tail) = after_charge.strip_prefix("File:\"") { - if let Some((head, rest)) = tail.split_once('"') { + if let Some(tail) = after_charge.strip_prefix("File:\"") + && let Some((head, rest)) = tail.split_once('"') + { + if collect_fields { + result + .fields + .insert("File".into(), Value::String(head.into())); + } + if let Some(tail) = rest.strip_prefix(", NativeID:\"") + && let Some((head, _rest)) = tail.split_once('"') + { if collect_fields { result .fields - .insert("File".into(), Value::String(head.into())); - } - if let Some(tail) = rest.strip_prefix(", NativeID:\"") { - if let Some((head, _rest)) = tail.split_once('"') { - if collect_fields { - result.fields.insert( - "NativeID".into(), - Value::String(head.into()), - ); - } - result.identifier = Some(head.into()); - } + .insert("NativeID".into(), Value::String(head.into())); } + result.identifier = Some(head.into()); } } } else { - warn!("Title {title} does not conform to TPPTitleParser pattern: Charge not found") + warn!( + "Title {title} does not conform to TPPTitleParser pattern: Charge not found" + ) } } else { - warn!("Title {title} does not conform to TPPTitleParser pattern: ScanNumber2 not found") + warn!( + "Title {title} does not conform to TPPTitleParser pattern: ScanNumber2 not found" + ) } } else { - warn!("Title {title} does not conform to TPPTitleParser pattern: ScanNumber1 not found") + warn!( + "Title {title} does not conform to TPPTitleParser pattern: ScanNumber1 not found" + ) } } else { warn!("Title {title} does not conform to TPPTitleParser pattern: RunId not found") @@ -296,7 +292,6 @@ impl MGFTitleParsing for TPPTitleParser { } } - /// A strategy for deciding how to index an MGF file. pub trait MGFIndexing: Send + Sync { /// Check if this scan header is to be indexed @@ -333,7 +328,6 @@ impl MGFIndexing for ScansIndexing { } } - /// Indexing strategy for an MGF using the `TITLE` scan header, parsed /// according to the Trans-Proteomics Pipeline notation's `NativeID` /// component. @@ -362,7 +356,6 @@ impl MGFIndexing for TPPTitleParsingNativeIDIndexing { } } - /// Indexing strategy for an MGF using the `TITLE` scan header, parsed /// according to the Trans-Proteomics Pipeline notation's `ScanNumber1` /// component. @@ -391,7 +384,6 @@ impl MGFIndexing for TPPTitleParsingScanNumberIndexing { } } - /// An MGF (Mascot Generic Format) file parser that supports iteration and random access. /// The parser produces [`Spectrum`](crate::spectrum::Spectrum) instances. These may be /// converted directly into [`CentroidSpectrum`](crate::spectrum::CentroidSpectrum) @@ -449,11 +441,7 @@ pub(crate) trait MGFLineParsing< let nparts = if let Some(i) = it.next() { intensity_token = i; charge_token_opt = it.next(); - if charge_token_opt.is_some() { - 3 - } else { - 2 - } + if charge_token_opt.is_some() { 3 } else { 2 } } else { 1 }; @@ -565,12 +553,12 @@ pub(crate) trait MGFLineParsing< } if let Some(ion) = builder .description - .precursor.last_mut().and_then(|v| v.iter_mut().last()) - + .precursor + .last_mut() + .and_then(|v| v.iter_mut().last()) + && ion.charge.is_none() { - if ion.charge.is_none() { - ion.charge = builder.precursor_charge - } + ion.charge = builder.precursor_charge } } &_ => { @@ -664,10 +652,10 @@ pub(crate) trait MGFLineParsing< } impl< - R: io::Read, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MGFLineParsing for MGFReaderType + R: io::Read, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFLineParsing for MGFReaderType { fn state(&self) -> &MGFParserState { &self.state @@ -693,10 +681,10 @@ impl< } impl< - R: io::Read, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MGFReaderType + R: io::Read, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFReaderType { fn read_line(&mut self, buffer: &mut String) -> io::Result { self.handle.read_line(buffer) @@ -812,7 +800,6 @@ impl< fd } - /// Get the current indexing strategy implementing [`MGFIndexing`] #[allow(clippy::borrowed_box)] pub fn indexer(&self) -> &Box { @@ -851,10 +838,10 @@ impl< } impl< - R: io::Read, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > Iterator for MGFReaderType + R: io::Read, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> Iterator for MGFReaderType { type Item = MultiLayerSpectrum; @@ -865,10 +852,10 @@ impl< } impl< - R: SeekRead, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MGFReaderType + R: SeekRead, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MGFReaderType { /// Construct a new MGFReaderType and build an offset index /// using [`Self::build_index`] @@ -878,7 +865,6 @@ impl< reader } - /// Construct a new [`MGFReaderType`] and build an offset index /// using [`Self::build_index`] using the specified indexer. pub fn new_indexed_with(file: R, indexer: Box) -> MGFReaderType { @@ -926,12 +912,12 @@ impl< } else if found_start { let string_buffer = String::from_utf8_lossy(&buffer); let indexer = self.indexer(); - if let Some((key, value)) = string_buffer.split_once('=') { - if indexer.is_index_key(key) { - index.insert(indexer.handle_key(key, value), last_start); - found_start = false; - last_start = 0; - } + if let Some((key, value)) = string_buffer.split_once('=') + && indexer.is_index_key(key) + { + index.insert(indexer.handle_key(key, value), last_start); + found_start = false; + last_start = 0; } } offset += b as u64; @@ -948,10 +934,10 @@ impl< } impl< - R: SeekRead, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > SpectrumSource> for MGFReaderType + R: SeekRead, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> SpectrumSource> for MGFReaderType { fn detail_level(&self) -> &DetailLevel { &self.detail_level @@ -1017,10 +1003,10 @@ impl< } impl< - R: SeekRead, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > RandomAccessSpectrumIterator> for MGFReaderType + R: SeekRead, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> RandomAccessSpectrumIterator> for MGFReaderType { fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { match self._offset_of_id(id) { @@ -1067,10 +1053,8 @@ impl< } } -impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MZFileReader> for MGFReaderType +impl, D: DeconvolutedCentroidLike + From> + MZFileReader> for MGFReaderType { fn open_file(source: fs::File) -> io::Result { Ok(Self::new(source)) @@ -1084,10 +1068,10 @@ impl< /// The MGF format does not contain any consistent metadata, but additional /// information can be included after creation. impl< - R: io::Read, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > MSDataFileMetadata for MGFReaderType + R: io::Read, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> MSDataFileMetadata for MGFReaderType { crate::impl_metadata_trait!(); @@ -1109,10 +1093,10 @@ impl< } impl< - R: Read, - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - > ChromatogramSource for MGFReaderType + R: Read, + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, +> ChromatogramSource for MGFReaderType { fn get_chromatogram_by_id(&mut self, _: &str) -> Option { None diff --git a/src/io/mgf/writer.rs b/src/io/mgf/writer.rs index 86944af..e180e01 100644 --- a/src/io/mgf/writer.rs +++ b/src/io/mgf/writer.rs @@ -1,13 +1,11 @@ - use std::collections::HashMap; -use std::io::{self, prelude::*, BufWriter}; +use std::io::{self, BufWriter, prelude::*}; use std::marker::PhantomData; use std::str; - use mzpeaks::{ - peak::KnownCharge, CentroidPeak, DeconvolutedPeak, IntensityMeasurement, MZLocated, - PeakCollection, + CentroidPeak, DeconvolutedPeak, IntensityMeasurement, MZLocated, PeakCollection, + peak::KnownCharge, }; use crate::prelude::*; @@ -16,17 +14,13 @@ use crate::meta::{ DataProcessing, FileDescription, InstrumentConfiguration, MSDataFileMetadata, MassSpectrometryRun, Sample, Software, }; -use crate::params::{ - ControlledVocabulary, ParamDescribed, ParamLike, ParamValue as _, CURIE, -}; +use crate::params::{CURIE, ControlledVocabulary, ParamDescribed, ParamLike, ParamValue as _}; use crate::spectrum::{ - bindata::BinaryArrayMap, IonProperties, Precursor, PrecursorSelection, RefPeakDataLevel, SignalContinuity, - SpectrumDescription, SpectrumLike, + SpectrumDescription, SpectrumLike, bindata::BinaryArrayMap, }; - const TITLE_CV: CURIE = ControlledVocabulary::MS.curie(1000796); const MS_LEVEL_CV: CURIE = ControlledVocabulary::MS.curie(1000511); const MSN_SPECTRUM_CV: CURIE = ControlledVocabulary::MS.curie(1000580); @@ -284,7 +278,7 @@ impl = MGFWriterType; pub type SimpleMGFWriter = MGFWriterType; -pub type SimpleMGFWriterType = MGFWriterType; \ No newline at end of file +pub type SimpleMGFWriterType = MGFWriterType; diff --git a/src/io/mod.rs b/src/io/mod.rs index 48352f5..1bc0745 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -18,8 +18,9 @@ mod utils; pub(crate) mod compression; pub use crate::io::infer_format::{ - infer_format, infer_from_path, infer_from_stream, IMMZReaderType, MZReader, MZReaderBuilder, - MZReaderType, MassSpectrometryFormat, MassSpectrometryReadWriteProcess, Sink, Source, + IMMZReaderType, MZReader, MZReaderBuilder, MZReaderType, MassSpectrometryFormat, + MassSpectrometryReadWriteProcess, Sink, Source, infer_format, infer_from_path, + infer_from_stream, }; #[cfg(feature = "mgf")] @@ -47,7 +48,9 @@ pub use crate::io::traits::{ }; #[cfg(feature = "async_partial")] -pub use crate::io::traits::{AsyncSpectrumSource, AsyncRandomAccessSpectrumIterator, SpectrumStream}; +pub use crate::io::traits::{ + AsyncRandomAccessSpectrumIterator, AsyncSpectrumSource, SpectrumStream, +}; #[cfg(feature = "async")] pub use crate::io::traits::AsyncMZFileReader; @@ -79,11 +82,9 @@ pub mod tdf; pub mod usi; - // A location to re-export the symbols needed to make mz_read and // mz_write macros behave properly in other crates. #[doc(hidden)] pub mod _impl { pub use super::shorthand::*; - -} \ No newline at end of file +} diff --git a/src/io/mzml/async_reader.rs b/src/io/mzml/async_reader.rs index 8baacdc..aefa802 100644 --- a/src/io/mzml/async_reader.rs +++ b/src/io/mzml/async_reader.rs @@ -11,8 +11,8 @@ use tokio::{self, io}; use log::{debug, warn}; use quick_xml::{ - events::{BytesEnd, BytesStart, BytesText, Event}, Error as XMLError, Reader, + events::{BytesEnd, BytesStart, BytesText, Event}, }; use mzpeaks::{CentroidPeak, DeconvolutedPeak}; @@ -27,15 +27,11 @@ use crate::{ }, meta::{ DataProcessing, FileDescription, InstrumentConfiguration, MSDataFileMetadata, - MassSpectrometryRun, Sample, Software, ScanSettings, + MassSpectrometryRun, Sample, ScanSettings, Software, }, params::Param, prelude::*, - spectrum::{ - bindata::BuildFromArrayMap, - spectrum_types::MultiLayerSpectrum, - Chromatogram, - }, + spectrum::{Chromatogram, bindata::BuildFromArrayMap, spectrum_types::MultiLayerSpectrum}, }; use super::{ @@ -106,11 +102,11 @@ pub struct MzMLReaderType< } impl< - 'a, - R: AsyncReadType + Unpin, - C: CentroidLike + Send + Sync + BuildFromArrayMap, - D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, - > MzMLReaderType + 'a, + R: AsyncReadType + Unpin, + C: CentroidLike + Send + Sync + BuildFromArrayMap, + D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, +> MzMLReaderType { /// Create a new [`MzMLReaderType`] instance, wrapping the [`tokio::io::AsyncRead`] handle /// provided with an `[io::BufReader`] and parses the metadata section of the file. @@ -505,10 +501,10 @@ impl< } impl< - R: AsyncReadType + Unpin, - C: CentroidLike + Send + Sync, - D: DeconvolutedCentroidLike + Send + Sync, - > MSDataFileMetadata for MzMLReaderType + R: AsyncReadType + Unpin, + C: CentroidLike + Send + Sync, + D: DeconvolutedCentroidLike + Send + Sync, +> MSDataFileMetadata for MzMLReaderType { crate::impl_metadata_trait!(); @@ -612,7 +608,7 @@ impl IndexedMzMLIndexExtractor { match index_name.as_ref() { "spectrum" => return Ok(IndexParserState::SpectrumIndexList), "chromatogram" => { - return Ok(IndexParserState::ChromatogramIndexList) + return Ok(IndexParserState::ChromatogramIndexList); } _ => {} } @@ -691,10 +687,10 @@ impl IndexedMzMLIndexExtractor { /// in the library, this also re-creates the [`SpectrumSource`](crate::io::traits::SpectrumSource) API with /// asynchronous execution. impl< - R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin, - C: CentroidLike + Send + Sync + BuildFromArrayMap, - D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, - > MzMLReaderType + R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin, + C: CentroidLike + Send + Sync + BuildFromArrayMap, + D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, +> MzMLReaderType { pub async fn new_indexed(file: R) -> MzMLReaderType { let mut this = Self::new(file).await; @@ -973,10 +969,10 @@ impl< } impl< - R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin + Send, - C: CentroidLike + Send + Sync + BuildFromArrayMap, - D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, - > AsyncSpectrumSource> for MzMLReaderType + R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin + Send, + C: CentroidLike + Send + Sync + BuildFromArrayMap, + D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, +> AsyncSpectrumSource> for MzMLReaderType { async fn reset(&mut self) { self.reset().await; @@ -1013,15 +1009,18 @@ impl< #[cfg(feature = "async")] impl< - C: CentroidLike + Send + Sync + BuildFromArrayMap, - D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, - > AsyncMZFileReader> for MzMLReaderType + C: CentroidLike + Send + Sync + BuildFromArrayMap, + D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, +> AsyncMZFileReader> for MzMLReaderType { async fn construct_index_from_stream(&mut self) -> u64 { match self.read_index_from_end().await { Ok(val) => val, Err(e) => { - panic!("Building an index from byte stream not yet implemented. Failed to parse index: {}", e) + panic!( + "Building an index from byte stream not yet implemented. Failed to parse index: {}", + e + ) } } } @@ -1032,11 +1031,10 @@ impl< } impl< - R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin + Send, - C: CentroidLike + Send + Sync + BuildFromArrayMap, - D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, - > AsyncRandomAccessSpectrumIterator> - for MzMLReaderType + R: AsyncReadType + AsyncSeek + AsyncSeekExt + Unpin + Send, + C: CentroidLike + Send + Sync + BuildFromArrayMap, + D: DeconvolutedCentroidLike + Send + Sync + BuildFromArrayMap, +> AsyncRandomAccessSpectrumIterator> for MzMLReaderType { async fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { let idx = match self._offset_of_id(id) { @@ -1044,7 +1042,7 @@ impl< None => { return Err(crate::io::SpectrumAccessError::SpectrumIdNotFound( id.to_string(), - )) + )); } }; diff --git a/src/io/mzml/mod.rs b/src/io/mzml/mod.rs index e10700e..b2bde1d 100644 --- a/src/io/mzml/mod.rs +++ b/src/io/mzml/mod.rs @@ -23,21 +23,20 @@ mod writer; mod async_reader; pub use reading_shared::{ - CVParamParse, MzMLParserError, MzMLParserState, MzMLSAX, XMLParseBase, - FileMetadataBuilder, EntryType + CVParamParse, EntryType, FileMetadataBuilder, MzMLParserError, MzMLParserState, MzMLSAX, + XMLParseBase, }; #[allow(unused)] pub(crate) use reading_shared::{IncrementingIdMap, ParserResult}; pub use crate::io::mzml::reader::{ - MzMLReader, MzMLReaderType, MzMLSpectrumBuilder, - SpectrumBuilding, + MzMLReader, MzMLReaderType, MzMLSpectrumBuilder, SpectrumBuilding, }; pub(crate) use crate::io::mzml::reader::is_mzml; -pub use crate::io::mzml::writer::{MzMLWriter, MzMLWriterState, MzMLWriterType, MzMLWriterError}; +pub use crate::io::mzml::writer::{MzMLWriter, MzMLWriterError, MzMLWriterState, MzMLWriterType}; #[cfg(feature = "async")] pub use crate::io::mzml::async_reader::{ diff --git a/src/io/mzml/reader.rs b/src/io/mzml/reader.rs index 819b14e..25ac71f 100644 --- a/src/io/mzml/reader.rs +++ b/src/io/mzml/reader.rs @@ -11,18 +11,20 @@ use log::{debug, trace, warn}; use mzpeaks::{CentroidLike, CentroidPeak, DeconvolutedPeak}; use quick_xml::{ - events::{BytesEnd, BytesStart, BytesText, Event}, Error as XMLError, Reader, + events::{BytesEnd, BytesStart, BytesText, Event}, }; use crate::{ - io::{utils::DetailLevel, Generic3DIonMobilityFrameSource, IntoIonMobilityFrameSource}, + io::{Generic3DIonMobilityFrameSource, IntoIonMobilityFrameSource, utils::DetailLevel}, meta::{ - DataProcessing, DissociationEnergyTerm, FileDescription, InstrumentConfiguration, MSDataFileMetadata, MassSpectrometryRun, Sample, ScanSettings, Software + DataProcessing, DissociationEnergyTerm, FileDescription, InstrumentConfiguration, + MSDataFileMetadata, MassSpectrometryRun, Sample, ScanSettings, Software, }, params::{Param, ParamList, Unit}, prelude::{ParamLike, *}, spectrum::{ + HasIonMobility, bindata::{ ArrayType, BinaryArrayMap, BinaryCompressionType, BinaryDataArrayType, BuildArrayMapFrom, BuildFromArrayMap, DataArray, @@ -30,7 +32,6 @@ use crate::{ chromatogram::{Chromatogram, ChromatogramLike}, scan_properties::*, spectrum_types::{CentroidSpectrumType, MultiLayerSpectrum, RawSpectrum, Spectrum}, - HasIonMobility, }, }; @@ -93,7 +94,10 @@ pub trait SpectrumBuilding<'a, C: CentroidLike, D: DeconvolutedCentroidLike, S: /// Set the compression method for the current [`DataArray`] fn set_current_compressiion(&mut self, compression: BinaryCompressionType) { - trace!("Setting current compression method for {:?} to {compression:?}", self.current_array_mut().name()); + trace!( + "Setting current compression method for {:?} to {compression:?}", + self.current_array_mut().name() + ); self.current_array_mut().compression = compression; } @@ -105,49 +109,133 @@ pub trait SpectrumBuilding<'a, C: CentroidLike, D: DeconvolutedCentroidLike, S: x if x == unsafe { BinaryCompressionType::Zlib.accession().unwrap_unchecked() } => { self.set_current_compressiion(BinaryCompressionType::Zlib); } - x if x == unsafe { BinaryCompressionType::NoCompression.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NoCompression + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NoCompression); } - x if x == unsafe { BinaryCompressionType::NumpressLinear.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressLinear + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressLinear); } - x if x == unsafe { BinaryCompressionType::NumpressPIC.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressPIC + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressPIC); } - x if x == unsafe { BinaryCompressionType::NumpressSLOF.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressSLOF + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressSLOF); } - x if x == unsafe { BinaryCompressionType::NumpressLinearZlib.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressLinearZlib + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressLinearZlib); } - x if x == unsafe { BinaryCompressionType::NumpressPICZlib.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressPICZlib + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressPICZlib); } - x if x == unsafe { BinaryCompressionType::NumpressSLOFZlib.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressSLOFZlib + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressSLOFZlib); } - x if x == unsafe { BinaryCompressionType::DeltaPrediction.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::DeltaPrediction + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::DeltaPrediction); } - x if x == unsafe { BinaryCompressionType::LinearPrediction.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::LinearPrediction + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::LinearPrediction); } - x if x == unsafe { BinaryCompressionType::ShuffleZstd.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::ShuffleZstd + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::ShuffleZstd); } - x if x == unsafe { BinaryCompressionType::DeltaShuffleZstd.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::DeltaShuffleZstd + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::DeltaShuffleZstd); } x if x == unsafe { BinaryCompressionType::Zstd.accession().unwrap_unchecked() } => { self.set_current_compressiion(BinaryCompressionType::Zstd); } - x if x == unsafe { BinaryCompressionType::ZstdDict.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::ZstdDict + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::ZstdDict); } - x if x == unsafe { BinaryCompressionType::NumpressLinearZstd.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressLinearZstd + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressLinearZstd); } - x if x == unsafe { BinaryCompressionType::NumpressSLOFZstd.accession().unwrap_unchecked() } => { + x if x + == unsafe { + BinaryCompressionType::NumpressSLOFZstd + .accession() + .unwrap_unchecked() + } => + { self.set_current_compressiion(BinaryCompressionType::NumpressSLOFZstd); } // Array data types @@ -171,19 +259,19 @@ pub trait SpectrumBuilding<'a, C: CentroidLike, D: DeconvolutedCentroidLike, S: 1000514 => { self.current_array_mut().name = ArrayType::MZArray; *self.current_array_mut().unit_mut() = param.unit(); - }, + } 1000515 => { self.current_array_mut().name = ArrayType::IntensityArray; *self.current_array_mut().unit_mut() = param.unit(); - }, + } 1000516 => { self.current_array_mut().name = ArrayType::ChargeArray; *self.current_array_mut().unit_mut() = param.unit(); - }, + } 1000517 => { self.current_array_mut().name = ArrayType::SignalToNoiseArray; *self.current_array_mut().unit_mut() = param.unit(); - }, + } 1000595 => { self.current_array_mut().name = ArrayType::TimeArray; let unit = param.unit(); @@ -195,17 +283,17 @@ pub trait SpectrumBuilding<'a, C: CentroidLike, D: DeconvolutedCentroidLike, S: warn!("Invalid unit {} found for time array", unit) } } - }, + } 1000617 => { self.current_array_mut().name = ArrayType::WavelengthArray; self.current_array_mut().unit = param.unit(); - }, + } 1000786 => { self.current_array_mut().name = ArrayType::NonStandardDataArray { name: Box::new(param.value().to_string()), }; *self.current_array_mut().unit_mut() = param.unit(); - }, + } 1002477 => { self.current_array_mut().name = ArrayType::MeanDriftTimeArray; self.current_array_mut().unit = param.unit(); @@ -570,11 +658,8 @@ impl<'inner, C: CentroidLike, D: DeconvolutedCentroidLike> } } -impl< - 'inner, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > MzMLSpectrumBuilder<'inner, C, D> +impl<'inner, C: CentroidLike + BuildFromArrayMap, D: DeconvolutedCentroidLike + BuildFromArrayMap> + MzMLSpectrumBuilder<'inner, C, D> { pub fn new() -> MzMLSpectrumBuilder<'inner, C, D> { Self::with_detail_level(DetailLevel::Full) @@ -694,7 +779,10 @@ impl< if Activation::is_param_activation(¶m) && self.precursor_mut().activation.method().is_none() { - self.precursor_mut().activation.methods_mut().push(param.into()); + self.precursor_mut() + .activation + .methods_mut() + .push(param.into()); } else { match param.name.as_ref() { "collision energy" | "activation energy" => { @@ -738,7 +826,7 @@ impl { - match attr.key.as_ref() { - b"dataProcessingRef" => { - match attr.unescape_value() { - Ok(v) => { - self.current_array.set_data_processing_reference(Some(v.into())); - dp_set = true; - break; - }, - Err(msg) => return Err(self.handle_xml_error(msg, state)) + if attr.key.as_ref() == b"dataProcessingRef" { + match attr.unescape_value() { + Ok(v) => { + self.current_array + .set_data_processing_reference(Some(v.into())); + dp_set = true; + break; } + Err(msg) => return Err(self.handle_xml_error(msg, state)), } - _ => {} } - }, + } Err(msg) => { return Err(self.handle_xml_error(msg.into(), state)); - }, + } } } if !dp_set { if let Some(dp_ref) = self.spectrum_data_processing_ref.as_ref() { - self.current_array.set_data_processing_reference(Some(dp_ref.clone())); - } - else if let Some(dp_ref) = self.run_level_data_processing.as_ref() { - self.current_array.set_data_processing_reference(Some(dp_ref.clone())); + self.current_array + .set_data_processing_reference(Some(dp_ref.clone())); + } else if let Some(dp_ref) = self.run_level_data_processing.as_ref() { + self.current_array + .set_data_processing_reference(Some(dp_ref.clone())); } } @@ -926,26 +1013,26 @@ impl { match Self::handle_param_borrowed(event, reader_position, state) { - Ok(param) => { - match state { - MzMLParserState::Spectrum | MzMLParserState::Chromatogram => { - self.fill_spectrum(param) - } - MzMLParserState::ScanList => { - if param.is_controlled() { - if let Some(comb) = ScanCombination::from_accession( - param.controlled_vocabulary.unwrap(), - param.accession.unwrap(), - ) { - self.acquisition.combination = comb - } else { - self.acquisition.add_param(param.into()) - } + Ok(param) => match state { + MzMLParserState::Spectrum | MzMLParserState::Chromatogram => { + self.fill_spectrum(param) + } + MzMLParserState::ScanList => { + if param.is_controlled() { + if let Some(comb) = ScanCombination::from_accession( + param.controlled_vocabulary.unwrap(), + param.accession.unwrap(), + ) { + self.acquisition.combination = comb } else { self.acquisition.add_param(param.into()) } + } else { + self.acquisition.add_param(param.into()) } - MzMLParserState::Scan => match param.name.as_bytes() { + } + MzMLParserState::Scan => { + match param.name.as_bytes() { b"scan start time" => { let value: f64 = param .to_f64() @@ -975,61 +1062,64 @@ impl self - .acquisition - .last_scan_mut() - .unwrap() - .add_param(param.into()), - MzMLParserState::ScanWindow => { - self.fill_scan_window(param.into()); - } - MzMLParserState::IsolationWindow => { - self.fill_isolation_window(param.into()); } - MzMLParserState::SelectedIon | MzMLParserState::SelectedIonList => { - self.fill_selected_ion(param.into()); - } - MzMLParserState::Activation => { - if Activation::is_param_activation(¶m) { - self.precursor_mut().activation.methods_mut().push(param.into()); - } else { - let dissociation_energy = param.curie().and_then(|c| { + } + MzMLParserState::ScanWindowList => self + .acquisition + .last_scan_mut() + .unwrap() + .add_param(param.into()), + MzMLParserState::ScanWindow => { + self.fill_scan_window(param.into()); + } + MzMLParserState::IsolationWindow => { + self.fill_isolation_window(param.into()); + } + MzMLParserState::SelectedIon | MzMLParserState::SelectedIonList => { + self.fill_selected_ion(param.into()); + } + MzMLParserState::Activation => { + if Activation::is_param_activation(¶m) { + self.precursor_mut() + .activation + .methods_mut() + .push(param.into()); + } else { + let dissociation_energy = param.curie().and_then(|c| { DissociationEnergyTerm::from_curie(&c, param.value().to_f32().unwrap_or_else(|e| { warn!("Failed to convert dissociation energy: {e} for {} for {}", param.name(), self.warning_context()); 0.0 })) }); - match dissociation_energy { - Some(t) => { - if t.is_supplemental() { - self.precursor_mut().activation.add_param(param.into()) - } else { - if self.precursor_mut().activation.energy != 0.0 { - warn!( - "Multiple dissociation energies detected. Saw {t} after already setting dissociation energy for {}", - self.warning_context() - ); - } - self.precursor_mut().activation.energy = t.energy(); + match dissociation_energy { + Some(t) => { + if t.is_supplemental() { + self.precursor_mut().activation.add_param(param.into()) + } else { + if self.precursor_mut().activation.energy != 0.0 { + warn!( + "Multiple dissociation energies detected. Saw {t} after already setting dissociation energy for {}", + self.warning_context() + ); } - } - None => { - self.precursor_mut().activation.add_param(param.into()); + self.precursor_mut().activation.energy = t.energy(); } } + None => { + self.precursor_mut().activation.add_param(param.into()); + } } } - MzMLParserState::BinaryDataArrayList => {} - MzMLParserState::BinaryDataArray => { - self.fill_binary_data_array(param); - } - MzMLParserState::Precursor | MzMLParserState::PrecursorList => { - warn!("cvParam found for {:?} where none are allowed", &state); - } - _ => {} } - } + MzMLParserState::BinaryDataArrayList => {} + MzMLParserState::BinaryDataArray => { + self.fill_binary_data_array(param); + } + MzMLParserState::Precursor | MzMLParserState::PrecursorList => { + warn!("cvParam found for {:?} where none are allowed", &state); + } + _ => {} + }, Err(err) => return Err(err), } } @@ -1060,7 +1150,8 @@ impl IntoIonMobilityFrameSource for MzMLReaderType + R: Read + Seek, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> IntoIonMobilityFrameSource for MzMLReaderType { type IonMobilityFrameSource< CF: FeatureLike, @@ -1203,12 +1294,12 @@ impl< } impl< - 'a, - 'b: 'a, - R: Read, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > MzMLReaderType + 'a, + 'b: 'a, + R: Read, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> MzMLReaderType { /// Create a new [`MzMLReaderType`] instance, wrapping the [`io::Read`] handle /// provided with an [`io::BufReader`] and parses the metadata section of the file. @@ -1398,7 +1489,12 @@ impl< let mut reader = Reader::from_reader(&mut self.handle); reader.trim_text(true); accumulator = accumulator.borrow_instrument_configuration(&mut self.instrument_id_map); - accumulator.set_run_data_processing(self.run.default_data_processing_id.clone().map(|v| v.into_boxed_str())); + accumulator.set_run_data_processing( + self.run + .default_data_processing_id + .clone() + .map(|v| v.into_boxed_str()), + ); let mut offset: usize = 0; macro_rules! err_state { @@ -1514,9 +1610,7 @@ impl< ); Ok((accumulator, offset)) } - MzMLParserState::EOF => { - Err(MzMLParserError::EOF) - } + MzMLParserState::EOF => Err(MzMLParserError::EOF), _ => Err(MzMLParserError::IncompleteSpectrum), } } @@ -1547,20 +1641,20 @@ impl< match self._parse_into(accumulator) { Ok((accumulator, sz)) => { accumulator.into_spectrum(spectrum); - if self.detail_level == DetailLevel::Full { - if let Err(e) = spectrum.try_build_peaks() { - log::debug!("Failed to eagerly load peaks from centroid spectrum: {e}"); - } + if self.detail_level == DetailLevel::Full + && let Err(e) = spectrum.try_build_peaks() + { + log::debug!("Failed to eagerly load peaks from centroid spectrum: {e}"); } Ok(sz) } Err(err) => { match &err { - MzMLParserError::EOF => {}, - err => log::error!("Error while reading mzML spectrum: {err}") + MzMLParserError::EOF => {} + err => log::error!("Error while reading mzML spectrum: {err}"), }; Err(err) - }, + } } } @@ -1574,7 +1668,7 @@ impl< Ok(_sz) => Some(spectrum), Err(err) => { match err { - MzMLParserError::EOF => {}, + MzMLParserError::EOF => {} err => { trace!("Failed to read next spectrum: {err}"); } @@ -1618,7 +1712,7 @@ impl< Err(err) => { log::error!("Error while reading mzML chromatogram: {err}"); Err(err) - }, + } } } } @@ -1626,10 +1720,10 @@ impl< /// When the underlying stream supports random access, this type can read the index at the end of /// an `indexedmzML` document and use the offset map to jump to immediately jump to a specific spectrum impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > MzMLReaderType + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> MzMLReaderType { pub fn check_stream(&mut self, next_tag: &str) -> Result { let position = match self.stream_position() { @@ -1738,10 +1832,10 @@ impl< } impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > ChromatogramSource for MzMLReaderType + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> ChromatogramSource for MzMLReaderType { fn get_chromatogram_by_id(&mut self, id: &str) -> Option { self.get_chromatogram_by_id(id) @@ -1754,10 +1848,10 @@ impl< /// [`MzMLReaderType`] instances are [`Iterator`]s over [`Spectrum`] impl< - R: io::Read, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > Iterator for MzMLReaderType + R: io::Read, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> Iterator for MzMLReaderType { type Item = MultiLayerSpectrum; @@ -1769,10 +1863,10 @@ impl< /// They can also be used to fetch specific spectra by ID, index, or start /// time when the underlying file stream supports [`io::Seek`]. impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > SpectrumSource> for MzMLReaderType + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> SpectrumSource> for MzMLReaderType { /// Retrieve a spectrum by it's native ID fn get_spectrum_by_id(&mut self, id: &str) -> Option> { @@ -1844,10 +1938,10 @@ impl< /// The iterator can also be updated to move to a different location in the /// stream efficiently. impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > RandomAccessSpectrumIterator> for MzMLReaderType + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> RandomAccessSpectrumIterator> for MzMLReaderType { fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { match self._offset_of_id(id) { @@ -1886,10 +1980,10 @@ enum IndexRecoveryOperation { } impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > MzMLReaderType + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> MzMLReaderType { /// Construct a new MzMLReaderType and build an offset index /// using [`Self::build_index`] @@ -1924,7 +2018,7 @@ impl< panic!("An IO error occurred while trying to recover the index: {e}") }); self.build_index(); - }, + } IndexRecoveryOperation::IOFailure(err) => { panic!("An IO error occurred while validating the index: {err}") } @@ -1935,7 +2029,10 @@ impl< fn verify_index(&mut self) -> Result<(), IndexRecoveryOperation> { let n = self.spectrum_index.len(); trace!("Verifying offset index of length {n}"); - let position = self.handle.stream_position().map_err(IndexRecoveryOperation::IOFailure)?; + let position = self + .handle + .stream_position() + .map_err(IndexRecoveryOperation::IOFailure)?; if n > 0 { // Try to pick a spectrum that's close to the beginning of the file to avoid large // amounts of wasted scanning for non-linear files, but pick one far enough in it would @@ -1948,29 +2045,32 @@ impl< self.set_detail_level(dl); let s_found = s.is_some_and(|s| s.index() == center); if s_found { - self.seek(SeekFrom::Start(position)).map_err(IndexRecoveryOperation::IOFailure)?; + self.seek(SeekFrom::Start(position)) + .map_err(IndexRecoveryOperation::IOFailure)?; return Ok(()); } else { match self.handle.fill_buf() { Ok(buf) => { - if let Some(i) = buf.iter().position(|b| *b == b'\r') { - if let Some(b2) = buf.get(i + 1) { - let has_windows_eol = *b2 == b'\n'; - if has_windows_eol { - warn!("Carriage return line endings detected and offset index is not valid"); - self.seek(SeekFrom::Start(position)).map_err(IndexRecoveryOperation::IOFailure)?; - return Err(IndexRecoveryOperation::EOLMismatchSuspected); - } + if let Some(i) = buf.iter().position(|b| *b == b'\r') + && let Some(b2) = buf.get(i + 1) + { + let has_windows_eol = *b2 == b'\n'; + if has_windows_eol { + warn!( + "Carriage return line endings detected and offset index is not valid" + ); + self.seek(SeekFrom::Start(position)) + .map_err(IndexRecoveryOperation::IOFailure)?; + return Err(IndexRecoveryOperation::EOLMismatchSuspected); } } } - Err(e) => { - return Err(IndexRecoveryOperation::IOFailure(e)) - }, + Err(e) => return Err(IndexRecoveryOperation::IOFailure(e)), } } } - self.seek(SeekFrom::Start(position)).map_err(IndexRecoveryOperation::IOFailure)?; + self.seek(SeekFrom::Start(position)) + .map_err(IndexRecoveryOperation::IOFailure)?; Ok(()) } @@ -2001,11 +2101,11 @@ impl< self.handle.read_to_end(&mut buf)?; let pattern = regex::Regex::new("([0-9a-zA-Z]+)").unwrap(); - if let Some(captures) = pattern.captures(&String::from_utf8_lossy(&buf)) { - if let Some(hit) = captures.get(1) { - self.handle.seek(SeekFrom::Start(current_position))?; - return Ok(Some(hit.as_str().to_string())); - } + if let Some(captures) = pattern.captures(&String::from_utf8_lossy(&buf)) + && let Some(hit) = captures.get(1) + { + self.handle.seek(SeekFrom::Start(current_position))?; + return Ok(Some(hit.as_str().to_string())); } self.handle.seek(SeekFrom::Start(current_position))?; @@ -2090,7 +2190,9 @@ impl< .handle .stream_position() .expect("Failed to save restore location"); - trace!("Starting to build offset index by traversing the file, storing last position as {start}"); + trace!( + "Starting to build offset index by traversing the file, storing last position as {start}" + ); self.seek(SeekFrom::Start(0)) .expect("Failed to reset stream to beginning"); let mut reader = Reader::from_reader(&mut self.handle); @@ -2237,11 +2339,11 @@ pub struct ChromatogramIter< } impl< - 'a, - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > ChromatogramIter<'a, R, C, D> + 'a, + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> ChromatogramIter<'a, R, C, D> { pub fn new(reader: &'a mut MzMLReaderType) -> Self { Self { reader, index: 0 } @@ -2249,10 +2351,10 @@ impl< } impl< - R: SeekRead, - C: CentroidLike + BuildFromArrayMap, - D: DeconvolutedCentroidLike + BuildFromArrayMap, - > Iterator for ChromatogramIter<'_, R, C, D> + R: SeekRead, + C: CentroidLike + BuildFromArrayMap, + D: DeconvolutedCentroidLike + BuildFromArrayMap, +> Iterator for ChromatogramIter<'_, R, C, D> { type Item = Chromatogram; @@ -2283,22 +2385,26 @@ mod test { assert_eq!(reader.file_description().source_files.len(), 1); assert_eq!(reader.file_description().contents.len(), 2); - assert!(reader - .file_description() - .get_param_by_accession("MS:1000579") - .is_some()); + assert!( + reader + .file_description() + .get_param_by_accession("MS:1000579") + .is_some() + ); assert_eq!(reader.file_description().source_files[0].name, "small.RAW"); assert!(reader.file_description().has_ms1_spectra()); assert!(reader.file_description().has_msn_spectra()); assert!(reader.file_description().has_contents()); - assert!(reader - .file_description() - .source_files - .first() - .unwrap() - .native_id_format() - .is_some()); + assert!( + reader + .file_description() + .source_files + .first() + .unwrap() + .native_id_format() + .is_some() + ); let config = reader.instrument_configurations().get(&0).unwrap(); let comp = config.iter().find_map(|c| c.mass_analyzer()).unwrap(); @@ -2934,7 +3040,6 @@ mod test { Ok(()) } - #[test_log::test] fn test_iterator_specialization() -> io::Result<()> { let path = path::Path::new("./test/data/small.mzML"); diff --git a/src/io/mzml/reading_shared.rs b/src/io/mzml/reading_shared.rs index e16b67a..e9cfd1c 100644 --- a/src/io/mzml/reading_shared.rs +++ b/src/io/mzml/reading_shared.rs @@ -5,20 +5,22 @@ use std::{io, mem}; use chrono::{DateTime, FixedOffset}; use log::warn; -use quick_xml::events::{BytesEnd, BytesStart, BytesText}; use quick_xml::Error as XMLError; +use quick_xml::events::{BytesEnd, BytesStart, BytesText}; use thiserror::Error; use super::reader::Bytes; -use crate::io::traits::SeekRead; use crate::io::OffsetIndex; +use crate::io::traits::SeekRead; use crate::meta::{ - Component, ComponentType, DataProcessing, FileDescription, InstrumentConfiguration, MassSpectrometerFileFormatTerm, NativeSpectrumIdentifierFormatTerm, ProcessingMethod, Sample, ScanSettings, Software, SourceFile + Component, ComponentType, DataProcessing, FileDescription, InstrumentConfiguration, + MassSpectrometerFileFormatTerm, NativeSpectrumIdentifierFormatTerm, ProcessingMethod, Sample, + ScanSettings, Software, SourceFile, }; -use crate::params::{curie_to_num, ControlledVocabulary, Param, ParamCow, Unit}; +use crate::params::{ControlledVocabulary, Param, ParamCow, Unit, curie_to_num}; use crate::prelude::*; -use crate::spectrum::{bindata::ArrayRetrievalError, ArrayType}; +use crate::spectrum::{ArrayType, bindata::ArrayRetrievalError}; /** The different states the [`MzMLReaderType`](crate::io::mzml::MzMLReaderType) can enter while parsing @@ -134,7 +136,7 @@ pub enum MzMLParserError { #[error("Failed to decode {1}: {2} for {0}")] ArrayDecodingError(MzMLParserState, ArrayType, ArrayRetrievalError), #[error("Reached the end of the file")] - EOF + EOF, } impl From for io::Error { @@ -437,12 +439,11 @@ impl IndexedMzMLIndexExtractor { let mut buf = Bytes::new(); reader.read_to_end(&mut buf)?; let pattern = regex::Regex::new("(\\d+)").unwrap(); - if let Some(captures) = pattern.captures(&String::from_utf8_lossy(&buf)) { - if let Some(offset) = captures.get(1) { - if let Ok(offset) = offset.as_str().parse::() { - return Ok(Some(offset)); - } - } + if let Some(captures) = pattern.captures(&String::from_utf8_lossy(&buf)) + && let Some(offset) = captures.get(1) + && let Ok(offset) = offset.as_str().parse::() + { + return Ok(Some(offset)); } Ok(None) } @@ -674,7 +675,7 @@ impl FileMetadataBuilder<'_> { return Ok(MzMLParserState::ReferenceParamGroup); } b"instrumentConfigurationList" => { - return Ok(MzMLParserState::InstrumentConfigurationList) + return Ok(MzMLParserState::InstrumentConfigurationList); } b"instrumentConfiguration" => { let mut ic = InstrumentConfiguration::default(); @@ -906,13 +907,15 @@ impl FileMetadataBuilder<'_> { for attr in event.attributes().flatten() { match attr.key.as_ref() { b"count" => { - self.num_spectra = attr.unescape_value() - .expect("Error decoding spectrum list size") - .parse() - .map_err(|e| { - log::error!("Error parsing spectrum list size: {e}"); - e - }).ok(); + self.num_spectra = attr + .unescape_value() + .expect("Error decoding spectrum list size") + .parse() + .map_err(|e| { + log::error!("Error parsing spectrum list size: {e}"); + e + }) + .ok(); } b"defaultDataProcessingRef" => { let value = attr @@ -925,9 +928,7 @@ impl FileMetadataBuilder<'_> { } return Ok(MzMLParserState::SpectrumList); } - b"scanSettingsList" => { - return Ok(MzMLParserState::ScanSettingsList) - } + b"scanSettingsList" => return Ok(MzMLParserState::ScanSettingsList), b"scanSettings" => { let mut settings = ScanSettings::default(); for attr_parsed in event.attributes() { @@ -946,17 +947,17 @@ impl FileMetadataBuilder<'_> { } } self.scan_settings.push(settings); - return Ok(MzMLParserState::ScanSettings) - } - b"sourceFileRefList" => { - return Ok(MzMLParserState::SourceFileRefList) - } - b"targetList" => { - return Ok(MzMLParserState::TargetList) + return Ok(MzMLParserState::ScanSettings); } + b"sourceFileRefList" => return Ok(MzMLParserState::SourceFileRefList), + b"targetList" => return Ok(MzMLParserState::TargetList), b"target" => { - self.scan_settings.last_mut().unwrap().targets.push(Default::default()); - return Ok(MzMLParserState::Target) + self.scan_settings + .last_mut() + .unwrap() + .targets + .push(Default::default()); + return Ok(MzMLParserState::Target); } _ => {} } @@ -1020,7 +1021,13 @@ impl FileMetadataBuilder<'_> { self.scan_settings.last_mut().unwrap().add_param(param); } MzMLParserState::Target => { - self.scan_settings.last_mut().unwrap().targets.last_mut().unwrap().add_param(param); + self.scan_settings + .last_mut() + .unwrap() + .targets + .last_mut() + .unwrap() + .add_param(param); } _ => {} } @@ -1074,7 +1081,9 @@ impl FileMetadataBuilder<'_> { let param_group = match self.reference_param_groups.get(&group_id) { Some(params) => params.clone(), None => { - panic!("Encountered a referenceableParamGroupRef without a group definition") + panic!( + "Encountered a referenceableParamGroupRef without a group definition" + ) } }; @@ -1096,10 +1105,11 @@ impl FileMetadataBuilder<'_> { match attr_parsed { Ok(attr) => { if attr.key.as_ref() == b"ref" { - settings.source_file_refs.push(attr - .unescape_value() - .expect("Error decoding software reference") - .to_string()); + settings.source_file_refs.push( + attr.unescape_value() + .expect("Error decoding software reference") + .to_string(), + ); } } Err(msg) => { @@ -1128,7 +1138,7 @@ impl FileMetadataBuilder<'_> { return Ok(MzMLParserState::ReferenceParamGroupList); } b"instrumentConfigurationList" => { - return Ok(MzMLParserState::InstrumentConfigurationList) + return Ok(MzMLParserState::InstrumentConfigurationList); } b"instrumentConfiguration" => return Ok(MzMLParserState::InstrumentConfigurationList), b"componentList" => return Ok(MzMLParserState::InstrumentConfiguration), diff --git a/src/io/mzml/writer.rs b/src/io/mzml/writer.rs index 0f2e396..232688b 100644 --- a/src/io/mzml/writer.rs +++ b/src/io/mzml/writer.rs @@ -8,7 +8,7 @@ use log::warn; use mzpeaks::feature::FeatureLike; use thiserror::Error; -use mzpeaks::{CentroidLike, DeconvolutedCentroidLike, IonMobility, KnownCharge, Mass, MZ}; +use mzpeaks::{CentroidLike, DeconvolutedCentroidLike, IonMobility, KnownCharge, MZ, Mass}; use quick_xml::escape; use quick_xml::events::{BytesDecl, BytesEnd, BytesStart, BytesText, Event}; use quick_xml::{Error as XMLError, Writer}; @@ -21,19 +21,20 @@ use mzpeaks::{CentroidPeak, DeconvolutedPeak}; use crate::io::traits::IonMobilityFrameWriter; use crate::meta::{ - ComponentType, DataProcessing, FileDescription, InstrumentConfiguration, MSDataFileMetadata, MassSpectrometryRun, Sample, ScanSettings, Software + ComponentType, DataProcessing, FileDescription, InstrumentConfiguration, MSDataFileMetadata, + MassSpectrometryRun, Sample, ScanSettings, Software, }; use crate::params::{ AccessionIntCode, ControlledVocabulary, Param, ParamCow, ParamDescribed, ParamDescribedRead, ParamLike, ParamValue, Unit, ValueRef, }; use crate::spectrum::bindata::{ - to_bytes, ArrayRetrievalError, ArrayType, BinaryArrayMap, BinaryCompressionType, - BinaryDataArrayType, BuildArrayMap3DFrom, BuildArrayMapFrom, ByteArrayView, DataArray, + ArrayRetrievalError, ArrayType, BinaryArrayMap, BinaryCompressionType, BinaryDataArrayType, + BuildArrayMap3DFrom, BuildArrayMapFrom, ByteArrayView, DataArray, to_bytes, }; use crate::spectrum::spectrum_types::SpectrumLike; -use crate::spectrum::{scan_properties::*, Chromatogram, ChromatogramLike, RefPeakDataLevel}; -use crate::{curie, impl_param_described, RawSpectrum}; +use crate::spectrum::{Chromatogram, ChromatogramLike, RefPeakDataLevel, scan_properties::*}; +use crate::{RawSpectrum, curie, impl_param_described}; const BUFFER_SIZE: usize = 10000; @@ -453,7 +454,6 @@ impl Default for CompressionRegistry { } } - impl CompressionRegistry { pub fn new( methods: Vec<((ArrayType, BinaryDataArrayType), BinaryCompressionType)>, @@ -470,7 +470,9 @@ impl CompressionRegistry { fn check(method: BinaryCompressionType) -> BinaryCompressionType { match method { BinaryCompressionType::Decoded => { - warn!("The mzML writer was asked to use the `Decoded` array compression, using `Zlib` instead"); + warn!( + "The mzML writer was asked to use the `Decoded` array compression, using `Zlib` instead" + ); BinaryCompressionType::Zlib } _ => method, @@ -483,13 +485,15 @@ impl CompressionRegistry { dtype: BinaryDataArrayType, method: BinaryCompressionType, ) { - let val = self.methods.iter_mut().find(|(k, _)| { - (k.0 == array_type) && (k.1 == dtype) - }); + let val = self + .methods + .iter_mut() + .find(|(k, _)| (k.0 == array_type) && (k.1 == dtype)); if let Some((_, v)) = val { *v = Self::check(method); } else { - self.methods.push(((array_type, dtype), Self::check(method))) + self.methods + .push(((array_type, dtype), Self::check(method))) } } @@ -501,10 +505,15 @@ impl CompressionRegistry { self.get_compression_method(&array.name, array.dtype) } - pub fn get_compression_method(&self, array_type: &ArrayType, dtype: BinaryDataArrayType) -> BinaryCompressionType { - let val = self.methods.iter().find(|(k, _)| { - (k.0 == *array_type) && (k.1 == dtype) - }); + pub fn get_compression_method( + &self, + array_type: &ArrayType, + dtype: BinaryDataArrayType, + ) -> BinaryCompressionType { + let val = self + .methods + .iter() + .find(|(k, _)| (k.0 == *array_type) && (k.1 == dtype)); if let Some((_, v)) = val { *v } else { @@ -513,7 +522,6 @@ impl CompressionRegistry { } } - impl From for CompressionRegistry { fn from(value: BinaryCompressionType) -> Self { Self::new(Default::default(), value) @@ -583,11 +591,8 @@ pub struct MzMLWriterType< param_groups: Vec, } -impl< - W: Write, - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - > SpectrumWriter for MzMLWriterType +impl + SpectrumWriter for MzMLWriterType { fn write + 'static>(&mut self, spectrum: &S) -> io::Result { match self.write_spectrum(spectrum) { @@ -613,12 +618,12 @@ impl< } impl< - W: Write, - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - CF: FeatureLike + BuildArrayMap3DFrom, - DF: FeatureLike + KnownCharge + BuildArrayMap3DFrom, - > IonMobilityFrameWriter for MzMLWriterType + W: Write, + C: CentroidLike + BuildArrayMapFrom, + D: DeconvolutedCentroidLike + BuildArrayMapFrom, + CF: FeatureLike + BuildArrayMap3DFrom, + DF: FeatureLike + KnownCharge + BuildArrayMap3DFrom, +> IonMobilityFrameWriter for MzMLWriterType { fn write_frame + 'static>( &mut self, @@ -663,11 +668,8 @@ impl< } } -impl< - W: Write, - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - > MSDataFileMetadata for MzMLWriterType +impl + MSDataFileMetadata for MzMLWriterType { crate::impl_metadata_trait!(); @@ -1073,7 +1075,7 @@ where fn write_scan_settings_list(&mut self) -> WriterResult { if self.scan_settings.is_empty() { - return Ok(()) + return Ok(()); } let mut outer = bstart!("scanSettingsList"); let count = self.samples.len().to_string(); @@ -1094,7 +1096,8 @@ where for sf_ref in settings.source_file_refs.iter() { let sf_ref_tag = bstart!("sourceFileRef"); self.handle.write_event(Event::Start(sf_ref_tag.borrow()))?; - self.handle.write_event(Event::Text(BytesText::new(sf_ref)))?; + self.handle + .write_event(Event::Text(BytesText::new(sf_ref)))?; self.handle.write_event(Event::End(sf_ref_tag.to_end()))?; } self.handle.write_event(Event::End(inner.to_end()))?; @@ -1276,32 +1279,40 @@ where /// Get the compression method for the specified [`ArrayType`] and [`BinaryDataArrayType`], /// or the default compression method if a match is not found. - pub fn get_compression_method(&self, array_type: &ArrayType, dtype: BinaryDataArrayType) -> BinaryCompressionType { - self.data_array_compression.get_compression_method(array_type, dtype) + pub fn get_compression_method( + &self, + array_type: &ArrayType, + dtype: BinaryDataArrayType, + ) -> BinaryCompressionType { + self.data_array_compression + .get_compression_method(array_type, dtype) } /// Get the compression method for the provided [`DataArray`]. /// /// This is a helper method that calls [`Self::get_compression_method`] pub fn get_compression_method_for(&self, array: &DataArray) -> BinaryCompressionType { - self.data_array_compression.get_compression_method_for(array) + self.data_array_compression + .get_compression_method_for(array) } /// Set the compression method for the specified [`ArrayType`] and [`BinaryDataArrayType`]. /// /// Has no effect on the default compression method. pub fn set_compression_method( - &mut self, - array_type: ArrayType, - dtype: BinaryDataArrayType, - method: BinaryCompressionType, - ) { - self.data_array_compression.set_compression_method(array_type, dtype, method) + &mut self, + array_type: ArrayType, + dtype: BinaryDataArrayType, + method: BinaryCompressionType, + ) { + self.data_array_compression + .set_compression_method(array_type, dtype, method) } /// Specify the default compression method used pub fn set_default_compression_method(&mut self, method: BinaryCompressionType) { - self.data_array_compression.set_default_compression_method(method) + self.data_array_compression + .set_default_compression_method(method) } } @@ -1752,12 +1763,11 @@ where let encoded_len = encoded_array.len().to_string(); attrib!("encodedLength", encoded_len, outer); - if let Some(dp_id) = array.data_processing_reference() { - if let Some(dp_global) = self.run.default_data_processing_id.as_deref() { - if dp_id != dp_global { - attrib!("dataProcessingRef", dp_id, outer); - } - } + if let Some(dp_id) = array.data_processing_reference() + && let Some(dp_global) = self.run.default_data_processing_id.as_deref() + && dp_id != dp_global + { + attrib!("dataProcessingRef", dp_id, outer); } let array_len = array.data_len()?; if array_len != default_array_len { @@ -1793,7 +1803,8 @@ where } self.handle.write_param( - self.data_array_compression.get_compression_method_for(array) + self.data_array_compression + .get_compression_method_for(array) .clone() .as_param() .as_ref() @@ -2217,10 +2228,10 @@ where } impl< - W: io::Write, - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - > Drop for MzMLWriterType + W: io::Write, + C: CentroidLike + BuildArrayMapFrom, + D: DeconvolutedCentroidLike + BuildArrayMapFrom, +> Drop for MzMLWriterType { fn drop(&mut self) { MzMLWriterType::close(self).unwrap(); diff --git a/src/io/mzmlb/common.rs b/src/io/mzmlb/common.rs index da1f354..0abafa9 100644 --- a/src/io/mzmlb/common.rs +++ b/src/io/mzmlb/common.rs @@ -1,43 +1,33 @@ use hdf5; -use hdf5::types::{TypeDescriptor, IntSize, FloatSize}; +use hdf5::types::{FloatSize, IntSize, TypeDescriptor}; use crate::spectrum::BinaryDataArrayType; impl From<&TypeDescriptor> for BinaryDataArrayType { fn from(value: &TypeDescriptor) -> Self { match value { - TypeDescriptor::Integer(z) => { - match z { - IntSize::U1 => BinaryDataArrayType::Unknown, - IntSize::U2 => BinaryDataArrayType::Unknown, - IntSize::U4 => BinaryDataArrayType::Int32, - IntSize::U8 => BinaryDataArrayType::Int64, - } + TypeDescriptor::Integer(z) => match z { + IntSize::U1 => BinaryDataArrayType::Unknown, + IntSize::U2 => BinaryDataArrayType::Unknown, + IntSize::U4 => BinaryDataArrayType::Int32, + IntSize::U8 => BinaryDataArrayType::Int64, }, - TypeDescriptor::Unsigned(z) => { - match z { - IntSize::U1 => BinaryDataArrayType::Unknown, - IntSize::U2 => BinaryDataArrayType::Unknown, - IntSize::U4 => BinaryDataArrayType::Int32, - IntSize::U8 => BinaryDataArrayType::Int64, - } + TypeDescriptor::Unsigned(z) => match z { + IntSize::U1 => BinaryDataArrayType::Unknown, + IntSize::U2 => BinaryDataArrayType::Unknown, + IntSize::U4 => BinaryDataArrayType::Int32, + IntSize::U8 => BinaryDataArrayType::Int64, }, - TypeDescriptor::Float(z) => { - match z { - FloatSize::U4 => BinaryDataArrayType::Float32, - FloatSize::U8 => BinaryDataArrayType::Float64, - } + TypeDescriptor::Float(z) => match z { + FloatSize::U4 => BinaryDataArrayType::Float32, + FloatSize::U8 => BinaryDataArrayType::Float64, }, TypeDescriptor::Boolean => BinaryDataArrayType::Unknown, TypeDescriptor::Enum(_) => BinaryDataArrayType::Unknown, TypeDescriptor::Compound(_) => BinaryDataArrayType::Unknown, TypeDescriptor::FixedArray(_, _) => BinaryDataArrayType::Unknown, - TypeDescriptor::FixedAscii(_) => { - BinaryDataArrayType::ASCII - }, - TypeDescriptor::FixedUnicode(_) => { - BinaryDataArrayType::ASCII - }, + TypeDescriptor::FixedAscii(_) => BinaryDataArrayType::ASCII, + TypeDescriptor::FixedUnicode(_) => BinaryDataArrayType::ASCII, TypeDescriptor::VarLenArray(_) => todo!(), TypeDescriptor::VarLenAscii => BinaryDataArrayType::Unknown, TypeDescriptor::VarLenUnicode => BinaryDataArrayType::Unknown, @@ -45,7 +35,6 @@ impl From<&TypeDescriptor> for BinaryDataArrayType { } } - impl From<&BinaryDataArrayType> for TypeDescriptor { fn from(value: &BinaryDataArrayType) -> Self { match value { @@ -59,7 +48,6 @@ impl From<&BinaryDataArrayType> for TypeDescriptor { } } - impl From for BinaryDataArrayType { fn from(value: hdf5::Datatype) -> Self { match value.size() { @@ -85,4 +73,4 @@ impl From for BinaryDataArrayType { _ => Self::Unknown, } } -} \ No newline at end of file +} diff --git a/src/io/mzmlb/mod.rs b/src/io/mzmlb/mod.rs index 0d81350..39746fa 100644 --- a/src/io/mzmlb/mod.rs +++ b/src/io/mzmlb/mod.rs @@ -15,9 +15,9 @@ //! [`BuildArrayMapFrom`](crate::spectrum::bindata::BuildArrayMapFrom) traits //! for reading and writing conversion to [`BinaryArrayMap`](crate::spectrum::bindata::BinaryArrayMap). -mod reader; mod common; +mod reader; mod writer; -pub use reader::{MzMLbReader, MzMLbError, MzMLbReaderType, MzMLbSpectrumBuilder}; -pub use writer::{MzMLbWriterType, MzMLbWriterError, MzMLbWriterBuilder, MzMLbWriter}; \ No newline at end of file +pub use reader::{MzMLbError, MzMLbReader, MzMLbReaderType, MzMLbSpectrumBuilder}; +pub use writer::{MzMLbWriter, MzMLbWriterBuilder, MzMLbWriterError, MzMLbWriterType}; diff --git a/src/io/mzmlb/reader.rs b/src/io/mzmlb/reader.rs index 4193bb8..5a4c412 100644 --- a/src/io/mzmlb/reader.rs +++ b/src/io/mzmlb/reader.rs @@ -1,28 +1,28 @@ use std::borrow::Cow; use std::collections::HashMap; -use std::io::{self, prelude::*, SeekFrom}; +use std::io::{self, SeekFrom, prelude::*}; use std::path::Path; use std::{fs, mem}; #[cfg(feature = "filename")] use filename; use hdf5::types::{FixedAscii, FixedUnicode, VarLenAscii, VarLenUnicode}; -use hdf5::{self, filters, Dataset, Selection}; +use hdf5::{self, Dataset, Selection, filters}; use log::{debug, warn}; use ndarray::Ix1; use thiserror::Error; -use mzpeaks::{prelude::*, CentroidPeak, DeconvolutedPeak}; +use mzpeaks::{CentroidPeak, DeconvolutedPeak, prelude::*}; use crate::io::{ + Generic3DIonMobilityFrameSource, OffsetIndex, RandomAccessSpectrumIterator, + SpectrumAccessError, SpectrumSource, mzml::{ CVParamParse, EntryType, IncrementingIdMap, MzMLParserError, MzMLParserState, MzMLReaderType, MzMLSAX, MzMLSpectrumBuilder, ParserResult, SpectrumBuilding, }, traits::{ChromatogramSource, MZFileReader}, utils::DetailLevel, - Generic3DIonMobilityFrameSource, OffsetIndex, RandomAccessSpectrumIterator, - SpectrumAccessError, SpectrumSource, }; use crate::prelude::*; @@ -31,9 +31,9 @@ use crate::meta::{ }; use crate::params::{ControlledVocabulary, Param, ParamValue}; use crate::spectrum::bindata::{ - as_bytes, delta_decoding, linear_prediction_decoding, ArrayRetrievalError, - BinaryCompressionType, BinaryDataArrayType, BuildFromArrayMap, ByteArrayView, ByteArrayViewMut, - DataArray, + ArrayRetrievalError, BinaryCompressionType, BinaryDataArrayType, BuildFromArrayMap, + ByteArrayView, ByteArrayViewMut, DataArray, as_bytes, delta_decoding, + linear_prediction_decoding, }; #[cfg(feature = "numpress")] @@ -283,7 +283,7 @@ impl ExternalDataRegistry { data.compression.unsupported_msg(Some( format!("Not compatible with {:?}", data.dtype).as_str(), )), - )) + )); } } Err(ArrayRetrievalError::DecompressionError( @@ -326,7 +326,7 @@ impl ExternalDataRegistry { data.compression.unsupported_msg(Some( format!("Not compatible with {:?}", data.dtype).as_str(), )), - )) + )); } } Ok(()) @@ -348,7 +348,7 @@ impl ExternalDataRegistry { data.compression.unsupported_msg(Some( format!("Not compatible with {:?}", data.dtype).as_str(), )), - )) + )); } } Ok(()) @@ -1323,7 +1323,7 @@ impl { @@ -89,8 +95,7 @@ impl From for io::Error { } } -impl MSDataFileMetadata - for MzMLbWriterType +impl MSDataFileMetadata for MzMLbWriterType where C: BuildArrayMapFrom, D: BuildArrayMapFrom, @@ -181,7 +186,7 @@ impl BufferName { impl Display for BufferName { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let context = match self.context { + let context = match self.context { BufferContext::Spectrum => "spectrum", BufferContext::Chromatogram => "chromatogram", }; @@ -200,7 +205,12 @@ impl Display for BufferName { ArrayType::NonStandardDataArray { name } => Cow::Owned(name.replace(['/', ' '], "_")), ArrayType::BaselineArray => Cow::Borrowed("baseline"), ArrayType::ResolutionArray => Cow::Borrowed("resolution"), - _ => Cow::Owned(self.array_type.to_string().replace(['/', ' '], "_").to_lowercase()) + _ => Cow::Owned( + self.array_type + .to_string() + .replace(['/', ' '], "_") + .to_lowercase(), + ), }; let dtype = match self.dtype { BinaryDataArrayType::Unknown => "unknown", @@ -335,10 +345,7 @@ struct ByteWriter { } impl ByteWriter { - fn new( - dataset: hdf5::Dataset, - chunk_size: usize, - ) -> Self { + fn new(dataset: hdf5::Dataset, chunk_size: usize) -> Self { let offset = 0; let buffer = io::Cursor::new(Vec::with_capacity((chunk_size as f64 * 1.25) as usize)); Self { @@ -352,7 +359,7 @@ impl ByteWriter { fn write_to_dataset(&mut self) -> Result<(), hdf5::Error> { let size = self.buffer.position(); if size == 0 { - return Ok(()) + return Ok(()); } let start = self.offset; let chunk = &self.buffer.get_ref()[..size as usize]; @@ -367,8 +374,7 @@ impl ByteWriter { self.offset, self.buffer.position(), self.buffer.get_ref().capacity(), - (self.buffer.position() as f64 / self.buffer.get_ref().capacity() as f64) - * 100.0 + (self.buffer.position() as f64 / self.buffer.get_ref().capacity() as f64) * 100.0 ); } self.buffer.set_position(0); @@ -377,17 +383,16 @@ impl ByteWriter { fn resize_to_fit(&mut self) -> Result<(), hdf5::Error> { self.write_to_dataset()?; - self.dataset.resize((self.offset, )) + self.dataset.resize((self.offset,)) } } - impl io::Write for ByteWriter { fn write(&mut self, buf: &[u8]) -> io::Result { let z = self.buffer.write(buf)?; if self.buffer.position() > self.chunk_size as u64 { if let Err(e) = self.write_to_dataset() { - return Err(io::Error::new(io::ErrorKind::Other, e)) + return Err(io::Error::new(io::ErrorKind::Other, e)); }; } Ok(z) @@ -395,17 +400,15 @@ impl io::Write for ByteWriter { fn flush(&mut self) -> io::Result<()> { if let Err(e) = self.write_to_dataset() { - return Err(io::Error::new(io::ErrorKind::Other, e)) + return Err(io::Error::new(io::ErrorKind::Other, e)); }; Ok(()) } } - pub type WriterResult = Result<(), MzMLbWriterError>; -impl SpectrumWriter - for MzMLbWriterType +impl SpectrumWriter for MzMLbWriterType where C: BuildArrayMapFrom, D: BuildArrayMapFrom, @@ -432,10 +435,8 @@ where } #[derive(Debug)] -pub struct MzMLbWriterBuilder< - C: CentroidLike + 'static, - D: DeconvolutedCentroidLike + 'static, -> where +pub struct MzMLbWriterBuilder +where C: BuildArrayMapFrom, D: BuildArrayMapFrom, { @@ -446,7 +447,8 @@ pub struct MzMLbWriterBuilder< _d: PhantomData, } -impl Default for MzMLbWriterBuilder +impl Default + for MzMLbWriterBuilder where C: BuildArrayMapFrom, D: BuildArrayMapFrom, @@ -462,8 +464,7 @@ where } } -impl - MzMLbWriterBuilder +impl MzMLbWriterBuilder where C: BuildArrayMapFrom, D: BuildArrayMapFrom, @@ -514,10 +515,8 @@ where } #[derive(Debug)] -pub struct MzMLbWriterType< - C: CentroidLike + 'static, - D: DeconvolutedCentroidLike + 'static, -> where +pub struct MzMLbWriterType +where C: BuildArrayMapFrom, D: BuildArrayMapFrom, { @@ -528,8 +527,7 @@ pub struct MzMLbWriterType< filters: Vec, } -impl - MzMLbWriterType +impl MzMLbWriterType where C: BuildArrayMapFrom, D: BuildArrayMapFrom, @@ -538,19 +536,19 @@ where Self::new_with_chunk_size(path, DEFAULT_CHUNK_SIZE) } - pub fn new_with_chunk_size_and_filters>(path: &P, chunk_size: usize, filters: Vec) -> io::Result { + pub fn new_with_chunk_size_and_filters>( + path: &P, + chunk_size: usize, + filters: Vec, + ) -> io::Result { let mut handle = match hdf5::File::create(path) { Ok(handle) => handle, Err(e) => return Err(MzMLbWriterError::HDF5Error(e).into()), }; let buffer = match Self::make_mzml_buffer(&mut handle, chunk_size, &filters) { - Ok(buffer) => { - ByteWriter::new(buffer, chunk_size) - }, - Err(e) => { - return Err(e.into()) - }, + Ok(buffer) => ByteWriter::new(buffer, chunk_size), + Err(e) => return Err(e.into()), }; let mzml_writer: MzMLWriterType = @@ -635,9 +633,11 @@ where self.mzml_writer.write_param(&array.name.as_param_const())? } ArrayType::NonStandardDataArray { name } => { - let mut p = - self.get_ms_cv() - .param_val("MS:1000786", "non-standard data array", name.as_str()); + let mut p = self.get_ms_cv().param_val( + "MS:1000786", + "non-standard data array", + name.as_str(), + ); p = p.with_unit_t(&array.unit); self.mzml_writer.write_param(&p)?; } @@ -733,9 +733,12 @@ where let mut outer = bstart!("spectrum"); let summaries = self.mzml_writer.spectrum_has_summaries(spectrum); - let default_array_size = self.mzml_writer.start_spectrum(spectrum, &mut outer, &summaries)?; + let default_array_size = self + .mzml_writer + .start_spectrum(spectrum, &mut outer, &summaries)?; - self.mzml_writer.write_spectrum_descriptors(spectrum, &summaries)?; + self.mzml_writer + .write_spectrum_descriptors(spectrum, &summaries)?; self.mzml_writer .tic_collector @@ -843,7 +846,11 @@ where &mut self.mzml_writer.chromatogram_count } - fn make_mzml_buffer(handle: &mut hdf5::File, chunk_size: usize, filters: &[hdf5::filters::Filter]) -> Result { + fn make_mzml_buffer( + handle: &mut hdf5::File, + chunk_size: usize, + filters: &[hdf5::filters::Filter], + ) -> Result { let mzml_buffer = handle .new_dataset_builder() .chunk(chunk_size) @@ -865,11 +872,12 @@ where return Err(MzMLbWriterError::IOError(io::Error::new( io::ErrorKind::InvalidData, e, - ))) + ))); } }; - let version_attr = create_fixed_length_str_attribute(&mut mzml_buffer.dataset, "version", 10)?; + let version_attr = + create_fixed_length_str_attribute(&mut mzml_buffer.dataset, "version", 10)?; version_attr.write_scalar(&version_str)?; Ok(()) } @@ -977,10 +985,8 @@ where } } -impl< - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - > Drop for MzMLbWriterType +impl Drop + for MzMLbWriterType { fn drop(&mut self) { MzMLbWriterType::close(self).unwrap(); @@ -988,13 +994,16 @@ impl< } impl< - C: CentroidLike + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildArrayMapFrom, - CF: FeatureLike + BuildArrayMap3DFrom, - DF: FeatureLike + KnownCharge + BuildArrayMap3DFrom, - > IonMobilityFrameWriter for MzMLbWriterType + C: CentroidLike + BuildArrayMapFrom, + D: DeconvolutedCentroidLike + BuildArrayMapFrom, + CF: FeatureLike + BuildArrayMap3DFrom, + DF: FeatureLike + KnownCharge + BuildArrayMap3DFrom, +> IonMobilityFrameWriter for MzMLbWriterType { - fn write_frame + 'static>(&mut self, frame: &S) -> io::Result { + fn write_frame + 'static>( + &mut self, + frame: &S, + ) -> io::Result { let state = frame.description().clone().into(); let peak_data = match frame.features() { crate::spectrum::frame::RefFeatureDataLevel::Missing => BinaryArrayMap::default(), @@ -1006,7 +1015,10 @@ impl< self.write_owned(spectrum) } - fn write_frame_owned + 'static>(&mut self, frame: S) -> io::Result { + fn write_frame_owned + 'static>( + &mut self, + frame: S, + ) -> io::Result { let (features, state) = frame.into_features_and_parts(); let peak_data = match features { crate::spectrum::frame::FeatureDataLevel::Missing => BinaryArrayMap::default(), diff --git a/src/io/offset_index.rs b/src/io/offset_index.rs index 1227741..7c75476 100644 --- a/src/io/offset_index.rs +++ b/src/io/offset_index.rs @@ -1,9 +1,8 @@ #[allow(unused)] use std::io::prelude::*; -use indexmap::map::{Iter, Keys}; use indexmap::IndexMap; - +use indexmap::map::{Iter, Keys}; /** An ordered mapping from entity ID to byte offset into the source diff --git a/src/io/proxi.rs b/src/io/proxi.rs index e7c3690..5d0ea0f 100644 --- a/src/io/proxi.rs +++ b/src/io/proxi.rs @@ -6,12 +6,12 @@ use std::{ }; use num_traits::AsPrimitive; -use serde::{de::SeqAccess, Deserialize, Deserializer, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, de::SeqAccess}; use crate::{ curie, io::usi::USI, - params::{ControlledVocabulary, Param, ParamCow, Value, CURIE}, + params::{CURIE, ControlledVocabulary, Param, ParamCow, Value}, prelude::*, spectrum::{ ArrayType, BinaryArrayMap, BinaryDataArrayType, DataArray, IsolationWindowState, @@ -62,11 +62,21 @@ impl PROXIBackend { /// The PROXI server base url which needs concatenating of the USI at the end fn proxi_url(&self, usi: &str) -> String { match self { - Self::PeptideAtlas => format!("http://www.peptideatlas.org/api/proxi/v0.1/spectra?resultType=full&usi={usi}") , - Self::MassIVE => format!("http://massive.ucsd.edu/ProteoSAFe/proxi/v0.1/spectra?resultType=full&usi={usi}"), - Self::Pride => format!("https://www.ebi.ac.uk/pride/proxi/archive/v0.1/spectra?resultType=full&usi={usi}"), - Self::Jpost => format!("https://repository.jpostdb.org/proxi/spectra?resultType=full&usi={usi}"), - Self::ProteomeXchange => format!("https://proteomecentral.proteomexchange.org/api/proxi/v0.1/spectra?resultType=full&usi={usi}"), + Self::PeptideAtlas => format!( + "http://www.peptideatlas.org/api/proxi/v0.1/spectra?resultType=full&usi={usi}" + ), + Self::MassIVE => format!( + "http://massive.ucsd.edu/ProteoSAFe/proxi/v0.1/spectra?resultType=full&usi={usi}" + ), + Self::Pride => format!( + "https://www.ebi.ac.uk/pride/proxi/archive/v0.1/spectra?resultType=full&usi={usi}" + ), + Self::Jpost => { + format!("https://repository.jpostdb.org/proxi/spectra?resultType=full&usi={usi}") + } + Self::ProteomeXchange => format!( + "https://proteomecentral.proteomexchange.org/api/proxi/v0.1/spectra?resultType=full&usi={usi}" + ), Self::Custom(url) => url.replace("{USI}", usi), } } @@ -238,9 +248,7 @@ fn transform_response( title, kind, }), - Err(err) => { - Err(PROXIError::IO(backend, err)) - }, + Err(err) => Err(PROXIError::IO(backend, err)), } } @@ -1059,9 +1067,9 @@ impl From<&PROXISpectrum> for SpectrumDescription { } impl< - C: CentroidLike + BuildFromArrayMap + BuildArrayMapFrom, - D: DeconvolutedCentroidLike + BuildFromArrayMap + BuildArrayMapFrom, - > From for MultiLayerSpectrum + C: CentroidLike + BuildFromArrayMap + BuildArrayMapFrom, + D: DeconvolutedCentroidLike + BuildFromArrayMap + BuildArrayMapFrom, +> From for MultiLayerSpectrum { fn from(value: PROXISpectrum) -> Self { let descr: SpectrumDescription = (&value).into(); @@ -1307,7 +1315,8 @@ mod test { "mzspec:PXD000561:Adult_Frontalcortex_bRP_Elite_85_f09:scan:17555:VLHPLEGAVVIIFK/2", "mzspec:MSV000078547:120228_nbut_3610_it_it_take2:scan:389", "mzspec:PXD043489:20201103_F1_UM5_Peng0013_SA_139H2_InS_Elastase.raw:scan:11809:VSLFPPSSEQLTSNASVV/2", - "mzspec:PXD004939:Rice_phos_ABA_3h_20per_F1_R2:scan:2648:DAEKS[UNIMOD:21]PIN[UNIMOD:7]GR/2"] { + "mzspec:PXD004939:Rice_phos_ABA_3h_20per_F1_R2:scan:2648:DAEKS[UNIMOD:21]PIN[UNIMOD:7]GR/2", + ] { println!("Trying: {usi}"); let usi: USI = usi.parse().unwrap(); let (_, response) = usi.download_spectrum_blocking(None, None).unwrap(); @@ -1317,9 +1326,9 @@ mod test { #[test] fn test_proxi_parse() { - let spec: PROXISpectrum = serde_json::from_reader( - std::fs::File::open("test/data/proxi_test.json").unwrap() - ).unwrap(); + let spec: PROXISpectrum = + serde_json::from_reader(std::fs::File::open("test/data/proxi_test.json").unwrap()) + .unwrap(); assert!(!spec.mzs.is_empty()); assert!(!spec.attributes.is_empty()); } @@ -1336,7 +1345,8 @@ mod test_async { "mzspec:PXD000561:Adult_Frontalcortex_bRP_Elite_85_f09:scan:17555:VLHPLEGAVVIIFK/2", "mzspec:MSV000078547:120228_nbut_3610_it_it_take2:scan:389", "mzspec:PXD043489:20201103_F1_UM5_Peng0013_SA_139H2_InS_Elastase.raw:scan:11809:VSLFPPSSEQLTSNASVV/2", - "mzspec:PXD004939:Rice_phos_ABA_3h_20per_F1_R2:scan:2648:DAEKS[UNIMOD:21]PIN[UNIMOD:7]GR/2"] { + "mzspec:PXD004939:Rice_phos_ABA_3h_20per_F1_R2:scan:2648:DAEKS[UNIMOD:21]PIN[UNIMOD:7]GR/2", + ] { println!("Trying: {usi}"); let usi: USI = usi.parse().unwrap(); let (_, response) = usi.download_spectrum_async(None, None).await.unwrap(); diff --git a/src/io/shorthand.rs b/src/io/shorthand.rs index 542a83d..edf37ae 100644 --- a/src/io/shorthand.rs +++ b/src/io/shorthand.rs @@ -1,20 +1,30 @@ -use std::{io, marker::PhantomData, path::{Path, PathBuf}}; +use std::{ + io, + marker::PhantomData, + path::{Path, PathBuf}, +}; #[allow(unused)] -use mzpeaks::{feature::{ChargedFeature, Feature}, IonMobility, Mass, MZ}; +use mzpeaks::{ + IonMobility, MZ, Mass, + feature::{ChargedFeature, Feature}, +}; #[allow(unused)] -use crate::{prelude::*, spectrum::{CentroidPeakAdapting, DeconvolutedPeakAdapting}}; +use crate::{ + prelude::*, + spectrum::{CentroidPeakAdapting, DeconvolutedPeakAdapting}, +}; #[allow(unused)] use super::{Sink, Source, SpectrumSource, infer_format::MZReaderType}; -#[doc(hidden)] -#[cfg(feature = "mgf")] -pub use super::mgf::{MGFReaderType, MGFWriterType}; #[doc(hidden)] #[cfg(not(feature = "mgf"))] pub use super::infer_format::MZReaderType as MGFReaderType; +#[doc(hidden)] +#[cfg(feature = "mgf")] +pub use super::mgf::{MGFReaderType, MGFWriterType}; #[doc(hidden)] #[cfg(not(feature = "mgf"))] @@ -57,13 +67,13 @@ use super::tdf::TDFSpectrumReaderType as _TDFSpectrumReaderType; #[doc(hidden)] #[cfg(feature = "bruker_tdf")] -pub type TDFSpectrumReaderType = _TDFSpectrumReaderType, ChargedFeature, C, D>; +pub type TDFSpectrumReaderType = + _TDFSpectrumReaderType, ChargedFeature, C, D>; #[doc(hidden)] #[cfg(not(feature = "bruker_tdf"))] pub type TDFSpectrumReaderType = MZReaderType; - pub const fn mzml_support() -> bool { #[cfg(feature = "mzml")] return true; @@ -71,7 +81,6 @@ pub const fn mzml_support() -> bool { return false; } - pub const fn mgf_support() -> bool { #[cfg(feature = "mgf")] return true; @@ -79,7 +88,6 @@ pub const fn mgf_support() -> bool { return false; } - pub const fn mzmlb_support() -> bool { #[cfg(feature = "mzmlb")] return true; @@ -87,7 +95,6 @@ pub const fn mzmlb_support() -> bool { return false; } - pub const fn thermo_support() -> bool { #[cfg(feature = "thermo")] return true; @@ -95,7 +102,6 @@ pub const fn thermo_support() -> bool { return false; } - pub const fn bruker_tdf_support() -> bool { #[cfg(feature = "bruker_tdf")] return true; @@ -105,7 +111,13 @@ pub const fn bruker_tdf_support() -> bool { #[doc(hidden)] #[allow(unused)] -pub fn mgf_new(handle: R) -> MGFReaderType { +pub fn mgf_new< + R: io::Read + io::Seek, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> MGFReaderType { #[cfg(feature = "mgf")] return MGFReaderType::new(handle); #[cfg(not(feature = "mgf"))] @@ -114,7 +126,13 @@ pub fn mgf_new(handle: R) -> MGFReaderType { +pub fn mgf_new_indexed< + R: io::Read + io::Seek, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> MGFReaderType { #[cfg(not(feature = "mgf"))] panic!("MGF reading is not enabled"); #[cfg(feature = "mgf")] @@ -123,7 +141,13 @@ pub fn mgf_new_indexed(handle: R) -> MzMLReaderType { +pub fn mzml_new< + R: io::Read + io::Seek, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> MzMLReaderType { #[cfg(feature = "mzml")] return MzMLReaderType::new(handle); #[cfg(not(feature = "mzml"))] @@ -132,7 +156,13 @@ pub fn mzml_new(handle: R) -> MzMLReaderType { +pub fn mzml_new_indexed< + R: io::Read + io::Seek, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> MzMLReaderType { #[cfg(feature = "mzml")] return MzMLReaderType::new_indexed(handle); #[cfg(not(feature = "mzml"))] @@ -141,7 +171,13 @@ pub fn mzml_new_indexed, C: CentroidPeakAdapting + BuildFromArrayMap, D: DeconvolutedPeakAdapting + BuildFromArrayMap>(handle: R) -> io::Result> { +pub fn thermo_new< + R: Into, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> io::Result> { #[cfg(feature = "thermo")] return ThermoRawReaderType::new(handle); #[cfg(not(feature = "thermo"))] @@ -150,7 +186,13 @@ pub fn thermo_new, C: CentroidPeakAdapting + BuildFromArrayMap, #[doc(hidden)] #[allow(unused)] -pub fn mzmlb_new, C: CentroidPeakAdapting + BuildFromArrayMap, D: DeconvolutedPeakAdapting + BuildFromArrayMap>(handle: R) -> io::Result> { +pub fn mzmlb_new< + R: AsRef, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> io::Result> { #[cfg(feature = "mzmlb")] return MzMLbReaderType::new(&handle); #[cfg(not(feature = "mzmlb"))] @@ -159,23 +201,34 @@ pub fn mzmlb_new, C: CentroidPeakAdapting + BuildFromArrayMap, D: #[doc(hidden)] #[allow(unused)] -pub fn bruker_tdf_new, C: CentroidPeakAdapting + BuildFromArrayMap, D: DeconvolutedPeakAdapting + BuildFromArrayMap>(handle: R) -> io::Result> { +pub fn bruker_tdf_new< + R: AsRef, + C: CentroidPeakAdapting + BuildFromArrayMap, + D: DeconvolutedPeakAdapting + BuildFromArrayMap, +>( + handle: R, +) -> io::Result> { #[cfg(feature = "bruker_tdf")] - return TDFSpectrumReaderType::new(handle).map_err(|e| io::Error::new( io::ErrorKind::Other, e)); + return TDFSpectrumReaderType::new(handle).map_err(|e| io::Error::new(io::ErrorKind::Other, e)); #[cfg(not(feature = "bruker_tdf"))] panic!("Bruker TDF file reading not enabled") } #[doc(hidden)] -pub struct DummyWriter(PhantomData<(W, C, D)>); - +pub struct DummyWriter( + PhantomData<(W, C, D)>, +); -impl MSDataFileMetadata for DummyWriter { +impl MSDataFileMetadata + for DummyWriter +{ fn data_processings(&self) -> &Vec { panic!("stub"); } - fn instrument_configurations(&self) -> &std::collections::HashMap { + fn instrument_configurations( + &self, + ) -> &std::collections::HashMap { panic!("stub"); } @@ -195,7 +248,9 @@ impl MSDataFileMetadata panic!("stub"); } - fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap { + fn instrument_configurations_mut( + &mut self, + ) -> &mut std::collections::HashMap { panic!("stub"); } @@ -218,7 +273,9 @@ impl DummyWriter SpectrumWriter for DummyWriter { +impl SpectrumWriter + for DummyWriter +{ #[allow(unused)] fn write + 'static>(&mut self, spectrum: &S) -> io::Result { Err(io::Error::new(io::ErrorKind::Unsupported, "Dummy Writer")) @@ -236,12 +293,16 @@ impl SpectrumWriter(PhantomData<(C, D)>); -impl MSDataFileMetadata for DummyWriter2 { +impl MSDataFileMetadata + for DummyWriter2 +{ fn data_processings(&self) -> &Vec { todo!() } - fn instrument_configurations(&self) -> &std::collections::HashMap { + fn instrument_configurations( + &self, + ) -> &std::collections::HashMap { todo!() } @@ -261,7 +322,9 @@ impl MSDataFileMetadata fo todo!() } - fn instrument_configurations_mut(&mut self) -> &mut std::collections::HashMap { + fn instrument_configurations_mut( + &mut self, + ) -> &mut std::collections::HashMap { todo!() } @@ -285,7 +348,9 @@ impl DummyWriter2 { } } -impl SpectrumWriter for DummyWriter2 { +impl SpectrumWriter + for DummyWriter2 +{ #[allow(unused)] fn write + 'static>(&mut self, spectrum: &S) -> io::Result { Err(io::Error::new(io::ErrorKind::Unsupported, "Dummy Writer")) diff --git a/src/io/tdf/arrays.rs b/src/io/tdf/arrays.rs index 8854cd6..6391648 100644 --- a/src/io/tdf/arrays.rs +++ b/src/io/tdf/arrays.rs @@ -3,16 +3,16 @@ use std::{ ops::{Range, RangeBounds}, }; -use mzpeaks::{feature::Feature, IonMobility, MZPeakSetType, MZ}; -use timsrust::{converters::ConvertableDomain, Metadata}; +use mzpeaks::{IonMobility, MZ, MZPeakSetType, feature::Feature}; +use timsrust::{Metadata, converters::ConvertableDomain}; use crate::{ mzpeaks::{CentroidPeak, PeakSet}, params::Unit, prelude::*, spectrum::{ - bindata::{ArrayRetrievalError, BinaryArrayMap3D}, ArrayType, BinaryArrayMap, BinaryDataArrayType, DataArray, + bindata::{ArrayRetrievalError, BinaryArrayMap3D}, }, }; diff --git a/src/io/tdf/constants.rs b/src/io/tdf/constants.rs index f00c6da..9938c43 100644 --- a/src/io/tdf/constants.rs +++ b/src/io/tdf/constants.rs @@ -93,7 +93,6 @@ impl From for InstrumentSource { } } - #[allow(clippy::upper_case_acronyms)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum MsMsType { diff --git a/src/io/tdf/mod.rs b/src/io/tdf/mod.rs index 44c8d3d..5a036ca 100644 --- a/src/io/tdf/mod.rs +++ b/src/io/tdf/mod.rs @@ -5,10 +5,12 @@ //! //! Depends upon the [`timsrust`] library, a cross-platform, pure Rust implementation of the Bruker-specifc //! file reading behaviors and [`rusqlite`] for reading the SQLite3 .tdf files. -mod constants; mod arrays; -mod sql; +mod constants; mod reader; +mod sql; -pub use reader::{TDFFrameReader, TDFFrameReaderType, TDFSpectrumReader, TDFSpectrumReaderType, is_tdf}; -pub use sql::{ChromatographyData, SQLTrace}; \ No newline at end of file +pub use reader::{ + TDFFrameReader, TDFFrameReaderType, TDFSpectrumReader, TDFSpectrumReaderType, is_tdf, +}; +pub use sql::{ChromatographyData, SQLTrace}; diff --git a/src/io/tdf/reader.rs b/src/io/tdf/reader.rs index 2e7e4ec..576e566 100644 --- a/src/io/tdf/reader.rs +++ b/src/io/tdf/reader.rs @@ -9,7 +9,7 @@ use chrono::DateTime; use crate::io::checksum_file; use crate::{ - curie, + Param, curie, io::{DetailLevel, IntoIonMobilityFrameSource, IonMobilityFrameAccessError, OffsetIndex}, meta::{ Component, ComponentType, DataProcessing, DetectorTypeTerm, @@ -19,27 +19,26 @@ use crate::{ SourceFile, }, mzpeaks::{ + CentroidPeak, DeconvolutedPeak, IonMobility, MZ, Mass, feature::{ChargedFeature, Feature}, - CentroidPeak, DeconvolutedPeak, IonMobility, Mass, MZ, }, params::{ControlledVocabulary, Unit, Value}, prelude::*, spectrum::{ - bindata::{ArrayRetrievalError, BinaryArrayMap3D}, Activation, ArrayType, BinaryArrayMap, BinaryDataArrayType, Chromatogram, ChromatogramDescription, ChromatogramType, DataArray, IonMobilityFrameDescription, IsolationWindow, IsolationWindowState, MultiLayerIonMobilityFrame, MultiLayerSpectrum, Precursor, ScanCombination, ScanEvent, ScanWindow, SelectedIon, SignalContinuity, + bindata::{ArrayRetrievalError, BinaryArrayMap3D}, }, - Param, }; use identity_hash::BuildIdentityHasher; use rusqlite::Error; use timsrust::{ + Metadata, TimsRustError, converters::ConvertableDomain, readers::{FrameReader, FrameReaderError, MetadataReader}, - Metadata, TimsRustError, }; pub use super::arrays::FrameToArraysMapper; @@ -1014,11 +1013,11 @@ pub struct TDFSpectrumReaderType< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike + From, - > IntoIonMobilityFrameSource for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike + From, +> IntoIonMobilityFrameSource for TDFSpectrumReaderType { type IonMobilityFrameSource< CF: FeatureLike, @@ -1055,11 +1054,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike, - > RandomAccessSpectrumIterator> + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike, +> RandomAccessSpectrumIterator> for TDFSpectrumReaderType { fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { @@ -1085,11 +1084,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike, - > SpectrumSource for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike, +> SpectrumSource for TDFSpectrumReaderType { fn reset(&mut self) { self.frame_reader.reset(); @@ -1143,11 +1142,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike, - > Iterator for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike, +> Iterator for TDFSpectrumReaderType { type Item = MultiLayerSpectrum; @@ -1173,30 +1172,30 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike, - > FusedIterator for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike, +> FusedIterator for TDFSpectrumReaderType { } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - > MSDataFileMetadata for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike, + DP: DeconvolutedCentroidLike, +> MSDataFileMetadata for TDFSpectrumReaderType { crate::delegate_impl_metadata_trait!(frame_reader); } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - > ChromatogramSource for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike, + DP: DeconvolutedCentroidLike, +> ChromatogramSource for TDFSpectrumReaderType { fn get_chromatogram_by_id(&mut self, id: &str) -> Option { self.frame_reader.get_chromatogram_by_id(id) @@ -1208,11 +1207,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - > TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike, + DP: DeconvolutedCentroidLike, +> TDFSpectrumReaderType { pub fn new>(path: P) -> Result { Self::new_with_peak_merging_tolerance(path, PEAK_MERGE_TOLERANCE, false) @@ -1270,7 +1269,10 @@ impl< pub fn consolidate_peaks( &self, spectrum: &mut MultiLayerSpectrum, - ) -> Result<(), ArrayRetrievalError> where CP: From { + ) -> Result<(), ArrayRetrievalError> + where + CP: From, + { if let Some(arrays) = spectrum.arrays.as_ref() { let arrays = BinaryArrayMap3D::stack(arrays)?; spectrum.peaks = Some(consolidate_peaks( @@ -1540,11 +1542,11 @@ fn frame_to_description( } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - CP: CentroidLike + From, - DP: DeconvolutedCentroidLike, - > MZFileReader> for TDFSpectrumReaderType + C: FeatureLike, + D: FeatureLike + KnownCharge, + CP: CentroidLike + From, + DP: DeconvolutedCentroidLike, +> MZFileReader> for TDFSpectrumReaderType { fn construct_index_from_stream(&mut self) -> u64 { self.frame_reader.entry_index.len() as u64 diff --git a/src/io/thermo/async_reader.rs b/src/io/thermo/async_reader.rs index 35006d5..6d50ea2 100644 --- a/src/io/thermo/async_reader.rs +++ b/src/io/thermo/async_reader.rs @@ -8,8 +8,8 @@ use tokio; use super::ThermoRawReaderType as SyncThermoRawReaderType; use crate::{ io::{ - traits::{AsyncMZFileReader, AsyncRandomAccessSpectrumIterator, SpectrumStream}, DetailLevel, + traits::{AsyncMZFileReader, AsyncRandomAccessSpectrumIterator, SpectrumStream}, }, prelude::*, spectrum::MultiLayerSpectrum, @@ -23,8 +23,10 @@ pub struct ThermoRawReaderType< } #[cfg(feature = "async")] -impl + Send + 'static, D: DeconvolutedCentroidLike + Send + 'static> - AsyncMZFileReader> for ThermoRawReaderType +impl< + C: CentroidLike + From + Send + 'static, + D: DeconvolutedCentroidLike + Send + 'static, +> AsyncMZFileReader> for ThermoRawReaderType { async fn construct_index_from_stream(&mut self) -> u64 { self.len() as u64 @@ -50,14 +52,16 @@ impl + Send + 'static, D: DeconvolutedCentr } } -impl + Send, D: DeconvolutedCentroidLike + Send> MSDataFileMetadata - for ThermoRawReaderType +impl + Send, D: DeconvolutedCentroidLike + Send> + MSDataFileMetadata for ThermoRawReaderType { crate::delegate_impl_metadata_trait!(expr, this => { this.inner.as_ref().unwrap() }, &mut => { this.inner.as_mut().unwrap() }); } -impl + Send + 'static, D: DeconvolutedCentroidLike + Send + 'static> - AsyncSpectrumSource> for ThermoRawReaderType +impl< + C: CentroidLike + From + Send + 'static, + D: DeconvolutedCentroidLike + Send + 'static, +> AsyncSpectrumSource> for ThermoRawReaderType { fn reset(&mut self) -> impl std::future::Future { self.inner.as_mut().unwrap().reset(); @@ -103,8 +107,10 @@ impl + Send + 'static, D: DeconvolutedCentr } } -impl + Send + 'static, D: DeconvolutedCentroidLike + Send + 'static> - ThermoRawReaderType +impl< + C: CentroidLike + From + Send + 'static, + D: DeconvolutedCentroidLike + Send + 'static, +> ThermoRawReaderType { /// Create a new [`ThermoRawReaderType`] from a path. /// This may trigger an expensive I/O operation to checksum the file @@ -148,13 +154,15 @@ impl + Send + 'static, D: DeconvolutedCentr self.inner.as_mut().unwrap().set_centroiding(value) } - /// Get whether or not to load extended spectrum signal information for the spectrum. /// /// The loaded data isn't incorporated into a peak list, instead access them under /// the binary data arrays. pub fn get_load_extended_spectrum_data(&self) -> bool { - self.inner.as_ref().unwrap().get_load_extended_spectrum_data() + self.inner + .as_ref() + .unwrap() + .get_load_extended_spectrum_data() } /// Set whether or not to load extended spectrum signal information for the spectrum. @@ -162,10 +170,12 @@ impl + Send + 'static, D: DeconvolutedCentr /// The loaded data isn't incorporated into a peak list, instead access them under /// the binary data arrays. pub fn set_load_extended_spectrum_data(&mut self, load_extended_spectrum_data: bool) { - self.inner.as_mut().unwrap().set_load_extended_spectrum_data(load_extended_spectrum_data) + self.inner + .as_mut() + .unwrap() + .set_load_extended_spectrum_data(load_extended_spectrum_data) } - pub fn get_index(&self) -> &crate::io::OffsetIndex { self.inner.as_ref().unwrap().get_index() } @@ -233,10 +243,9 @@ impl + Send + 'static, D: DeconvolutedCentr pub type ThermoRawReader = ThermoRawReaderType; impl< - C: CentroidLike + From + Send + Sync + 'static, - D: DeconvolutedCentroidLike + Send + Sync + 'static, - > AsyncRandomAccessSpectrumIterator> - for ThermoRawReaderType + C: CentroidLike + From + Send + Sync + 'static, + D: DeconvolutedCentroidLike + Send + Sync + 'static, +> AsyncRandomAccessSpectrumIterator> for ThermoRawReaderType { async fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { let mut inner = self.inner.take().unwrap(); diff --git a/src/io/thermo/instruments.rs b/src/io/thermo/instruments.rs index f30b9a2..e79c0a7 100644 --- a/src/io/thermo/instruments.rs +++ b/src/io/thermo/instruments.rs @@ -2,9 +2,12 @@ //! Thank you ProteoWizard for building all of these look up tables. use std::fmt::Display; -use crate::meta::{Component, ComponentType, DetectorTypeTerm, InstrumentConfiguration, IonizationTypeTerm, MassAnalyzerTerm}; +use crate::meta::{ + Component, ComponentType, DetectorTypeTerm, InstrumentConfiguration, IonizationTypeTerm, + MassAnalyzerTerm, +}; use crate::params::ParamDescribed; -use crate::{params::ControlledVocabulary, Param}; +use crate::{Param, params::ControlledVocabulary}; macro_rules! param { ($name:expr, $acc:expr) => { @@ -193,7 +196,9 @@ impl InstrumentModelType { InstrumentModelType::Orbitrap_Exploris_120 => param!("Orbitrap Exploris 120", 1003095), InstrumentModelType::Orbitrap_Exploris_240 => param!("Orbitrap Exploris 240", 1003094), InstrumentModelType::Orbitrap_Exploris_480 => param!("Orbitrap Exploris 480", 1003028), - InstrumentModelType::Orbitrap_Exploris_GC_240 => param!("Orbitrap Exploris GC 240", 1003423), + InstrumentModelType::Orbitrap_Exploris_GC_240 => { + param!("Orbitrap Exploris GC 240", 1003423) + } InstrumentModelType::Orbitrap_Fusion => param!("Orbitrap Fusion", 1002416), InstrumentModelType::Orbitrap_Fusion_ETD => param!("Orbitrap Fusion ETD", 1002417), InstrumentModelType::Orbitrap_Fusion_Lumos => param!("Orbitrap Fusion Lumos", 1002732), @@ -616,9 +621,13 @@ static INSTRUMENT_MODEL_TYPE_MATCH: [(&str, InstrumentModelType, MatchType); 90] pub fn parse_instrument_model(instrument_model: &str) -> InstrumentModelType { let model_type = instrument_model.to_uppercase(); let model_type_no_spaces = model_type.replace(" ", ""); - log::debug!("Parsing instrument model: '{}' -> '{}' (no spaces: '{}')", - instrument_model, model_type, model_type_no_spaces); - + log::debug!( + "Parsing instrument model: '{}' -> '{}' (no spaces: '{}')", + instrument_model, + model_type, + model_type_no_spaces + ); + for (key, model_enum, match_type) in INSTRUMENT_MODEL_TYPE_MATCH.iter() { let hit = match match_type { MatchType::Exact => **key == model_type, @@ -628,16 +637,23 @@ pub fn parse_instrument_model(instrument_model: &str) -> InstrumentModelType { MatchType::ExactNoSpaces => **key == model_type_no_spaces, }; if hit { - log::debug!("Matched instrument model '{}' with pattern '{}' ({:?}) -> {:?}", - instrument_model, key, match_type, model_enum); + log::debug!( + "Matched instrument model '{}' with pattern '{}' ({:?}) -> {:?}", + instrument_model, + key, + match_type, + model_enum + ); return *model_enum; } } - log::warn!("Failed to infer instrument model from name string '{}' - will use Unknown", instrument_model); + log::warn!( + "Failed to infer instrument model from name string '{}' - will use Unknown", + instrument_model + ); InstrumentModelType::Unknown } - pub fn instrument_model_to_mass_analyzers(model: InstrumentModelType) -> Vec { match model { InstrumentModelType::Exactive @@ -961,13 +977,15 @@ pub fn instrument_model_to_ion_sources(model: InstrumentModelType) -> Vec { - vec![IonizationTypeTerm::ElectronIonization, IonizationTypeTerm::ChemicalIonization] + vec![ + IonizationTypeTerm::ElectronIonization, + IonizationTypeTerm::ChemicalIonization, + ] } _ => Vec::default(), } } - macro_rules! comp { ($config:ident, $comptype:expr, $term:expr) => { $config.new_component($comptype).add_param($term.into()) @@ -986,7 +1004,7 @@ macro_rules! analyzer { }; ($config:ident radial) => { analyzer!($config, MassAnalyzerTerm::RadialEjectionLinearIonTrap) - } + }; } macro_rules! detector { @@ -998,63 +1016,97 @@ macro_rules! detector { }; ($config:ident electron) => { detector!($config, DetectorTypeTerm::ElectronMultiplier) - } + }; } - -pub fn create_instrument_configurations(model: InstrumentModelType, source: Component) -> Vec { +pub fn create_instrument_configurations( + model: InstrumentModelType, + source: Component, +) -> Vec { let mut configs = Vec::new(); match model { - InstrumentModelType::Q_Exactive | - InstrumentModelType::Q_Exactive_Plus | - InstrumentModelType::Q_Exactive_HF | - InstrumentModelType::Q_Exactive_HF_X | - InstrumentModelType::Q_Exactive_UHMR | - InstrumentModelType::Orbitrap_Exploris_120 | - InstrumentModelType::Orbitrap_Exploris_240 | - InstrumentModelType::Orbitrap_Exploris_480 | - InstrumentModelType::Orbitrap_Exploris_GC_240| - InstrumentModelType::Orbitrap_GC => { + InstrumentModelType::Q_Exactive + | InstrumentModelType::Q_Exactive_Plus + | InstrumentModelType::Q_Exactive_HF + | InstrumentModelType::Q_Exactive_HF_X + | InstrumentModelType::Q_Exactive_UHMR + | InstrumentModelType::Orbitrap_Exploris_120 + | InstrumentModelType::Orbitrap_Exploris_240 + | InstrumentModelType::Orbitrap_Exploris_480 + | InstrumentModelType::Orbitrap_Exploris_GC_240 + | InstrumentModelType::Orbitrap_GC => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); - comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Quadrupole); + comp!( + config, + ComponentType::Analyzer, + MassAnalyzerTerm::Quadrupole + ); comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Orbitrap); - comp!(config, ComponentType::Detector, DetectorTypeTerm::InductiveDetector); - }, + comp!( + config, + ComponentType::Detector, + DetectorTypeTerm::InductiveDetector + ); + } - InstrumentModelType::Exactive | - InstrumentModelType::Exactive_Plus => { + InstrumentModelType::Exactive | InstrumentModelType::Exactive_Plus => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Orbitrap); - comp!(config, ComponentType::Detector, DetectorTypeTerm::InductiveDetector); - + comp!( + config, + ComponentType::Detector, + DetectorTypeTerm::InductiveDetector + ); } InstrumentModelType::Orbitrap_Astral => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); - comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Quadrupole); + comp!( + config, + ComponentType::Analyzer, + MassAnalyzerTerm::Quadrupole + ); comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Orbitrap); - comp!(config, ComponentType::Detector, DetectorTypeTerm::InductiveDetector); + comp!( + config, + ComponentType::Detector, + DetectorTypeTerm::InductiveDetector + ); configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); - comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::Quadrupole); - comp!(config, ComponentType::Analyzer, MassAnalyzerTerm::AsymmetricTrackLosslessTimeOfFlightAnalyzer); - comp!(config, ComponentType::Detector, DetectorTypeTerm::InductiveDetector); + comp!( + config, + ComponentType::Analyzer, + MassAnalyzerTerm::Quadrupole + ); + comp!( + config, + ComponentType::Analyzer, + MassAnalyzerTerm::AsymmetricTrackLosslessTimeOfFlightAnalyzer + ); + comp!( + config, + ComponentType::Detector, + DetectorTypeTerm::InductiveDetector + ); } - InstrumentModelType::LTQ_FT | - InstrumentModelType::LTQ_FT_Ultra => { + InstrumentModelType::LTQ_FT | InstrumentModelType::LTQ_FT_Ultra => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); - analyzer!(config, MassAnalyzerTerm::FourierTransformIonCyclotronResonanceMassSpectrometer); + analyzer!( + config, + MassAnalyzerTerm::FourierTransformIonCyclotronResonanceMassSpectrometer + ); detector!(config, DetectorTypeTerm::InductiveDetector); configs.push(InstrumentConfiguration::default()); @@ -1062,13 +1114,13 @@ pub fn create_instrument_configurations(model: InstrumentModelType, source: Comp config.push(source.clone()); analyzer!(config, MassAnalyzerTerm::RadialEjectionLinearIonTrap); detector!(config, DetectorTypeTerm::ElectronMultiplier); - }, - InstrumentModelType::Orbitrap_Fusion | - InstrumentModelType::Orbitrap_Fusion_Lumos | - InstrumentModelType::Orbitrap_Fusion_ETD | - InstrumentModelType::Orbitrap_Ascend | - InstrumentModelType::Orbitrap_ID_X | - InstrumentModelType::Orbitrap_Eclipse => { + } + InstrumentModelType::Orbitrap_Fusion + | InstrumentModelType::Orbitrap_Fusion_Lumos + | InstrumentModelType::Orbitrap_Fusion_ETD + | InstrumentModelType::Orbitrap_Ascend + | InstrumentModelType::Orbitrap_ID_X + | InstrumentModelType::Orbitrap_Eclipse => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); @@ -1084,18 +1136,17 @@ pub fn create_instrument_configurations(model: InstrumentModelType, source: Comp analyzer!(config quadrupole); analyzer!(config radial); detector!(config electron); - } - InstrumentModelType::LTQ_Orbitrap | - InstrumentModelType::LTQ_Orbitrap_Classic | - InstrumentModelType::LTQ_Orbitrap_Discovery | - InstrumentModelType::LTQ_Orbitrap_XL | - InstrumentModelType::LTQ_Orbitrap_XL_ETD | - InstrumentModelType::MALDI_LTQ_Orbitrap | - InstrumentModelType::LTQ_Orbitrap_Velos | - InstrumentModelType::LTQ_Orbitrap_Velos_Pro | - InstrumentModelType::LTQ_Orbitrap_Elite => { + InstrumentModelType::LTQ_Orbitrap + | InstrumentModelType::LTQ_Orbitrap_Classic + | InstrumentModelType::LTQ_Orbitrap_Discovery + | InstrumentModelType::LTQ_Orbitrap_XL + | InstrumentModelType::LTQ_Orbitrap_XL_ETD + | InstrumentModelType::MALDI_LTQ_Orbitrap + | InstrumentModelType::LTQ_Orbitrap_Velos + | InstrumentModelType::LTQ_Orbitrap_Velos_Pro + | InstrumentModelType::LTQ_Orbitrap_Elite => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); @@ -1109,70 +1160,68 @@ pub fn create_instrument_configurations(model: InstrumentModelType, source: Comp analyzer!(config radial); detector!(config electron); - }, - InstrumentModelType::LCQ_Advantage | - InstrumentModelType::LCQ_Classic | - InstrumentModelType::LCQ_Deca | - InstrumentModelType::LCQ_Deca_XP_Plus | - InstrumentModelType::LCQ_Fleet | - InstrumentModelType::PolarisQ | - InstrumentModelType::ITQ_700 | - InstrumentModelType::ITQ_900 => { + } + InstrumentModelType::LCQ_Advantage + | InstrumentModelType::LCQ_Classic + | InstrumentModelType::LCQ_Deca + | InstrumentModelType::LCQ_Deca_XP_Plus + | InstrumentModelType::LCQ_Fleet + | InstrumentModelType::PolarisQ + | InstrumentModelType::ITQ_700 + | InstrumentModelType::ITQ_900 => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); analyzer!(config, MassAnalyzerTerm::QuadrupoleIonTrap); detector!(config electron); - }, - + } - InstrumentModelType::LTQ | - InstrumentModelType::LXQ | - InstrumentModelType::LTQ_XL | - InstrumentModelType::LTQ_XL_ETD | - InstrumentModelType::ITQ_1100 | - InstrumentModelType::MALDI_LTQ_XL | - InstrumentModelType::LTQ_Velos | - InstrumentModelType::LTQ_Velos_ETD | - InstrumentModelType::LTQ_Velos_Plus => { + InstrumentModelType::LTQ + | InstrumentModelType::LXQ + | InstrumentModelType::LTQ_XL + | InstrumentModelType::LTQ_XL_ETD + | InstrumentModelType::ITQ_1100 + | InstrumentModelType::MALDI_LTQ_XL + | InstrumentModelType::LTQ_Velos + | InstrumentModelType::LTQ_Velos_ETD + | InstrumentModelType::LTQ_Velos_Plus => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); analyzer!(config radial); detector!(config electron); - }, - InstrumentModelType::SSQ_7000 | - InstrumentModelType::Surveyor_MSQ | - InstrumentModelType::DSQ | - InstrumentModelType::DSQ_II | - InstrumentModelType::ISQ | - InstrumentModelType::ISQ_7000 | - InstrumentModelType::Trace_DSQ | - InstrumentModelType::GC_IsoLink => { + } + InstrumentModelType::SSQ_7000 + | InstrumentModelType::Surveyor_MSQ + | InstrumentModelType::DSQ + | InstrumentModelType::DSQ_II + | InstrumentModelType::ISQ + | InstrumentModelType::ISQ_7000 + | InstrumentModelType::Trace_DSQ + | InstrumentModelType::GC_IsoLink => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); analyzer!(config quadrupole); detector!(config electron); - - }, - InstrumentModelType::TSQ_7000 | - InstrumentModelType::TSQ_8000_Evo | - InstrumentModelType::TSQ_9000 | - InstrumentModelType::TSQ | - InstrumentModelType::TSQ_Quantum | - InstrumentModelType::TSQ_Quantum_Access | - InstrumentModelType::TSQ_Quantum_Ultra | - InstrumentModelType::TSQ_Quantum_Ultra_AM | - InstrumentModelType::GC_Quantum | - InstrumentModelType::TSQ_Quantiva | - InstrumentModelType::TSQ_Endura | - InstrumentModelType::TSQ_Altis | - InstrumentModelType::TSQ_Altis_Plus | - InstrumentModelType::TSQ_Quantis => { + } + InstrumentModelType::TSQ_7000 + | InstrumentModelType::TSQ_8000_Evo + | InstrumentModelType::TSQ_9000 + | InstrumentModelType::TSQ + | InstrumentModelType::TSQ_Quantum + | InstrumentModelType::TSQ_Quantum_Access + | InstrumentModelType::TSQ_Quantum_Ultra + | InstrumentModelType::TSQ_Quantum_Ultra_AM + | InstrumentModelType::GC_Quantum + | InstrumentModelType::TSQ_Quantiva + | InstrumentModelType::TSQ_Endura + | InstrumentModelType::TSQ_Altis + | InstrumentModelType::TSQ_Altis_Plus + | InstrumentModelType::TSQ_Quantis => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); @@ -1180,22 +1229,22 @@ pub fn create_instrument_configurations(model: InstrumentModelType, source: Comp analyzer!(config quadrupole); analyzer!(config quadrupole); detector!(config electron); - }, - InstrumentModelType::DFS | - InstrumentModelType::MAT253 | - InstrumentModelType::MAT900XP | - InstrumentModelType::MAT900XP_Trap | - InstrumentModelType::MAT95XP | - InstrumentModelType::MAT95XP_Trap => { + } + InstrumentModelType::DFS + | InstrumentModelType::MAT253 + | InstrumentModelType::MAT900XP + | InstrumentModelType::MAT900XP_Trap + | InstrumentModelType::MAT95XP + | InstrumentModelType::MAT95XP_Trap => { configs.push(InstrumentConfiguration::default()); let config = configs.last_mut().unwrap(); config.push(source.clone()); analyzer!(config, MassAnalyzerTerm::MagneticSector); detector!(config, DetectorTypeTerm::ElectronMultiplier); - }, + } _ => {} } configs -} \ No newline at end of file +} diff --git a/src/io/thermo/mod.rs b/src/io/thermo/mod.rs index 3d8491b..c27bb31 100644 --- a/src/io/thermo/mod.rs +++ b/src/io/thermo/mod.rs @@ -27,7 +27,7 @@ mod instruments; mod reader; -pub use reader::{is_thermo_raw_prefix, ThermoRawReader, ThermoRawReaderType}; +pub use reader::{ThermoRawReader, ThermoRawReaderType, is_thermo_raw_prefix}; #[cfg(feature = "async")] mod async_reader; diff --git a/src/io/thermo/reader.rs b/src/io/thermo/reader.rs index 2d6bbe9..47353b9 100644 --- a/src/io/thermo/reader.rs +++ b/src/io/thermo/reader.rs @@ -4,9 +4,10 @@ use chrono::DateTime; use log::{debug, warn}; use crate::{ + Param, io::{ - traits::ChromatogramSource, utils::checksum_file, DetailLevel, - Generic3DIonMobilityFrameSource, OffsetIndex, + DetailLevel, Generic3DIonMobilityFrameSource, OffsetIndex, traits::ChromatogramSource, + utils::checksum_file, }, meta::{ Component, ComponentType, DataProcessing, DetectorTypeTerm, DissociationMethodTerm, @@ -21,18 +22,17 @@ use crate::{ MultiLayerSpectrum, Precursor, ScanEvent, ScanPolarity, ScanWindow, SelectedIon, SignalContinuity, }, - Param, }; -use mzpeaks::{peak_set::PeakSetVec, prelude::*, CentroidPeak, DeconvolutedPeak, MZ}; +use mzpeaks::{CentroidPeak, DeconvolutedPeak, MZ, peak_set::PeakSetVec, prelude::*}; +#[allow(unused)] use super::instruments::{ - create_instrument_configurations, instrument_model_to_ion_sources, - instrument_model_to_mass_analyzers, + InstrumentModelType, instrument_model_to_detector, parse_instrument_model, }; -#[allow(unused)] use super::instruments::{ - instrument_model_to_detector, parse_instrument_model, InstrumentModelType, + create_instrument_configurations, instrument_model_to_ion_sources, + instrument_model_to_mass_analyzers, }; macro_rules! param { @@ -47,7 +47,9 @@ macro_rules! param { /// codepoints 1-9. pub fn is_thermo_raw_prefix(buffer: &[u8]) -> bool { if buffer.len() < 18 { - debug!("Attempted to test a byte buffer for the Thermo prefix, buffer was less than 18 bytes long"); + debug!( + "Attempted to test a byte buffer for the Thermo prefix, buffer was less than 18 bytes long" + ); return false; } let view: &[u16] = unsafe { mem::transmute(&buffer[2..18]) }; @@ -91,7 +93,7 @@ fn make_native_id(index: i32) -> String { ) } -const SOURCE_FILE_ID: & str = "RAW1"; +const SOURCE_FILE_ID: &str = "RAW1"; #[cfg(not(feature = "doc-only"))] pub(crate) mod sealed { @@ -101,11 +103,11 @@ pub(crate) mod sealed { use super::*; use thermorawfilereader::{ + ExtendedSpectrumData, FileDescription as ThermoFileDescription, IonizationMode, + MassAnalyzer, RawFileReader, schema::{ AcquisitionT, DissociationMethod, Polarity, PrecursorT, SpectrumData, SpectrumMode, }, - ExtendedSpectrumData, FileDescription as ThermoFileDescription, IonizationMode, - MassAnalyzer, RawFileReader, }; /** @@ -133,9 +135,7 @@ pub(crate) mod sealed { } // The public API - impl, D: DeconvolutedCentroidLike> - ThermoRawReaderType - { + impl, D: DeconvolutedCentroidLike> ThermoRawReaderType { /// Create a new [`ThermoRawReaderType`] from a path. /// This may trigger an expensive I/O operation to checksum the file pub fn new_with_detail_level_and_centroiding>( @@ -213,7 +213,12 @@ pub(crate) mod sealed { } /// Directly load binary data arrays for a specific spectrum - pub fn get_data_arrays_for(&mut self, index: usize, centroiding: bool, extra_data: bool) -> Option { + pub fn get_data_arrays_for( + &mut self, + index: usize, + centroiding: bool, + extra_data: bool, + ) -> Option { let data = self.handle.get_spectrum_data(index, centroiding)?; let mut arrays = BinaryArrayMap::default(); @@ -552,9 +557,7 @@ pub(crate) mod sealed { } } - impl, D: DeconvolutedCentroidLike> - ThermoRawReaderType - { + impl, D: DeconvolutedCentroidLike> ThermoRawReaderType { pub(crate) fn make_ms_run( path: &Path, thermo_file_description: &ThermoFileDescription, @@ -563,9 +566,11 @@ pub(crate) mod sealed { default_instrument_id: Some(0), default_source_file_id: Some(SOURCE_FILE_ID.to_string()), id: path - .file_name() - .map(|s| s.to_string_lossy().split(".").next().unwrap().to_string()), - start_time: thermo_file_description.creation_date().map(|s| DateTime::parse_from_rfc3339(s).unwrap()), + .file_name() + .map(|s| s.to_string_lossy().split(".").next().unwrap().to_string()), + start_time: thermo_file_description + .creation_date() + .map(|s| DateTime::parse_from_rfc3339(s).unwrap()), ..Default::default() }; run @@ -658,11 +663,9 @@ pub(crate) mod sealed { }) .collect(); - let serial_number_param = descr.serial_number().map(|serial| ControlledVocabulary::MS.param_val( - 1000529, - "instrument serial number", - serial, - )); + let serial_number_param = descr.serial_number().map(|serial| { + ControlledVocabulary::MS.param_val(1000529, "instrument serial number", serial) + }); // Try to build the instrument configuration from the metadata for (i, vconf) in descr.configurations().enumerate() { @@ -745,12 +748,19 @@ pub(crate) mod sealed { // If the whole configurations weren't specified by the instrument model, // try to guess them piece-meal. if configs.is_empty() { - log::debug!("Still no configurations found. Using instrument model {} to infer configurations by parts", model_type); + log::debug!( + "Still no configurations found. Using instrument model {} to infer configurations by parts", + model_type + ); let mass_analyzers = instrument_model_to_mass_analyzers(model_type); let ionization_types = instrument_model_to_ion_sources(model_type); let detectors = instrument_model_to_detector(model_type); - log::debug!("Found {} mass analyzers, {} ionization types, {} detectors for model", - mass_analyzers.len(), ionization_types.len(), detectors.len()); + log::debug!( + "Found {} mass analyzers, {} ionization types, {} detectors for model", + mass_analyzers.len(), + ionization_types.len(), + detectors.len() + ); let mut i = 0; for ionization in ionization_types.iter() { @@ -781,7 +791,12 @@ pub(crate) mod sealed { let vconf_mass_analyzer = translate_mass_analyzer_reverse(mass_analyzer); components_to_instrument_id.insert(vconf_mass_analyzer, i); - log::debug!("Created piece-meal configuration {}: {:?} -> {:?}", i, mass_analyzer, vconf_mass_analyzer); + log::debug!( + "Created piece-meal configuration {}: {:?} -> {:?}", + i, + mass_analyzer, + vconf_mass_analyzer + ); configs.insert(i, config); i += 1; @@ -791,7 +806,11 @@ pub(crate) mod sealed { if configs.is_empty() { log::warn!("No instrument configurations were found in Thermo RAW file") } else { - log::debug!("Final result: {} configurations, mapping: {:?}", configs.len(), components_to_instrument_id); + log::debug!( + "Final result: {} configurations, mapping: {:?}", + configs.len(), + components_to_instrument_id + ); } (sw, configs, components_to_instrument_id) } @@ -807,11 +826,9 @@ pub(crate) mod sealed { pub(crate) fn make_sample( thermo_file_description: &ThermoFileDescription, ) -> Option { - thermo_file_description.sample_id().map(|name| Sample::new( - name.to_string(), - Some(name.to_string()), - Vec::new(), - )) + thermo_file_description + .sample_id() + .map(|name| Sample::new(name.to_string(), Some(name.to_string()), Vec::new())) } pub(crate) fn populate_precursor(&self, vprec: &PrecursorT, precursor: &mut Precursor) { @@ -864,9 +881,9 @@ pub(crate) mod sealed { activation .methods_mut() .push(DissociationMethodTerm::ElectronTransferDissociation); - activation.methods_mut().push( - DissociationMethodTerm::SupplementalCollisionInducedDissociation, - ); + activation + .methods_mut() + .push(DissociationMethodTerm::SupplementalCollisionInducedDissociation); } DissociationMethod::NETD => { activation @@ -1207,9 +1224,7 @@ pub(crate) mod stub { // The public API // This is a stub for documentation compilation when the dotnet runtime isn't available. // See the the [`sealed`](super::sealed) module for the real implementation. - impl, D: DeconvolutedCentroidLike> - ThermoRawReaderType - { + impl, D: DeconvolutedCentroidLike> ThermoRawReaderType { /// Get whether or not to load extended spectrum signal information for the spectrum. /// /// The loaded data isn't incorporated into a peak list, instead access them under @@ -1399,8 +1414,8 @@ impl, D: DeconvolutedCentroidLike> } } -impl, D: DeconvolutedCentroidLike> - MSDataFileMetadata for ThermoRawReaderType +impl, D: DeconvolutedCentroidLike> MSDataFileMetadata + for ThermoRawReaderType { fn data_processings(&self) -> &Vec { &self.data_processings @@ -1488,7 +1503,8 @@ impl IntoIonMobilityFrameS DF: FeatureLike + KnownCharge, >( mut self, - ) -> Result, crate::io::IntoIonMobilityFrameSourceError> { + ) -> Result, crate::io::IntoIonMobilityFrameSourceError> + { if let Some(state) = self.has_ion_mobility() { if matches!(state, crate::spectrum::HasIonMobility::Dimension) { Ok(Self::IonMobilityFrameSource::new(self)) @@ -1520,14 +1536,18 @@ mod test { "b43e9286b40e8b5dbc0dfa2e428495769ca96a96" ); - assert!(reader - .file_description() - .get_param_by_accession("MS:1000579") - .is_some()); - assert!(reader - .file_description() - .get_param_by_accession("MS:1000580") - .is_some()); + assert!( + reader + .file_description() + .get_param_by_accession("MS:1000579") + .is_some() + ); + assert!( + reader + .file_description() + .get_param_by_accession("MS:1000580") + .is_some() + ); let confs = reader.instrument_configurations(); assert_eq!(confs.len(), 2); diff --git a/src/io/traits.rs b/src/io/traits.rs index 9969a85..74cb069 100644 --- a/src/io/traits.rs +++ b/src/io/traits.rs @@ -6,26 +6,24 @@ mod util; pub use spectrum::{ MZFileReader, MemorySpectrumSource, RandomAccessSpectrumGroupingIterator, RandomAccessSpectrumIterator, RandomAccessSpectrumSource, SpectrumAccessError, - SpectrumIterator, SpectrumReceiver, SpectrumSource, - SpectrumSourceWithMetadata, SpectrumWriter, StreamingSpectrumIterator, + SpectrumIterator, SpectrumReceiver, SpectrumSource, SpectrumSourceWithMetadata, SpectrumWriter, + StreamingSpectrumIterator, }; pub use util::SeekRead; pub use frame::{ BorrowedGeneric3DIonMobilityFrameSource, Generic3DIonMobilityFrameSource, - IonMobilityFrameAccessError, IonMobilityFrameIterator, - IonMobilityFrameSource, IonMobilityFrameWriter, RandomAccessIonMobilityFrameIterator, - RandomAccessIonMobilityFrameGroupingIterator, - IntoIonMobilityFrameSourceError, - IntoIonMobilityFrameSource + IntoIonMobilityFrameSource, IntoIonMobilityFrameSourceError, IonMobilityFrameAccessError, + IonMobilityFrameIterator, IonMobilityFrameSource, IonMobilityFrameWriter, + RandomAccessIonMobilityFrameGroupingIterator, RandomAccessIonMobilityFrameIterator, }; pub use chromatogram::{ChromatogramIterator, ChromatogramSource}; -pub use crate::spectrum::group::{SpectrumGrouping, IonMobilityFrameGrouping}; +pub use crate::spectrum::group::{IonMobilityFrameGrouping, SpectrumGrouping}; #[cfg(feature = "async_partial")] -pub use spectrum::{AsyncSpectrumSource, AsyncRandomAccessSpectrumIterator, SpectrumStream}; +pub use spectrum::{AsyncRandomAccessSpectrumIterator, AsyncSpectrumSource, SpectrumStream}; #[cfg(feature = "async")] pub use spectrum::AsyncMZFileReader; diff --git a/src/io/traits/chromatogram.rs b/src/io/traits/chromatogram.rs index d120b92..29464b6 100644 --- a/src/io/traits/chromatogram.rs +++ b/src/io/traits/chromatogram.rs @@ -2,7 +2,6 @@ use std::iter::FusedIterator; use crate::spectrum::Chromatogram; - /// A trait that for retrieving [`Chromatogram`]s from a source. pub trait ChromatogramSource { /// Get a [`Chromatogram`] by its identifier, if it exists. @@ -47,4 +46,4 @@ impl Iterator for ChromatogramIterator<'_, R> { } } -impl FusedIterator for ChromatogramIterator<'_, R> {} \ No newline at end of file +impl FusedIterator for ChromatogramIterator<'_, R> {} diff --git a/src/io/traits/frame.rs b/src/io/traits/frame.rs index a54a823..cdd21d2 100644 --- a/src/io/traits/frame.rs +++ b/src/io/traits/frame.rs @@ -6,17 +6,13 @@ use log::warn; use thiserror::Error; use mzpeaks::{ + CentroidLike, DeconvolutedCentroidLike, IonMobility, KnownCharge, MZ, Mass, feature::{ChargedFeature, Feature, FeatureLike}, - DeconvolutedCentroidLike, IonMobility, KnownCharge, Mass, MZ, - CentroidLike, }; use crate::spectrum::group::IonMobilityFrameGroupingIterator; use crate::spectrum::spectrum_types::MultiLayerSpectrum; -use crate::spectrum::{ - IonMobilityFrameLike, - MultiLayerIonMobilityFrame, -}; +use crate::spectrum::{IonMobilityFrameLike, MultiLayerIonMobilityFrame}; use crate::{ io::{DetailLevel, OffsetIndex}, prelude::{MSDataFileMetadata, SpectrumLike}, @@ -132,7 +128,7 @@ pub trait IonMobilityFrameSource< /// Get the nth [`IonMobilityFrameGroup`] from this source fn get_group_by_index(&mut self, index: usize) -> Option> where - Self: Sized + Self: Sized, { self.groups().nth(index) } @@ -184,13 +180,13 @@ pub struct IonMobilityFrameIterator< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> IonMobilityFrameIterator<'_, C, D, S, R> { - pub fn new(source: &mut R) -> IonMobilityFrameIterator { + pub fn new(source: &mut R) -> IonMobilityFrameIterator<'_, C, D, S, R> { IonMobilityFrameIterator:: { source, index: 0, @@ -203,11 +199,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > Iterator for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> Iterator for IonMobilityFrameIterator<'_, C, D, S, R> { type Item = S; @@ -227,11 +223,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > ExactSizeIterator for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> ExactSizeIterator for IonMobilityFrameIterator<'_, C, D, S, R> { fn len(&self) -> usize { self.source.len() @@ -239,11 +235,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > DoubleEndedIterator for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> DoubleEndedIterator for IonMobilityFrameIterator<'_, C, D, S, R> { fn next_back(&mut self) -> Option { if self.index + self.back_index >= self.len() { @@ -257,11 +253,11 @@ impl< } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > IonMobilityFrameSource for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> IonMobilityFrameSource for IonMobilityFrameIterator<'_, C, D, S, R> { fn reset(&mut self) { self.index = 0; @@ -300,11 +296,11 @@ impl< /// If the underlying iterator implements [`MSDataFileMetadata`] then [`IonMobilityFrameIterator`] will /// forward that implementation, assuming it is available. impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > MSDataFileMetadata for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> MSDataFileMetadata for IonMobilityFrameIterator<'_, C, D, S, R> where R: MSDataFileMetadata, { @@ -329,12 +325,12 @@ pub struct Generic3DIonMobilityFrameSource< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > MSDataFileMetadata for Generic3DIonMobilityFrameSource + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> MSDataFileMetadata for Generic3DIonMobilityFrameSource where R: MSDataFileMetadata, { @@ -342,12 +338,12 @@ where } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > IonMobilityFrameSource> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> IonMobilityFrameSource> for Generic3DIonMobilityFrameSource { fn detail_level(&self) -> &DetailLevel { @@ -408,12 +404,12 @@ impl< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > Iterator for Generic3DIonMobilityFrameSource + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> Iterator for Generic3DIonMobilityFrameSource { type Item = MultiLayerIonMobilityFrame; @@ -426,12 +422,12 @@ impl< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > Generic3DIonMobilityFrameSource + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> Generic3DIonMobilityFrameSource { pub fn new(source: R) -> Self { Self { @@ -546,12 +542,12 @@ pub trait RandomAccessIonMobilityFrameIterator< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > RandomAccessIonMobilityFrameIterator> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> RandomAccessIonMobilityFrameIterator> for Generic3DIonMobilityFrameSource where R: RandomAccessSpectrumIterator>, @@ -579,11 +575,11 @@ where } impl< - C: FeatureLike, - D: FeatureLike + KnownCharge, - S: IonMobilityFrameLike, - R: IonMobilityFrameSource, - > RandomAccessIonMobilityFrameIterator for IonMobilityFrameIterator<'_, C, D, S, R> + C: FeatureLike, + D: FeatureLike + KnownCharge, + S: IonMobilityFrameLike, + R: IonMobilityFrameSource, +> RandomAccessIonMobilityFrameIterator for IonMobilityFrameIterator<'_, C, D, S, R> { /// Start iterating from the spectrum whose native ID matches `id` fn start_from_id(&mut self, id: &str) -> Result<&mut Self, IonMobilityFrameAccessError> { @@ -772,12 +768,12 @@ pub struct BorrowedGeneric3DIonMobilityFrameSource< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > MSDataFileMetadata for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> MSDataFileMetadata for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> where R: MSDataFileMetadata, { @@ -785,12 +781,12 @@ where } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > IonMobilityFrameSource> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> IonMobilityFrameSource> for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> { fn detail_level(&self) -> &DetailLevel { @@ -851,12 +847,12 @@ impl< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > Iterator for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> Iterator for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> { type Item = MultiLayerIonMobilityFrame; @@ -869,13 +865,13 @@ impl< } impl< - 'a, - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > BorrowedGeneric3DIonMobilityFrameSource<'a, CP, DP, R, C, D> + 'a, + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> BorrowedGeneric3DIonMobilityFrameSource<'a, CP, DP, R, C, D> { #[allow(unused)] pub fn new(source: &'a mut R) -> Self { @@ -890,12 +886,12 @@ impl< } impl< - CP: CentroidLike, - DP: DeconvolutedCentroidLike, - R: SpectrumSource>, - C: FeatureLike, - D: FeatureLike + KnownCharge, - > RandomAccessIonMobilityFrameIterator> + CP: CentroidLike, + DP: DeconvolutedCentroidLike, + R: SpectrumSource>, + C: FeatureLike, + D: FeatureLike + KnownCharge, +> RandomAccessIonMobilityFrameIterator> for BorrowedGeneric3DIonMobilityFrameSource<'_, CP, DP, R, C, D> where R: RandomAccessSpectrumIterator>, diff --git a/src/io/traits/spectrum.rs b/src/io/traits/spectrum.rs index 8bd55c3..62aa460 100644 --- a/src/io/traits/spectrum.rs +++ b/src/io/traits/spectrum.rs @@ -61,7 +61,9 @@ pub trait SpectrumSource< fn get_spectrum_by_time(&mut self, time: f64) -> Option { let n = self.len(); if n == 0 && !self.get_index().init { - warn!("Attempting to use `get_spectrum_by_time` when the spectrum index has not been initialized."); + warn!( + "Attempting to use `get_spectrum_by_time` when the spectrum index has not been initialized." + ); return None; } let mut lo: usize = 0; @@ -149,7 +151,7 @@ pub trait SpectrumSource< /// Get the nth [`SpectrumGroup`] from this source fn get_group_by_index(&mut self, index: usize) -> Option> where - Self: Sized + Self: Sized, { self.groups().nth(index) } @@ -191,11 +193,11 @@ pub struct SpectrumIterator< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - R: SpectrumSource, - S: SpectrumLike, - > SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + R: SpectrumSource, + S: SpectrumLike, +> SpectrumIterator<'_, C, D, S, R> { pub fn new(source: &mut R) -> SpectrumIterator<'_, C, D, S, R> { SpectrumIterator:: { @@ -210,11 +212,11 @@ impl< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - R: SpectrumSource, - S: SpectrumLike, - > Iterator for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + R: SpectrumSource, + S: SpectrumLike, +> Iterator for SpectrumIterator<'_, C, D, S, R> { type Item = S; @@ -234,11 +236,11 @@ impl< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - R: SpectrumSource, - S: SpectrumLike, - > ExactSizeIterator for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + R: SpectrumSource, + S: SpectrumLike, +> ExactSizeIterator for SpectrumIterator<'_, C, D, S, R> { fn len(&self) -> usize { self.source.len() @@ -246,11 +248,11 @@ impl< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - R: SpectrumSource, - S: SpectrumLike, - > DoubleEndedIterator for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + R: SpectrumSource, + S: SpectrumLike, +> DoubleEndedIterator for SpectrumIterator<'_, C, D, S, R> { fn next_back(&mut self) -> Option { if self.index + self.back_index >= self.len() { @@ -264,11 +266,11 @@ impl< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - R: SpectrumSource, - > SpectrumSource for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + S: SpectrumLike, + R: SpectrumSource, +> SpectrumSource for SpectrumIterator<'_, C, D, S, R> { fn reset(&mut self) { self.index = 0; @@ -307,11 +309,11 @@ impl< /// If the underlying iterator implements [`MSDataFileMetadata`] then [`SpectrumIterator`] will /// forward that implementation, assuming it is available. impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - R: SpectrumSource, - S: SpectrumLike, - > MSDataFileMetadata for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + R: SpectrumSource, + S: SpectrumLike, +> MSDataFileMetadata for SpectrumIterator<'_, C, D, S, R> where R: MSDataFileMetadata, { @@ -362,7 +364,6 @@ pub trait MZFileReader< where P: Into + Clone, { - #[cfg(feature = "serde")] let index_file_name = FileSource::::from(path.clone()).index_file_name(); @@ -396,11 +397,7 @@ pub trait MZFileReader< } #[cfg(feature = "serde")] -fn _save_index< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, ->( +fn _save_index>( index_path: &PathBuf, reader: &impl MZFileReader, ) -> io::Result<()> { @@ -473,11 +470,11 @@ pub trait RandomAccessSpectrumIterator< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - R: SpectrumSource, - > RandomAccessSpectrumIterator for SpectrumIterator<'_, C, D, S, R> + C: CentroidLike, + D: DeconvolutedCentroidLike, + S: SpectrumLike, + R: SpectrumSource, +> RandomAccessSpectrumIterator for SpectrumIterator<'_, C, D, S, R> { /// Start iterating from the spectrum whose native ID matches `id` fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { @@ -530,11 +527,11 @@ pub trait RandomAccessSpectrumSource< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - T: SpectrumSource + RandomAccessSpectrumIterator, - > RandomAccessSpectrumSource for T + C: CentroidLike, + D: DeconvolutedCentroidLike, + S: SpectrumLike, + T: SpectrumSource + RandomAccessSpectrumIterator, +> RandomAccessSpectrumSource for T { } @@ -547,11 +544,11 @@ pub trait SpectrumSourceWithMetadata< } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - T: SpectrumSource + MSDataFileMetadata, - > SpectrumSourceWithMetadata for T + C: CentroidLike, + D: DeconvolutedCentroidLike, + S: SpectrumLike, + T: SpectrumSource + MSDataFileMetadata, +> SpectrumSourceWithMetadata for T { } @@ -576,11 +573,8 @@ pub struct StreamingSpectrumIterator< _d: PhantomData, } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > From> +impl + Send> + From> for StreamingSpectrumIterator> { fn from(value: SpectrumReceiver) -> Self { @@ -588,23 +582,16 @@ impl< } } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > From> for StreamingSpectrumIterator> +impl + Send> + From> for StreamingSpectrumIterator> { fn from(value: Receiver) -> Self { Self::new(value.into()) } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - I: Iterator, - > SpectrumSource for StreamingSpectrumIterator +impl, I: Iterator> + SpectrumSource for StreamingSpectrumIterator { fn detail_level(&self) -> &DetailLevel { &DetailLevel::Full @@ -662,12 +649,8 @@ impl< } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - I: Iterator, - > Iterator for StreamingSpectrumIterator +impl, I: Iterator> + Iterator for StreamingSpectrumIterator { type Item = S; @@ -681,10 +664,10 @@ impl< } impl< - C: CentroidLike + From, - D: DeconvolutedCentroidLike + From, - I: Iterator>, - > super::frame::IntoIonMobilityFrameSource + C: CentroidLike + From, + D: DeconvolutedCentroidLike + From, + I: Iterator>, +> super::frame::IntoIonMobilityFrameSource for StreamingSpectrumIterator, I> { type IonMobilityFrameSource< @@ -721,12 +704,8 @@ impl< } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - I: Iterator, - > StreamingSpectrumIterator +impl, I: Iterator> + StreamingSpectrumIterator { pub fn new(source: I) -> Self { Self { @@ -778,12 +757,8 @@ impl< /// [`StreamingSpectrumIterator`] implements [`RandomAccessSpectrumIterator`] in a limited fashion /// by reading through successive spectra until the target spectrum is found. This will exhaust the /// underlying iterator if the requested coordinate is not found. -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - I: Iterator, - > RandomAccessSpectrumIterator for StreamingSpectrumIterator +impl, I: Iterator> + RandomAccessSpectrumIterator for StreamingSpectrumIterator { fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { match self.get_spectrum_by_id(id) { @@ -818,12 +793,8 @@ impl< /// If the underlying iterator implements [`MSDataFileMetadata`] then [`StreamingSpectrumIterator`] will /// forward that implementation, assuming it is available. -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - I: Iterator, - > MSDataFileMetadata for StreamingSpectrumIterator +impl, I: Iterator> + MSDataFileMetadata for StreamingSpectrumIterator where I: MSDataFileMetadata, { @@ -860,11 +831,8 @@ pub struct SpectrumReceiver< _d: PhantomData, } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > Iterator for SpectrumReceiver +impl + Send> + Iterator for SpectrumReceiver { type Item = S; @@ -879,11 +847,8 @@ impl< } } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > From> for SpectrumReceiver +impl + Send> + From> for SpectrumReceiver { fn from(value: Receiver) -> Self { Self { @@ -901,11 +866,8 @@ impl< } } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > MSDataFileMetadata for SpectrumReceiver +impl + Send> + MSDataFileMetadata for SpectrumReceiver { crate::impl_metadata_trait!(); @@ -922,11 +884,8 @@ impl< } } -impl< - C: CentroidLike + Send, - D: DeconvolutedCentroidLike + Send, - S: SpectrumLike + Send, - > SpectrumReceiver +impl + Send> + SpectrumReceiver { #[allow(unused, clippy::too_many_arguments)] pub fn new( @@ -984,11 +943,8 @@ pub struct MemorySpectrumSource< _d: PhantomData, } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike + Clone, - > MemorySpectrumSource +impl + Clone> + MemorySpectrumSource { pub fn new(spectra: VecDeque) -> Self { let mut offsets = OffsetIndex::new("spectrum".to_string()); @@ -1006,11 +962,8 @@ impl< } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike + Clone, - > Iterator for MemorySpectrumSource +impl + Clone> Iterator + for MemorySpectrumSource { type Item = S; @@ -1026,11 +979,8 @@ impl< } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike + Clone, - > SpectrumSource for MemorySpectrumSource +impl + Clone> + SpectrumSource for MemorySpectrumSource { fn reset(&mut self) { self.position = 0; @@ -1066,11 +1016,8 @@ impl< fn set_detail_level(&mut self, _detail_level: DetailLevel) {} } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike + Clone, - > RandomAccessSpectrumIterator for MemorySpectrumSource +impl + Clone> + RandomAccessSpectrumIterator for MemorySpectrumSource { fn start_from_id(&mut self, id: &str) -> Result<&mut Self, SpectrumAccessError> { match self.offsets.get(id) { @@ -1102,11 +1049,8 @@ impl< } } -impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike + Clone, - > From> for MemorySpectrumSource +impl + Clone> From> + for MemorySpectrumSource { fn from(value: VecDeque) -> Self { Self::new(value) @@ -1236,8 +1180,8 @@ mod async_traits { use std::future::Future; use futures::{ - stream::{self, FusedStream}, Stream, + stream::{self, FusedStream}, }; use super::*; @@ -1269,7 +1213,7 @@ mod async_traits { /// Retrieve a spectrum by it's integer index fn get_spectrum_by_index(&mut self, index: usize) - -> impl Future> + Send; + -> impl Future> + Send; /// Retrieve a spectrum by its scan start time /// Considerably more complex than seeking by ID or index, this involves @@ -1280,7 +1224,9 @@ mod async_traits { { let n = self.len(); if n == 0 && !self.get_index().init { - warn!("Attempting to use `get_spectrum_by_time` when the spectrum index has not been initialized."); + warn!( + "Attempting to use `get_spectrum_by_time` when the spectrum index has not been initialized." + ); return None; } let mut lo: usize = 0; @@ -1449,11 +1395,11 @@ mod async_traits { } impl< - C: CentroidLike, - D: DeconvolutedCentroidLike, - S: SpectrumLike, - T: Stream + FusedStream, - > SpectrumStream for T + C: CentroidLike, + D: DeconvolutedCentroidLike, + S: SpectrumLike, + T: Stream + FusedStream, + > SpectrumStream for T { } } diff --git a/src/io/usi.rs b/src/io/usi.rs index 22fd22d..793ae08 100644 --- a/src/io/usi.rs +++ b/src/io/usi.rs @@ -65,7 +65,7 @@ impl FromStr for USI { return Err(USIParseError::UnknownProtocol( protocol.to_string(), s.to_string(), - )) + )); } }; @@ -86,7 +86,7 @@ impl FromStr for USI { ident_value.to_string(), e.to_string(), s.to_string(), - )) + )); } }, "index" => match ident_value.parse() { @@ -98,7 +98,7 @@ impl FromStr for USI { ident_value.to_string(), e.to_string(), s.to_string(), - )) + )); } }, "nativeId" => { @@ -113,7 +113,7 @@ impl FromStr for USI { ident_value.to_string(), e.to_string(), s.to_string(), - )) + )); } } } @@ -121,7 +121,7 @@ impl FromStr for USI { return Err(USIParseError::UnknownIndexType( ident_type.to_string(), s.to_string(), - )) + )); } }; diff --git a/src/io/utils.rs b/src/io/utils.rs index b466c0b..fe802c1 100644 --- a/src/io/utils.rs +++ b/src/io/utils.rs @@ -72,12 +72,12 @@ impl FileSource { FileWrapper::Empty => None, FileWrapper::Stream(_stream) => None, FileWrapper::FileSystem(path) => { - if let Some(stem) = path.file_name() { - if let Some(parent) = path.parent() { - let base = parent.join(stem); - let name = base.with_extension("index.json"); - return Some(name); - } + if let Some(stem) = path.file_name() + && let Some(parent) = path.parent() + { + let base = parent.join(stem); + let name = base.with_extension("index.json"); + return Some(name); } None } @@ -332,7 +332,6 @@ impl io::Seek for MD5HashingStream { } } - #[cfg(test)] mod test { use super::*; diff --git a/src/lib.rs b/src/lib.rs index 1064521..35ecd23 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -64,16 +64,14 @@ pub mod prelude; pub mod spectrum; pub mod utils; -pub use crate::io::{MZReader, MZReaderBuilder}; #[cfg(feature = "mgf")] pub use crate::io::mgf::{MGFReader, MGFWriter}; #[cfg(feature = "mzml")] pub use crate::io::mzml::{MzMLReader, MzMLWriter}; +pub use crate::io::{MZReader, MZReaderBuilder}; #[cfg(feature = "mzmlb")] -pub use crate::io::mzmlb::{ - MzMLbReader, MzMLbWriter, MzMLbWriterBuilder, -}; +pub use crate::io::mzmlb::{MzMLbReader, MzMLbWriter, MzMLbWriterBuilder}; #[cfg(feature = "thermo")] pub use crate::io::thermo::ThermoRawReader; @@ -88,4 +86,4 @@ pub mod tutorial; pub use mzpeaks; #[cfg(feature = "mzsignal")] -pub use mzsignal; \ No newline at end of file +pub use mzsignal; diff --git a/src/main.rs b/src/main.rs index 45b6092..4a3feea 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,12 +8,12 @@ use std::time; use std::sync::mpsc::sync_channel; +use mzdata::MZReader; use mzdata::io::Source; use mzdata::prelude::*; use mzdata::spectrum::{ DeconvolutedSpectrum, MultiLayerSpectrum, RefPeakDataLevel, SignalContinuity, SpectrumLike, }; -use mzdata::MZReader; struct MSDataFileSummary { pub start_time: f64, @@ -22,7 +22,7 @@ struct MSDataFileSummary { pub charge_table: HashMap, pub peak_charge_table: HashMap>, pub peak_mode_table: HashMap, - pub has_ion_mobility: bool + pub has_ion_mobility: bool, } impl Default for MSDataFileSummary { @@ -112,11 +112,10 @@ impl MSDataFileSummary { let start = time::Instant::now(); let (sender, receiver) = sync_channel(2usize.pow(12)); let read_handle = spawn(move || { - reader.into_iter() + reader + .into_iter() .enumerate() - .for_each(|(i, scan)| { - sender.send((i, scan)).unwrap() - }); + .for_each(|(i, scan)| sender.send((i, scan)).unwrap()); }); let i = receiver.iter().fold(0, |_, (i, scan)| { if i % 10000 == 0 && i > 0 { @@ -134,7 +133,10 @@ impl MSDataFileSummary { read_handle.join().unwrap(); let end = time::Instant::now(); let elapsed = end - start; - println!("{:0.3} seconds elapsed, handled {i} spectra", elapsed.as_secs_f64()); + println!( + "{:0.3} seconds elapsed, handled {i} spectra", + elapsed.as_secs_f64() + ); } pub fn write_out(&self) { diff --git a/src/meta.rs b/src/meta.rs index ce921f4..e6e2ac7 100644 --- a/src/meta.rs +++ b/src/meta.rs @@ -19,7 +19,7 @@ pub use data_processing::{ ProcessingMethod, }; pub use software::{ - custom_software_name, Software, SoftwareTerm, SoftwareType as SoftwareTypeFlags, + Software, SoftwareTerm, SoftwareType as SoftwareTypeFlags, custom_software_name, }; pub use file_description::{ diff --git a/src/meta/activation.rs b/src/meta/activation.rs index f733238..30d54c6 100644 --- a/src/meta/activation.rs +++ b/src/meta/activation.rs @@ -1,7 +1,5 @@ use std::fmt::Display; - - crate::cvmap! { #[flag_type=i32] #[allow(unused)] @@ -90,23 +88,28 @@ crate::cvmap! { } impl DissociationMethodTerm { - pub fn is_electronic(&self) -> bool { - matches!(self, Self::ElectronActivatedDissociation - | Self::ElectronCaptureDissociation - | Self::ElectronTransferDissociation - | Self::NegativeElectronTransferDissociation) + matches!( + self, + Self::ElectronActivatedDissociation + | Self::ElectronCaptureDissociation + | Self::ElectronTransferDissociation + | Self::NegativeElectronTransferDissociation + ) } pub fn is_collisional(&self) -> bool { - matches!(self, Self::CollisionInducedDissociation - | Self::LowEnergyCollisionInducedDissociation - | Self::BeamTypeCollisionInducedDissociation - | Self::TrapTypeCollisionInducedDissociation - | Self::InSourceCollisionInducedDissociation - | Self::SupplementalBeamTypeCollisionInducedDissociation - | Self::SupplementalCollisionInducedDissociation - | Self::HigherEnergyBeamTypeCollisionInducedDissociation) + matches!( + self, + Self::CollisionInducedDissociation + | Self::LowEnergyCollisionInducedDissociation + | Self::BeamTypeCollisionInducedDissociation + | Self::TrapTypeCollisionInducedDissociation + | Self::InSourceCollisionInducedDissociation + | Self::SupplementalBeamTypeCollisionInducedDissociation + | Self::SupplementalCollisionInducedDissociation + | Self::HigherEnergyBeamTypeCollisionInducedDissociation + ) } } @@ -163,11 +166,17 @@ impl DissociationEnergyTerm { } pub const fn is_ramp_start(&self) -> bool { - matches!(self, Self::CollisionEnergyRampStart(_) | Self::PercentCollisionEnergyRampStart(_)) + matches!( + self, + Self::CollisionEnergyRampStart(_) | Self::PercentCollisionEnergyRampStart(_) + ) } pub const fn is_ramp_end(&self) -> bool { - matches!(self, Self::CollisionEnergyRampEnd(_) | Self::PercentCollisionEnergyRampEnd(_)) + matches!( + self, + Self::CollisionEnergyRampEnd(_) | Self::PercentCollisionEnergyRampEnd(_) + ) } pub const fn energy(&self) -> f32 { @@ -216,13 +225,22 @@ impl AsRef for DissociationEnergyTerm { #[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] pub enum DissociationEnergy { Energy(DissociationEnergyTerm), - Ramp { start: DissociationEnergyTerm, end: DissociationEnergyTerm }, - Combined { primary: DissociationEnergyTerm, supplementary: DissociationEnergyTerm} + Ramp { + start: DissociationEnergyTerm, + end: DissociationEnergyTerm, + }, + Combined { + primary: DissociationEnergyTerm, + supplementary: DissociationEnergyTerm, + }, } #[cfg(test)] mod test { - use crate::{params::{ControlledVocabulary, ParamCow, ValueRef}, Param}; + use crate::{ + Param, + params::{ControlledVocabulary, ParamCow, ValueRef}, + }; use super::*; @@ -234,7 +252,10 @@ mod test { assert!(!DissociationMethodTerm::ElectronTransferDissociation.is_collisional()); assert!(DissociationMethodTerm::ElectronTransferDissociation.is_electronic()); - assert_eq!(DissociationEnergyTerm::CollisionEnergy(30.0).to_string(), "CollisionEnergy(30.0)"); + assert_eq!( + DissociationEnergyTerm::CollisionEnergy(30.0).to_string(), + "CollisionEnergy(30.0)" + ); assert!(!DissociationEnergyTerm::CollisionEnergy(30.0).is_ramp_end()); assert!(!DissociationEnergyTerm::NormalizedCollisionEnergy(30.0).is_ramp_start()); @@ -283,28 +304,16 @@ mod test { let p: Param = DissociationEnergyTerm::NormalizedCollisionEnergy(30.0).into(); param.value = ValueRef::Empty; - assert_eq!( - p, - param - ); + assert_eq!(p, param); let p: Param = (&DissociationEnergyTerm::NormalizedCollisionEnergy(30.0)).into(); - assert_eq!( - p, - param - ); + assert_eq!(p, param); let p: ParamCow = DissociationEnergyTerm::NormalizedCollisionEnergy(30.0).into(); - assert_eq!( - p, - param - ); + assert_eq!(p, param); let p: ParamCow = (&DissociationEnergyTerm::NormalizedCollisionEnergy(30.0)).into(); - assert_eq!( - p, - param - ); + assert_eq!(p, param); param.value = 30.0.into(); let term: DissociationEnergyTerm = Param::from(param.clone()).into(); @@ -340,7 +349,9 @@ mod test { assert_eq!( DissociationEnergyTerm::from_name("normalized collision energy"), - Some(DissociationEnergyTerm::NormalizedCollisionEnergy(Default::default())) + Some(DissociationEnergyTerm::NormalizedCollisionEnergy( + Default::default() + )) ); } -} \ No newline at end of file +} diff --git a/src/meta/file_description.rs b/src/meta/file_description.rs index 7a95e0a..69bcec7 100644 --- a/src/meta/file_description.rs +++ b/src/meta/file_description.rs @@ -5,7 +5,7 @@ use std::path::Path; use crate::impl_param_described; use crate::io::infer_format; use crate::params::{ - ControlledVocabulary, Param, ParamDescribed, ParamList, ParamValue, ValueRef, CURIE, + CURIE, ControlledVocabulary, Param, ParamDescribed, ParamList, ParamValue, ValueRef, }; /// Description of a source file, including location and type. @@ -756,24 +756,24 @@ impl SpectrumType { #[doc = r" Retrieve a term set specific set of flags"] pub fn flags(&self) -> i32 { match self { - Self::MassSpectrum => { 0 }, - Self::ChargeInversionMassSpectrum => { 0 }, - Self::ConstantNeutralGainSpectrum => { 0 }, - Self::ConstantNeutralLossSpectrum => { 0 }, - Self::E2MassSpectrum => { 0 }, - Self::PrecursorIonSpectrum => { 0 }, - Self::ProductIonSpectrum => { 0 }, - Self::MS1Spectrum => { 0 }, - Self::MSnSpectrum => { 0 }, - Self::CRMSpectrum => { 0 }, - Self::SIMSpectrum => { 0 }, - Self::SRMSpectrum => { 0 }, - Self::PDASpectrum => { 0 }, - Self::EnhancedMultiplyChargedSpectrum => { 0 }, - Self::TimeDelayedFragmentationSpectrum => { 0 }, - Self::ElectromagneticRadiationSpectrum => { 0 }, - Self::EmissionSpectrum => { 0 }, - Self::AbsorptionSpectrum => { 0 }, + Self::MassSpectrum => 0, + Self::ChargeInversionMassSpectrum => 0, + Self::ConstantNeutralGainSpectrum => 0, + Self::ConstantNeutralLossSpectrum => 0, + Self::E2MassSpectrum => 0, + Self::PrecursorIonSpectrum => 0, + Self::ProductIonSpectrum => 0, + Self::MS1Spectrum => 0, + Self::MSnSpectrum => 0, + Self::CRMSpectrum => 0, + Self::SIMSpectrum => 0, + Self::SRMSpectrum => 0, + Self::PDASpectrum => 0, + Self::EnhancedMultiplyChargedSpectrum => 0, + Self::TimeDelayedFragmentationSpectrum => 0, + Self::ElectromagneticRadiationSpectrum => 0, + Self::EmissionSpectrum => 0, + Self::AbsorptionSpectrum => 0, } } #[doc = r" Retrieve the list of zero or more terms in the set which are"] @@ -987,7 +987,9 @@ impl SpectrumType { pub const fn default_main_axis(&self) -> crate::spectrum::ArrayType { match self { SpectrumType::PDASpectrum => crate::spectrum::ArrayType::WavelengthArray, - SpectrumType::ElectromagneticRadiationSpectrum => crate::spectrum::ArrayType::WavelengthArray, + SpectrumType::ElectromagneticRadiationSpectrum => { + crate::spectrum::ArrayType::WavelengthArray + } SpectrumType::EmissionSpectrum => crate::spectrum::ArrayType::WavelengthArray, SpectrumType::AbsorptionSpectrum => crate::spectrum::ArrayType::WavelengthArray, _ => crate::spectrum::ArrayType::MZArray, diff --git a/src/meta/instrument.rs b/src/meta/instrument.rs index 0efebfb..3f7b5ad 100644 --- a/src/meta/instrument.rs +++ b/src/meta/instrument.rs @@ -87,25 +87,21 @@ impl Component { ComponentType::Analyzer => it .flat_map(|p| { p.accession - .and_then(|u| { - MassAnalyzerTerm::from_accession(u) - }) + .and_then(MassAnalyzerTerm::from_accession) .map(|u| u.name()) }) .next(), ComponentType::IonSource => it .flat_map(|p| { - p.accession.and_then(|u| { - IonizationTypeTerm::from_accession(u) - }) + p.accession + .and_then(IonizationTypeTerm::from_accession) .map(|u| u.name()) }) .next(), ComponentType::Detector => it .flat_map(|p| { - p.accession.and_then(|u| { - DetectorTypeTerm::from_accession(u) - }) + p.accession + .and_then(DetectorTypeTerm::from_accession) .map(|u| u.name()) }) .next(), diff --git a/src/meta/sample.rs b/src/meta/sample.rs index 036aabb..d307c78 100644 --- a/src/meta/sample.rs +++ b/src/meta/sample.rs @@ -1,7 +1,6 @@ use crate::impl_param_described; use crate::params::{ParamDescribed, ParamList}; - /// A sample that was used to generate a MS dataset #[derive(Debug, Default, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -11,7 +10,7 @@ pub struct Sample { /// The sample's human-friendly name pub name: Option, /// The controlled vocabulary and user parameters of the sample - pub params: ParamList + pub params: ParamList, } impl Sample { @@ -19,9 +18,16 @@ impl Sample { Self { id, name, params } } - crate::find_param_method!(number, &crate::curie!(MS:1000001), "Find the sample number, if it is present"); - crate::find_param_method!(batch, &crate::curie!(MS:1000053), "Find the sample batch, if it is present"); + crate::find_param_method!( + number, + &crate::curie!(MS:1000001), + "Find the sample number, if it is present" + ); + crate::find_param_method!( + batch, + &crate::curie!(MS:1000053), + "Find the sample batch, if it is present" + ); } - -impl_param_described!(Sample); \ No newline at end of file +impl_param_described!(Sample); diff --git a/src/meta/scan_settings.rs b/src/meta/scan_settings.rs index dd36667..3491d30 100644 --- a/src/meta/scan_settings.rs +++ b/src/meta/scan_settings.rs @@ -1,8 +1,7 @@ use crate::params::{Param, ParamDescribed}; - /// Description of the acquisition settings of the instrument prior to the start of the run -#[derive(Debug, Default, Clone, )] +#[derive(Debug, Default, Clone)] pub struct ScanSettings { /// A unique identifier pub id: String, @@ -15,8 +14,18 @@ pub struct ScanSettings { } impl ScanSettings { - pub fn new(id: String, params: Vec, source_file_refs: Vec, targets: Vec>) -> Self { - Self { id, params, source_file_refs, targets } + pub fn new( + id: String, + params: Vec, + source_file_refs: Vec, + targets: Vec>, + ) -> Self { + Self { + id, + params, + source_file_refs, + targets, + } } } @@ -28,4 +37,4 @@ impl ParamDescribed for ScanSettings { fn params_mut(&mut self) -> &mut crate::ParamList { &mut self.params } -} \ No newline at end of file +} diff --git a/src/meta/software.rs b/src/meta/software.rs index 397f606..817504b 100644 --- a/src/meta/software.rs +++ b/src/meta/software.rs @@ -1,7 +1,7 @@ use std::collections::HashSet; use crate::params::{ControlledVocabulary, ParamList}; -use crate::{impl_param_described, Param}; +use crate::{Param, impl_param_described}; /// A piece of software that was associated with the acquisition, transformation or otherwise /// processing of mass spectrometry data. @@ -78,17 +78,23 @@ impl Software { /// Is this software for analysis? pub fn is_analysis(&self) -> bool { - self.find_software_term().map(|s| s.flags().is_analysis()).unwrap_or(false) + self.find_software_term() + .map(|s| s.flags().is_analysis()) + .unwrap_or(false) } /// Is this software for data processing? pub fn is_data_processing(&self) -> bool { - self.find_software_term().map(|s| s.flags().is_data_processing()).unwrap_or(false) + self.find_software_term() + .map(|s| s.flags().is_data_processing()) + .unwrap_or(false) } /// Is this software for data acquisition? pub fn is_acquisition(&self) -> bool { - self.find_software_term().map(|s| s.flags().is_acquisition()).unwrap_or(false) + self.find_software_term() + .map(|s| s.flags().is_acquisition()) + .unwrap_or(false) } /// Find a unique identifier from an iterator over software IDs @@ -1283,13 +1289,19 @@ mod test { SoftwareType::Analysis | SoftwareType::Acquisition | SoftwareType::DataProcessing ); assert!( - SoftwareTerm::SCIEXTOFTOFSeriesExplorerSoftware.flags().is_analysis(), + SoftwareTerm::SCIEXTOFTOFSeriesExplorerSoftware + .flags() + .is_analysis(), ); } #[test] fn sw_test() { - let mut sw = Software::new("foo".into(), "v0.1.0".into(), vec![custom_software_name("foo")]); + let mut sw = Software::new( + "foo".into(), + "v0.1.0".into(), + vec![custom_software_name("foo")], + ); assert_eq!(sw.id, "foo"); assert_eq!(sw.version, "v0.1.0"); assert!(sw.find_software_term().is_some()); @@ -1299,7 +1311,6 @@ mod test { assert!(sw.is_analysis()); assert!(sw.find_software_term().is_some()); - let id = Software::find_unique_id("foo", [sw].iter()); assert_eq!(id, "foo_0"); } diff --git a/src/params.rs b/src/params.rs index 7909103..7926e5e 100644 --- a/src/params.rs +++ b/src/params.rs @@ -325,10 +325,10 @@ impl Value { return Ok(*val); } else if let Self::Int(val) = self { return Ok(*val as f64); - } else if let Self::String(val) = self { - if let Ok(v) = val.parse() { - return Ok(v); - } + } else if let Self::String(val) = self + && let Ok(v) = val.parse() + { + return Ok(v); } Err(ParamValueParseError::FailedToExtractFloat(Some( self.to_string(), @@ -340,10 +340,10 @@ impl Value { return Ok(*val); } else if let Self::Float(val) = self { return Ok(*val as i64); - } else if let Self::String(val) = self { - if let Ok(v) = val.parse() { - return Ok(v); - } + } else if let Self::String(val) = self + && let Ok(v) = val.parse() + { + return Ok(v); } Err(ParamValueParseError::FailedToExtractInt(Some( self.to_string(), @@ -824,10 +824,10 @@ impl<'a> ValueRef<'a> { return Ok(*val); } else if let Self::Int(val) = self { return Ok(*val as f64); - } else if let Self::String(val) = self { - if let Ok(v) = val.parse() { - return Ok(v); - } + } else if let Self::String(val) = self + && let Ok(v) = val.parse() + { + return Ok(v); } Err(ParamValueParseError::FailedToExtractFloat(Some( self.to_string(), @@ -839,10 +839,10 @@ impl<'a> ValueRef<'a> { return Ok(*val); } else if let Self::Float(val) = self { return Ok(*val as i64); - } else if let Self::String(val) = self { - if let Ok(v) = val.parse() { - return Ok(v); - } + } else if let Self::String(val) = self + && let Ok(v) = val.parse() + { + return Ok(v); } Err(ParamValueParseError::FailedToExtractInt(Some( self.to_string(), @@ -1103,14 +1103,17 @@ param_value_ref_int!(usize); param_value_ref_float!(f32); param_value_ref_float!(f64); - #[cfg(feature = "serde")] impl From for serde_json::Value { fn from(value: Value) -> Self { match value { Value::Boolean(val) => serde_json::Value::Bool(val), - Value::Float(val) => serde_json::Value::Number(serde_json::Number::from_f64(val).unwrap()), - Value::Int(val) => serde_json::Value::Number(serde_json::Number::from_i128(val as i128).unwrap()), + Value::Float(val) => { + serde_json::Value::Number(serde_json::Number::from_f64(val).unwrap()) + } + Value::Int(val) => { + serde_json::Value::Number(serde_json::Number::from_i128(val as i128).unwrap()) + } Value::String(val) => serde_json::Value::String(val), Value::Buffer(val) => serde_json::to_value(&val).unwrap(), Value::Empty => serde_json::Value::Null, @@ -1233,31 +1236,58 @@ macro_rules! find_param_method { #[macro_export] macro_rules! curie { (MS:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::MS, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::MS, + accession: $acc, + } }; (UO:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::UO, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::UO, + accession: $acc, + } }; (EFO:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::EFO, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::EFO, + accession: $acc, + } }; (BFO:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::BFO, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::BFO, + accession: $acc, + } }; (BTO:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::BTO, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::BTO, + accession: $acc, + } }; (OBI:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::OBI, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::OBI, + accession: $acc, + } }; (HANCESTRO:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::HANCESTRO, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::HANCESTRO, + accession: $acc, + } }; (NCIT:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::NCIT, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::NCIT, + accession: $acc, + } }; (PRIDE:$acc:literal) => { - $crate::params::CURIE { controlled_vocabulary: $crate::params::ControlledVocabulary::PRIDE, accession: $acc } + $crate::params::CURIE { + controlled_vocabulary: $crate::params::ControlledVocabulary::PRIDE, + accession: $acc, + } }; } @@ -1310,7 +1340,6 @@ impl PackedCURIE { } } - impl Display for CURIE { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -1367,13 +1396,13 @@ impl FromStr for CURIE { .next() .ok_or(CURIEParsingError::MissingNamespaceSeparator)?; let accession = tokens.next(); - if accession.is_none() { - Err(CURIEParsingError::MissingNamespaceSeparator) - } else { + if let Some(accession) = accession { let cv: ControlledVocabulary = cv.parse::()?; - let accession = accession.unwrap().parse()?; + let accession = accession.parse()?; Ok(CURIE::new(cv, accession)) + } else { + Err(CURIEParsingError::MissingNamespaceSeparator) } } } @@ -1963,7 +1992,6 @@ const BTO_CV_BYTES: &[u8] = BTO_CV.as_bytes(); const NCIT_CV_BYTES: &[u8] = NCIT_CV.as_bytes(); const PRIDE_CV_BYTES: &[u8] = PRIDE_CV.as_bytes(); - impl TryFrom for ControlledVocabulary { type Error = ControlledVocabularyResolutionError; @@ -2171,7 +2199,7 @@ pub enum ControlledVocabularyResolutionError { #[error("Unrecognized controlled vocabulary {0}")] UnknownControlledVocabulary(String), #[error("Unrecognized controlled vocabulary code {0}")] - UnknownControlledVocabularyCode(u8) + UnknownControlledVocabularyCode(u8), } impl FromStr for ControlledVocabulary { @@ -2373,9 +2401,10 @@ macro_rules! impl_param_described_deferred { } /// Units that a term's value might have -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Unit { + #[default] Unknown, // Mass @@ -2698,12 +2727,6 @@ impl Unit { } } -impl Default for Unit { - fn default() -> Self { - Self::Unknown - } -} - impl Display for Unit { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(format!("{:?}", self).as_str()) diff --git a/src/prelude.rs b/src/prelude.rs index 440a858..612d9aa 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,33 +1,32 @@ //! A set of foundational traits used throughout the library. pub use crate::io::traits::{ - MZFileReader, RandomAccessSpectrumGroupingIterator, RandomAccessSpectrumIterator, - RandomAccessSpectrumSource as _, SpectrumSourceWithMetadata as _, SpectrumSource, - SpectrumWriter, SeekRead, SpectrumAccessError, IonMobilityFrameSource, - RandomAccessIonMobilityFrameIterator, ChromatogramSource, - IonMobilityFrameWriter, RandomAccessIonMobilityFrameGroupingIterator, - IntoIonMobilityFrameSource, + ChromatogramSource, IntoIonMobilityFrameSource, IonMobilityFrameSource, IonMobilityFrameWriter, + MZFileReader, RandomAccessIonMobilityFrameGroupingIterator, + RandomAccessIonMobilityFrameIterator, RandomAccessSpectrumGroupingIterator, + RandomAccessSpectrumIterator, RandomAccessSpectrumSource as _, SeekRead, SpectrumAccessError, + SpectrumSource, SpectrumSourceWithMetadata as _, SpectrumWriter, }; #[cfg(feature = "async_partial")] pub use crate::io::traits::AsyncSpectrumSource; pub use crate::meta::MSDataFileMetadata; -pub use crate::params::{ParamDescribed, ParamLike, ParamValue, ParamDescribedRead}; +pub use crate::params::{ParamDescribed, ParamDescribedRead, ParamLike, ParamValue}; pub use crate::spectrum::bindata::{ - BuildArrayMapFrom, BuildFromArrayMap, ByteArrayView, ByteArrayViewMut, - BuildArrayMap3DFrom, BuildFromArrayMap3D + BuildArrayMap3DFrom, BuildArrayMapFrom, BuildFromArrayMap, BuildFromArrayMap3D, ByteArrayView, + ByteArrayViewMut, }; pub use crate::spectrum::{ - IonProperties, PrecursorSelection, SpectrumLike, IonMobilityMeasure, IonMobilityFrameLike, - SpectrumGrouping, IonMobilityFrameGrouping, ChromatogramLike, + ChromatogramLike, IonMobilityFrameGrouping, IonMobilityFrameLike, IonMobilityMeasure, + IonProperties, PrecursorSelection, SpectrumGrouping, SpectrumLike, }; #[cfg(feature = "mzsignal")] pub use crate::spectrum::group::SpectrumGroupAveraging; +#[doc(hidden)] +pub use mzpeaks::prelude::*; #[doc(hidden)] pub use std::convert::TryInto; #[doc(hidden)] pub use std::io::prelude::*; -#[doc(hidden)] -pub use mzpeaks::prelude::*; \ No newline at end of file diff --git a/src/spectrum.rs b/src/spectrum.rs index e8d2651..582f986 100644 --- a/src/spectrum.rs +++ b/src/spectrum.rs @@ -80,17 +80,17 @@ pub use utils::HasIonMobility; pub use frame::{ FeatureDataLevel, IonMobilityFrameDescription, IonMobilityFrameLike, - MultiLayerIonMobilityFrame, RefFeatureDataLevel + MultiLayerIonMobilityFrame, RefFeatureDataLevel, }; pub use group::{ IonMobilityFrameGroup, IonMobilityFrameGroupIntoIter, IonMobilityFrameGroupIter, - IonMobilityFrameGroupingIterator, SpectrumGroup, SpectrumGroupIntoIter, SpectrumGroupIter, - SpectrumGroupingIterator, SpectrumGrouping, IonMobilityFrameGrouping, + IonMobilityFrameGrouping, IonMobilityFrameGroupingIterator, SpectrumGroup, + SpectrumGroupIntoIter, SpectrumGroupIter, SpectrumGrouping, SpectrumGroupingIterator, }; #[cfg(feature = "mzsignal")] pub use group::{ - average_spectra, DeferredSpectrumAveragingIterator, SpectrumAveragingIterator, - SpectrumGroupAveraging, + DeferredSpectrumAveragingIterator, SpectrumAveragingIterator, SpectrumGroupAveraging, + average_spectra, }; diff --git a/src/spectrum/bindata.rs b/src/spectrum/bindata.rs index d9f253d..37dd51e 100644 --- a/src/spectrum/bindata.rs +++ b/src/spectrum/bindata.rs @@ -9,9 +9,9 @@ pub use conversion::{ ArraysAvailable, BuildArrayMap3DFrom, BuildArrayMapFrom, BuildFromArrayMap, BuildFromArrayMap3D, }; pub use encodings::{ - as_bytes, delta_decoding, delta_encoding, linear_prediction_decoding, - linear_prediction_encoding, to_bytes, vec_as_bytes, ArrayRetrievalError, ArrayType, - BinaryCompressionType, BinaryDataArrayType, Bytes, + ArrayRetrievalError, ArrayType, BinaryCompressionType, BinaryDataArrayType, Bytes, as_bytes, + delta_decoding, delta_encoding, linear_prediction_decoding, linear_prediction_encoding, + to_bytes, vec_as_bytes, }; pub use map::{BinaryArrayMap, BinaryArrayMap3D}; pub use traits::{ByteArrayView, ByteArrayViewMut}; diff --git a/src/spectrum/bindata/array.rs b/src/spectrum/bindata/array.rs index a93e8bd..c83ad80 100644 --- a/src/spectrum/bindata/array.rs +++ b/src/spectrum/bindata/array.rs @@ -5,14 +5,13 @@ use std::mem; use base64_simd; use bytemuck::Pod; -use flate2::write::{ZlibDecoder, ZlibEncoder}; use flate2::Compression; +use flate2::write::{ZlibDecoder, ZlibEncoder}; use crate::params::{ParamList, Unit}; use super::encodings::{ - to_bytes, ArrayRetrievalError, ArrayType, BinaryCompressionType, BinaryDataArrayType, - Bytes, + ArrayRetrievalError, ArrayType, BinaryCompressionType, BinaryDataArrayType, Bytes, to_bytes, }; use super::traits::{ByteArrayView, ByteArrayViewMut}; #[allow(unused)] @@ -114,7 +113,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { } pub fn slice(&self, start: usize, end: usize) -> Result { - if end < start || (end - start) % self.dtype.size_of() != 0 { + if end < start || !(end - start).is_multiple_of(self.dtype.size_of()) { Err(ArrayRetrievalError::DataTypeSizeMismatch) } else { let data = self.decode()?; @@ -129,7 +128,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { start: usize, end: usize, ) -> Result, ArrayRetrievalError> { - if end < start || (end - start) % self.dtype.size_of() != 0 { + if end < start || !(end - start).is_multiple_of(self.dtype.size_of()) { Err(ArrayRetrievalError::DataTypeSizeMismatch) } else { let data = self.decode()?; @@ -224,7 +223,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { panic!("Cannot Numpress non-float64 data!"); } if bytestring.is_empty() { - return base64_simd::STANDARD.encode_type::(&bytestring) + return base64_simd::STANDARD.encode_type::(&bytestring); } let compressed = Self::compress_numpress_linear(bytemuck::cast_slice(&bytestring)).unwrap(); @@ -234,11 +233,13 @@ impl<'transient, 'lifespan: 'transient> DataArray { BinaryCompressionType::NumpressSLOF => { let compressed = match self.dtype { BinaryDataArrayType::Float32 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } BinaryDataArrayType::Float64 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } _ => { panic!("Cannot Numpress non-float data!"); } @@ -252,7 +253,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { } if bytestring.is_empty() { let compressed = Self::compress_zlib(&bytestring); - return base64_simd::STANDARD.encode_type::(&compressed) + return base64_simd::STANDARD.encode_type::(&compressed); } let compressed = Self::compress_numpress_linear(bytemuck::cast_slice(&bytestring)) .inspect_err(|e| { @@ -268,30 +269,34 @@ impl<'transient, 'lifespan: 'transient> DataArray { panic!("Cannot Numpress non-float64 data!"); } if bytestring.is_empty() { - let compressed = Self::compress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); - return base64_simd::STANDARD.encode_type::(&compressed) + let compressed = + Self::compress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); + return base64_simd::STANDARD.encode_type::(&compressed); } let compressed = Self::compress_numpress_linear(bytemuck::cast_slice(&bytestring)) .inspect_err(|e| { log::error!("Failed to compress buffer with numpress: {e}"); }) .unwrap(); - let compressed = Self::compress_zstd(&compressed, BinaryDataArrayType::Unknown, false); + let compressed = + Self::compress_zstd(&compressed, BinaryDataArrayType::Unknown, false); base64_simd::STANDARD.encode_type::(&compressed) } #[cfg(feature = "numpress")] BinaryCompressionType::NumpressSLOFZlib => { if bytestring.is_empty() { let bytestring = Self::compress_zlib(&bytestring); - return base64_simd::STANDARD.encode_type::(&bytestring) + return base64_simd::STANDARD.encode_type::(&bytestring); } let compressed = match self.dtype { BinaryDataArrayType::Float32 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } BinaryDataArrayType::Float64 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } _ => { panic!("Cannot Numpress non-float data!"); } @@ -302,21 +307,25 @@ impl<'transient, 'lifespan: 'transient> DataArray { #[cfg(all(feature = "numpress", feature = "zstd"))] BinaryCompressionType::NumpressSLOFZstd => { if bytestring.is_empty() { - let bytestring = Self::compress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); - return base64_simd::STANDARD.encode_type::(&bytestring) + let bytestring = + Self::compress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); + return base64_simd::STANDARD.encode_type::(&bytestring); } let compressed = match self.dtype { BinaryDataArrayType::Float32 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } BinaryDataArrayType::Float64 => { - Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)).unwrap() - }, + Self::compress_numpress_slof(bytemuck::cast_slice::(&bytestring)) + .unwrap() + } _ => { panic!("Cannot Numpress non-float data!"); } }; - let bytestring = Self::compress_zstd(&compressed, BinaryDataArrayType::Unknown, false); + let bytestring = + Self::compress_zstd(&compressed, BinaryDataArrayType::Unknown, false); base64_simd::STANDARD.encode_type::(&bytestring) } #[cfg(feature = "zstd")] @@ -376,7 +385,9 @@ impl<'transient, 'lifespan: 'transient> DataArray { } #[cfg(feature = "numpress")] - pub fn compress_numpress_slof(data: &[T]) -> Result { + pub fn compress_numpress_slof( + data: &[T], + ) -> Result { let scaling = numpress::optimal_slof_fixed_point(data); let mut buf = Bytes::new(); match numpress::encode_slof(data, &mut buf, scaling) { @@ -388,7 +399,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { #[cfg(feature = "numpress")] pub fn decompress_numpress_linear(data: &[u8]) -> Result, ArrayRetrievalError> { if data.is_empty() { - return Ok(Vec::new()) + return Ok(Vec::new()); } match numpress::numpress_decompress(data) { Ok(data) => Ok(data), @@ -397,7 +408,10 @@ impl<'transient, 'lifespan: 'transient> DataArray { } #[cfg(feature = "numpress")] - pub fn decompress_numpress_slof(data: &[u8], dtype: BinaryDataArrayType) -> Result, ArrayRetrievalError> { + pub fn decompress_numpress_slof( + data: &[u8], + dtype: BinaryDataArrayType, + ) -> Result, ArrayRetrievalError> { use log::trace; let mut buf = Vec::new(); @@ -410,7 +424,7 @@ impl<'transient, 'lifespan: 'transient> DataArray { BinaryDataArrayType::Float64 => { let view = vec_as_bytes(decoded); Ok(Cow::Owned(view)) - }, + } BinaryDataArrayType::Float32 => { let n = decoded.len() * BinaryDataArrayType::Float32.size_of(); trace!("Mapping to {n} bytes for f32 storage"); @@ -420,14 +434,11 @@ impl<'transient, 'lifespan: 'transient> DataArray { view.extend(bytemuck::bytes_of(&val)) } Ok(Cow::Owned(view)) - }, - _ => { - Err(ArrayRetrievalError::DecompressionError( - BinaryCompressionType::NumpressSLOF.unsupported_msg(Some( - format!("Not compatible with {:?}", dtype).as_str(), - )), - )) } + _ => Err(ArrayRetrievalError::DecompressionError( + BinaryCompressionType::NumpressSLOF + .unsupported_msg(Some(format!("Not compatible with {:?}", dtype).as_str())), + )), } } @@ -514,36 +525,31 @@ impl<'transient, 'lifespan: 'transient> DataArray { match dtype { BinaryDataArrayType::Float64 => { let compressed = - dictionary_encoding(bytemuck::cast_slice::(&bytestring)) - .unwrap(); + dictionary_encoding(bytemuck::cast_slice::(&bytestring)).unwrap(); let compressed = Self::compress_zstd(&compressed, dtype, false); compressed } BinaryDataArrayType::Float32 => { let compressed = - dictionary_encoding(bytemuck::cast_slice::(&bytestring)) - .unwrap(); + dictionary_encoding(bytemuck::cast_slice::(&bytestring)).unwrap(); let compressed = Self::compress_zstd(&compressed, dtype, false); compressed } BinaryDataArrayType::Int64 => { let compressed = - dictionary_encoding(bytemuck::cast_slice::(&bytestring)) - .unwrap(); + dictionary_encoding(bytemuck::cast_slice::(&bytestring)).unwrap(); let compressed = Self::compress_zstd(&compressed, dtype, false); compressed } BinaryDataArrayType::Int32 => { let compressed = - dictionary_encoding(bytemuck::cast_slice::(&bytestring)) - .unwrap(); + dictionary_encoding(bytemuck::cast_slice::(&bytestring)).unwrap(); let compressed = Self::compress_zstd(&compressed, dtype, false); compressed } _ => { let compressed = - dictionary_encoding(bytemuck::cast_slice::(&bytestring)) - .unwrap(); + dictionary_encoding(bytemuck::cast_slice::(&bytestring)).unwrap(); let compressed = Self::compress_zstd(&compressed, dtype, false); compressed } @@ -607,19 +613,13 @@ impl<'transient, 'lifespan: 'transient> DataArray { let data = Self::decompress_zstd(bytestring, dtype, false); match dtype { - BinaryDataArrayType::ASCII | BinaryDataArrayType::Unknown => dictionary_decoding(&data).unwrap(), - BinaryDataArrayType::Float64 => { - to_bytes(&dictionary_decoding::(&data).unwrap()) - }, - BinaryDataArrayType::Float32 => { - to_bytes(&dictionary_decoding::(&data).unwrap()) - }, - BinaryDataArrayType::Int64 => { - to_bytes(&dictionary_decoding::(&data).unwrap()) - }, - BinaryDataArrayType::Int32 => { - to_bytes(&dictionary_decoding::(&data).unwrap()) - }, + BinaryDataArrayType::ASCII | BinaryDataArrayType::Unknown => { + dictionary_decoding(&data).unwrap() + } + BinaryDataArrayType::Float64 => to_bytes(&dictionary_decoding::(&data).unwrap()), + BinaryDataArrayType::Float32 => to_bytes(&dictionary_decoding::(&data).unwrap()), + BinaryDataArrayType::Int64 => to_bytes(&dictionary_decoding::(&data).unwrap()), + BinaryDataArrayType::Int32 => to_bytes(&dictionary_decoding::(&data).unwrap()), } } @@ -759,11 +759,8 @@ impl<'transient, 'lifespan: 'transient> DataArray { BinaryCompressionType::NumpressLinearZstd => match self.dtype { BinaryDataArrayType::Float64 => { let bytestring = base64_decode!(); - let bytestring = Self::decompress_zstd( - &bytestring, - BinaryDataArrayType::Unknown, - false, - ); + let bytestring = + Self::decompress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); let decoded = Self::decompress_numpress_linear(&bytestring)?; let view = vec_as_bytes(decoded); Ok(Cow::Owned(view)) @@ -778,7 +775,8 @@ impl<'transient, 'lifespan: 'transient> DataArray { #[cfg(all(feature = "numpress", feature = "zstd"))] BinaryCompressionType::NumpressSLOFZstd => { let bytestring = base64_decode!(); - let bytestring = Self::decompress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); + let bytestring = + Self::decompress_zstd(&bytestring, BinaryDataArrayType::Unknown, false); Self::decompress_numpress_slof(&bytestring, self.dtype) } @@ -794,14 +792,12 @@ impl<'transient, 'lifespan: 'transient> DataArray { start: usize, end: usize, ) -> Result, ArrayRetrievalError> { - if start > end || (end - start) % self.dtype.size_of() != 0 { + if start > end || !(end - start).is_multiple_of(self.dtype.size_of()) { return Err(ArrayRetrievalError::DataTypeSizeMismatch); } match self.compression { BinaryCompressionType::Decoded => Ok(Cow::Borrowed(&self.data.as_slice()[start..end])), - _ => { - Ok(Cow::Owned(self.decode()?[start..end].to_vec())) - } + _ => Ok(Cow::Owned(self.decode()?[start..end].to_vec())), } } @@ -810,17 +806,14 @@ impl<'transient, 'lifespan: 'transient> DataArray { Ok(&mut self.data) } else { match self.decode()? { - Cow::Borrowed(_) => { - Ok(&mut self.data) - }, + Cow::Borrowed(_) => Ok(&mut self.data), Cow::Owned(owned) => { self.data = owned; self.compression = BinaryCompressionType::Decoded; Ok(&mut self.data) - }, + } } } - } pub fn clear(&mut self) { @@ -1029,7 +1022,11 @@ mod test { let mut buf = String::new(); fh.read_to_string(&mut buf)?; let bytes: Vec = buf.into(); - let mut da = DataArray::wrap(&ArrayType::MeanInverseReducedIonMobilityArray, BinaryDataArrayType::Float64, bytes); + let mut da = DataArray::wrap( + &ArrayType::MeanInverseReducedIonMobilityArray, + BinaryDataArrayType::Float64, + bytes, + ); da.compression = BinaryCompressionType::Zstd; *da.unit_mut() = Unit::VoltSecondPerSquareCentimeter; assert_eq!(da.unit(), Unit::VoltSecondPerSquareCentimeter); @@ -1093,7 +1090,9 @@ mod test { da.store_compressed(BinaryCompressionType::DeltaShuffleZstd) .unwrap(); let delta_zstd_len = da.data.len(); - eprintln!("decoded: {decoded_len};\nzlib: {zlib_len};\nzstd: {zstd_len};\ndelta-zstd: {delta_zstd_len}"); + eprintln!( + "decoded: {decoded_len};\nzlib: {zlib_len};\nzstd: {zstd_len};\ndelta-zstd: {delta_zstd_len}" + ); da.decode_and_store().unwrap(); let view = da.to_f64().unwrap(); let err: f64 = points @@ -1148,7 +1147,11 @@ mod test { let mut da_ref = make_array_from_file()?; da_ref.decode_and_store()?; for (a, b) in da.iter_f64()?.zip(da_ref.iter_f64()?) { - assert!((a - b).abs() < 1e-3, "{a} - {b} = {} which is too large a deviation", (a - b).abs()) + assert!( + (a - b).abs() < 1e-3, + "{a} - {b} = {} which is too large a deviation", + (a - b).abs() + ) } Ok(()) @@ -1185,7 +1188,6 @@ mod test { assert_eq!(da.to_f64().unwrap().len(), 0); } - #[cfg(feature = "zstd")] #[test] fn test_dict_from_base64() -> io::Result<()> { diff --git a/src/spectrum/bindata/conversion.rs b/src/spectrum/bindata/conversion.rs index 1b337ed..d39c60c 100644 --- a/src/spectrum/bindata/conversion.rs +++ b/src/spectrum/bindata/conversion.rs @@ -1,20 +1,22 @@ use std::{collections::HashSet, convert::TryInto, mem}; use mzpeaks::{ - prelude::*, + CentroidLike, CentroidPeak, CoordinateLike, DeconvolutedPeak, DeconvolutedPeakSet, IonMobility, + MZ, MZPeakSetType, Mass, PeakSet, feature::{ChargedFeature, Feature}, - CentroidLike, CentroidPeak, CoordinateLike, DeconvolutedPeak, DeconvolutedPeakSet, - IonMobility,MZPeakSetType, Mass, PeakSet, - MZ, + prelude::*, }; -use crate::{params::Unit, utils::{mass_charge_ratio, neutral_mass}}; +use crate::{ + params::Unit, + utils::{mass_charge_ratio, neutral_mass}, +}; use super::{ + BinaryArrayMap3D, ByteArrayView, array::DataArray, encodings::{ArrayRetrievalError, ArrayType, BinaryCompressionType, BinaryDataArrayType}, map::BinaryArrayMap, - BinaryArrayMap3D, ByteArrayView, }; impl From<&PeakSet> for BinaryArrayMap { @@ -645,10 +647,10 @@ impl BuildFromArrayMap3D for Feature { if arr.is_empty() { continue; } - if let Some(arr) = arr.get(&key) { - if let Some(i) = arr.iter_i32()?.map(|i| i as usize).max() { - n = n.max(i); - } + if let Some(arr) = arr.get(&key) + && let Some(i) = arr.iter_i32()?.map(|i| i as usize).max() + { + n = n.max(i); } } @@ -694,10 +696,10 @@ impl BuildFromArrayMap3D for ChargedFeature { if arr.is_empty() { continue; } - if let Some(arr) = arr.get(&key) { - if let Some(i) = arr.iter_i32()?.map(|i| i as usize).max() { - n = n.max(i); - } + if let Some(arr) = arr.get(&key) + && let Some(i) = arr.iter_i32()?.map(|i| i as usize).max() + { + n = n.max(i); } } diff --git a/src/spectrum/bindata/encodings.rs b/src/spectrum/bindata/encodings.rs index 8d8e3c4..672d5c9 100644 --- a/src/spectrum/bindata/encodings.rs +++ b/src/spectrum/bindata/encodings.rs @@ -11,8 +11,8 @@ use num_traits::Num; use numpress; use crate::{ - params::{ControlledVocabulary, ParamCow, Unit, CURIE}, Param, + params::{CURIE, ControlledVocabulary, ParamCow, Unit}, }; pub type Bytes = Vec; @@ -1312,7 +1312,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } BinaryCompressionType::NumpressLinearZstd => { return Some(ParamCow::const_new( @@ -1321,7 +1321,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } BinaryCompressionType::ZstdDict => { return Some(ParamCow::const_new( @@ -1330,7 +1330,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } BinaryCompressionType::Zstd => { return Some(ParamCow::const_new( @@ -1339,7 +1339,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } BinaryCompressionType::ShuffleZstd => { return Some(ParamCow::const_new( @@ -1348,7 +1348,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } BinaryCompressionType::DeltaShuffleZstd => { return Some(ParamCow::const_new( @@ -1357,7 +1357,7 @@ impl BinaryCompressionType { self.accession(), Some(ControlledVocabulary::MS), Unit::Unknown, - )) + )); } }; Some( diff --git a/src/spectrum/bindata/map.rs b/src/spectrum/bindata/map.rs index 2d68ae3..1bac983 100644 --- a/src/spectrum/bindata/map.rs +++ b/src/spectrum/bindata/map.rs @@ -1,7 +1,7 @@ use std::borrow::Cow; use std::cmp::Ordering; -use std::collections::hash_map::{Iter, IterMut}; use std::collections::HashMap; +use std::collections::hash_map::{Iter, IterMut}; use std::convert::TryFrom; #[cfg(feature = "parallelism")] @@ -11,10 +11,10 @@ use mzpeaks::Tolerance; use crate::params::Unit; +use super::BinaryDataArrayType; use super::array::DataArray; use super::encodings::{ArrayRetrievalError, ArrayType, BinaryCompressionType}; use super::traits::{ByteArrayView, ByteArrayViewMut}; -use super::BinaryDataArrayType; /// A collection of [`DataArray`]s that are identified by name. #[derive(Debug, Default, Clone)] @@ -656,57 +656,57 @@ impl BinaryArrayMap3D { while current_mz <= max_mz { let mut next_mz = f64::INFINITY; for (bin_i, (im, layer)) in self.iter().enumerate() { - if let Some(i) = indices.get(bin_i).copied() { - if let Some(mz) = mz_axes[bin_i].get(i).copied() { - if (mz - current_mz).abs() < 1e-12 { - n_points_added += 1; - destination - .get_mut(&ArrayType::MZArray) - .as_mut() - .unwrap() - .push(mz)?; - destination - .get_mut(&self.ion_mobility_type) - .as_mut() - .unwrap() - .push(im)?; - for (key, array) in layer.iter() { - if *key == ArrayType::MZArray { - continue; + if let Some(i) = indices.get(bin_i).copied() + && let Some(mz) = mz_axes[bin_i].get(i).copied() + { + if (mz - current_mz).abs() < 1e-12 { + n_points_added += 1; + destination + .get_mut(&ArrayType::MZArray) + .as_mut() + .unwrap() + .push(mz)?; + destination + .get_mut(&self.ion_mobility_type) + .as_mut() + .unwrap() + .push(im)?; + for (key, array) in layer.iter() { + if *key == ArrayType::MZArray { + continue; + } + match array.dtype() { + BinaryDataArrayType::Unknown => { + panic!("Cannot re-sort opaque or unknown dimension data types") } - match array.dtype() { - BinaryDataArrayType::Unknown => panic!( - "Cannot re-sort opaque or unknown dimension data types" - ), - BinaryDataArrayType::ASCII => { - let val = array.decode()?[i]; - destination.get_mut(key).as_mut().unwrap().push(val)?; - } - BinaryDataArrayType::Float64 => { - let val = array.to_f64()?[i]; - destination.get_mut(key).as_mut().unwrap().push(val)?; - } - BinaryDataArrayType::Float32 => { - let val = array.to_f32()?[i]; - destination.get_mut(key).as_mut().unwrap().push(val)?; - } - BinaryDataArrayType::Int64 => { - let val = array.to_i64()?[i]; - destination.get_mut(key).as_mut().unwrap().push(val)?; - } - BinaryDataArrayType::Int32 => { - let val = array.to_i32()?[i]; - destination.get_mut(key).as_mut().unwrap().push(val)?; - } + BinaryDataArrayType::ASCII => { + let val = array.decode()?[i]; + destination.get_mut(key).as_mut().unwrap().push(val)?; + } + BinaryDataArrayType::Float64 => { + let val = array.to_f64()?[i]; + destination.get_mut(key).as_mut().unwrap().push(val)?; + } + BinaryDataArrayType::Float32 => { + let val = array.to_f32()?[i]; + destination.get_mut(key).as_mut().unwrap().push(val)?; + } + BinaryDataArrayType::Int64 => { + let val = array.to_i64()?[i]; + destination.get_mut(key).as_mut().unwrap().push(val)?; + } + BinaryDataArrayType::Int32 => { + let val = array.to_i32()?[i]; + destination.get_mut(key).as_mut().unwrap().push(val)?; } } - indices[bin_i] += 1; - if let Some(mz) = mz_axes[bin_i].get(i + 1).copied() { - next_mz = mz.min(next_mz); - } - } else if mz > current_mz { + } + indices[bin_i] += 1; + if let Some(mz) = mz_axes[bin_i].get(i + 1).copied() { next_mz = mz.min(next_mz); } + } else if mz > current_mz { + next_mz = mz.min(next_mz); } } } @@ -716,7 +716,8 @@ impl BinaryArrayMap3D { debug_assert_eq!( n_points_added, total_points, - "Expected to have unstacked {total_points} from {} arrays, got {n_points_added} instead", mz_axes.len() + "Expected to have unstacked {total_points} from {} arrays, got {n_points_added} instead", + mz_axes.len() ); Ok(destination) @@ -875,7 +876,9 @@ mod test { "test/data/20200204_BU_8B8egg_1ug_uL_7charges_60_min_Slot2-11_1_244.mzML.gz", )?))?; - let spec = reader.get_spectrum_by_id("merged=42869 frame=9717 scanStart=1 scanEnd=705").unwrap(); + let spec = reader + .get_spectrum_by_id("merged=42869 frame=9717 scanStart=1 scanEnd=705") + .unwrap(); let mut arrays = spec.arrays.unwrap(); let mzs = arrays.mzs()?; assert!(!mzs.is_sorted()); diff --git a/src/spectrum/bindata/traits.rs b/src/spectrum/bindata/traits.rs index 311a490..95c3a82 100644 --- a/src/spectrum/bindata/traits.rs +++ b/src/spectrum/bindata/traits.rs @@ -1,15 +1,14 @@ +use std::borrow::Cow; use std::marker::PhantomData; -use std::slice; use std::mem; -use std::borrow::Cow; +use std::slice; +use crate::params::Unit; use bytemuck::Pod; use num_traits::{AsPrimitive, Num}; -use crate::params::Unit; -use super::encodings::{ArrayRetrievalError, BinaryDataArrayType, Bytes}; use super::ArrayType; - +use super::encodings::{ArrayRetrievalError, BinaryDataArrayType, Bytes}; pub trait ByteArrayView<'transient, 'lifespan: 'transient> { fn view(&'lifespan self) -> Result, ArrayRetrievalError>; @@ -19,16 +18,14 @@ pub trait ByteArrayView<'transient, 'lifespan: 'transient> { ) -> Result, ArrayRetrievalError> { let n = buffer.len(); if n == 0 { - return Ok(Cow::Owned(Vec::new())) + return Ok(Cow::Owned(Vec::new())); } let z = mem::size_of::(); - if n % z != 0 { + if !n.is_multiple_of(z) { return Err(ArrayRetrievalError::DataTypeSizeMismatch); } match buffer { - Cow::Borrowed(c) => { - Ok(Cow::Borrowed(bytemuck::try_cast_slice(c)?)) - }, + Cow::Borrowed(c) => Ok(Cow::Borrowed(bytemuck::try_cast_slice(c)?)), Cow::Owned(v) => { let size_type = n / z; let mut buf = Vec::with_capacity(size_type); @@ -37,13 +34,11 @@ pub trait ByteArrayView<'transient, 'lifespan: 'transient> { Ok::<(), bytemuck::PodCastError>(()) })?; Ok(Cow::Owned(buf)) - }, + } } } - fn coerce( - &'lifespan self, - ) -> Result, ArrayRetrievalError> { + fn coerce(&'lifespan self) -> Result, ArrayRetrievalError> { match self.view() { Ok(data) => Self::coerce_from(data), Err(err) => Err(err), @@ -55,17 +50,13 @@ pub trait ByteArrayView<'transient, 'lifespan: 'transient> { &'lifespan self, ) -> Result, ArrayRetrievalError> { match self.coerce::() { - Ok(view) => { - match view { - Cow::Borrowed(view) => { - Ok(Cow::Owned(view.iter().map(|a| a.as_()).collect())) - } - Cow::Owned(owned) => { - let res = owned.iter().map(|a| a.as_()).collect(); - Ok(Cow::Owned(res)) - } + Ok(view) => match view { + Cow::Borrowed(view) => Ok(Cow::Owned(view.iter().map(|a| a.as_()).collect())), + Cow::Owned(owned) => { + let res = owned.iter().map(|a| a.as_()).collect(); + Ok(Cow::Owned(res)) } - } + }, Err(err) => Err(err), } } @@ -171,7 +162,9 @@ pub trait ByteArrayView<'transient, 'lifespan: 'transient> { Ok(n / self.dtype().size_of()) } - fn iter_type(&'lifespan self) -> Result, ArrayRetrievalError> { + fn iter_type( + &'lifespan self, + ) -> Result, ArrayRetrievalError> { Ok(DataSliceIter::new(self.view()?)) } @@ -199,7 +192,6 @@ pub trait ByteArrayView<'transient, 'lifespan: 'transient> { pub trait ByteArrayViewMut<'transient, 'lifespan: 'transient>: ByteArrayView<'transient, 'lifespan> { - /// Specify the unit of the data array fn unit_mut(&mut self) -> &mut Unit; @@ -213,10 +205,10 @@ pub trait ByteArrayViewMut<'transient, 'lifespan: 'transient>: ) -> Result<&'transient mut [T], ArrayRetrievalError> { let n = buffer.len(); if n == 0 { - return Ok(&mut []) + return Ok(&mut []); } let z = mem::size_of::(); - if n % z != 0 { + if !n.is_multiple_of(z) { return Err(ArrayRetrievalError::DataTypeSizeMismatch); } let m = n / z; @@ -239,7 +231,7 @@ pub trait ByteArrayViewMut<'transient, 'lifespan: 'transient>: pub struct DataSliceIter<'a, T: Pod> { buffer: Cow<'a, [u8]>, i: usize, - _t: PhantomData + _t: PhantomData, } impl ExactSizeIterator for DataSliceIter<'_, T> { @@ -251,7 +243,11 @@ impl ExactSizeIterator for DataSliceIter<'_, T> { impl<'a, T: Pod> DataSliceIter<'a, T> { pub fn new(buffer: Cow<'a, [u8]>) -> Self { - Self { buffer, i: 0, _t: PhantomData } + Self { + buffer, + i: 0, + _t: PhantomData, + } } pub fn next_value(&mut self) -> Option { @@ -273,4 +269,4 @@ impl Iterator for DataSliceIter<'_, T> { fn next(&mut self) -> Option { self.next_value() } -} \ No newline at end of file +} diff --git a/src/spectrum/chromatogram.rs b/src/spectrum/chromatogram.rs index 5a43100..1d437a4 100644 --- a/src/spectrum/chromatogram.rs +++ b/src/spectrum/chromatogram.rs @@ -5,7 +5,7 @@ use crate::params::{Param, ParamDescribed}; use crate::spectrum::scan_properties::{ ChromatogramDescription, ChromatogramType, Precursor, ScanPolarity, }; -use mzpeaks::coordinate::{Time, MZ}; +use mzpeaks::coordinate::{MZ, Time}; use mzpeaks::feature::{FeatureView, SimpleFeature, TimeInterval}; #[derive(Debug, Default, Clone)] @@ -32,12 +32,12 @@ macro_rules! as_feature_view { #[allow(unused)] pub(crate) fn as_simple_feature(chromatogram: &Chromatogram) -> Option> { - if let Ok(t) = chromatogram.time() { - if let Ok(i) = chromatogram.intensity() { - let mut f = SimpleFeature::::empty(0.0); - f.extend(t.iter().zip(i.iter()).map(|(y, z)| (0.0f64, *y, *z))); - return Some(f); - } + if let Ok(t) = chromatogram.time() + && let Ok(i) = chromatogram.intensity() + { + let mut f = SimpleFeature::::empty(0.0); + f.extend(t.iter().zip(i.iter()).map(|(y, z)| (0.0f64, *y, *z))); + return Some(f); } None } @@ -81,7 +81,6 @@ impl TimeInterval