From 0d0edd7917faccc6fd5536f5492a2ab8d1cd7f1e Mon Sep 17 00:00:00 2001 From: nym21 Date: Tue, 4 Mar 2025 12:29:19 +0100 Subject: [PATCH] global: snapshot + core: impl Display for bytes structs --- Cargo.lock | 212 ++++++++------- Cargo.toml | 4 +- crates/brk/src/lib.rs | 1 + crates/brk_cli/src/query.rs | 13 +- crates/brk_cli/src/run.rs | 67 +++-- crates/brk_computer/{src => examples}/main.rs | 8 +- crates/brk_computer/src/lib.rs | 16 +- crates/brk_core/Cargo.toml | 2 +- crates/brk_core/src/lib.rs | 1 + crates/brk_core/src/structs/addressbytes.rs | 254 ++++++++++++++++-- crates/brk_core/src/structs/blockhash.rs | 28 +- crates/brk_core/src/structs/date.rs | 24 +- crates/brk_core/src/structs/txid.rs | 28 +- crates/brk_exit/src/lib.rs | 1 + crates/brk_fetcher/{src => examples}/main.rs | 6 +- crates/brk_fetcher/src/fetchers/kibo.rs | 25 +- crates/brk_fetcher/src/fetchers/retry.rs | 7 +- crates/brk_fetcher/src/lib.rs | 10 +- crates/brk_indexer/{src => examples}/main.rs | 6 +- crates/brk_indexer/src/lib.rs | 72 +++-- crates/brk_logger/{src => examples}/main.rs | 0 crates/brk_logger/src/lib.rs | 27 +- crates/brk_parser/examples/main.rs | 58 ++++ crates/brk_parser/src/lib.rs | 62 +++-- crates/brk_parser/src/main.rs | 32 --- crates/brk_query/{src => examples}/main.rs | 4 +- crates/brk_query/src/index.rs | 33 +-- crates/brk_query/src/lib.rs | 29 +- crates/brk_query/src/params.rs | 2 +- crates/brk_server/Cargo.toml | 2 +- crates/brk_server/{src => examples}/main.rs | 12 +- crates/brk_server/src/lib.rs | 9 +- crates/brk_vec/{src => examples}/main.rs | 0 crates/brk_vec/src/lib.rs | 55 +++- publish.sh | 2 +- rustfmt.toml | 1 - 36 files changed, 782 insertions(+), 331 deletions(-) rename crates/brk_computer/{src => examples}/main.rs (81%) rename crates/brk_fetcher/{src => examples}/main.rs (67%) rename crates/brk_indexer/{src => examples}/main.rs (87%) rename crates/brk_logger/{src => examples}/main.rs (100%) create mode 100644 crates/brk_parser/examples/main.rs delete mode 100644 crates/brk_parser/src/main.rs rename crates/brk_query/{src => examples}/main.rs (81%) rename crates/brk_server/{src => examples}/main.rs (83%) rename crates/brk_vec/{src => examples}/main.rs (100%) delete mode 100644 rustfmt.toml diff --git a/Cargo.lock b/Cargo.lock index 3f4aaaf69..ace16593b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -324,7 +324,7 @@ checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "brk" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_computer", "brk_core", @@ -340,7 +340,7 @@ dependencies = [ [[package]] name = "brk_cli" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_computer", "brk_exit", @@ -359,7 +359,7 @@ dependencies = [ [[package]] name = "brk_computer" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_core", "brk_exit", @@ -373,7 +373,7 @@ dependencies = [ [[package]] name = "brk_core" -version = "0.0.4" +version = "0.0.6" dependencies = [ "bitcoin", "bitcoincore-rpc", @@ -390,7 +390,7 @@ dependencies = [ [[package]] name = "brk_exit" -version = "0.0.4" +version = "0.0.6" dependencies = [ "ctrlc", "log", @@ -398,7 +398,7 @@ dependencies = [ [[package]] name = "brk_fetcher" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_core", "brk_logger", @@ -411,7 +411,7 @@ dependencies = [ [[package]] name = "brk_indexer" -version = "0.0.4" +version = "0.0.6" dependencies = [ "bitcoin", "bitcoincore-rpc", @@ -430,7 +430,7 @@ dependencies = [ [[package]] name = "brk_logger" -version = "0.0.4" +version = "0.0.6" dependencies = [ "color-eyre", "env_logger", @@ -439,7 +439,7 @@ dependencies = [ [[package]] name = "brk_parser" -version = "0.0.4" +version = "0.0.6" dependencies = [ "bitcoin", "bitcoincore-rpc", @@ -454,7 +454,7 @@ dependencies = [ [[package]] name = "brk_query" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_computer", "brk_indexer", @@ -469,7 +469,7 @@ dependencies = [ [[package]] name = "brk_server" -version = "0.0.4" +version = "0.0.6" dependencies = [ "axum", "brk_computer", @@ -490,7 +490,7 @@ dependencies = [ [[package]] name = "brk_vec" -version = "0.0.4" +version = "0.0.6" dependencies = [ "brk_exit", "memmap2", @@ -617,7 +617,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -816,7 +816,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1068,9 +1068,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1161,9 +1161,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jiff" @@ -1431,9 +1431,9 @@ checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" [[package]] name = "oxc" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "691141bf0b572018b65456ca183507ff06cc50d9d90a4d48132b764d32c95527" +checksum = "24855da39b565013176401474f89408479b6086f81bc0d670e3a318bc985b158" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1458,7 +1458,7 @@ dependencies = [ "oxc-miette-derive", "textwrap", "thiserror", - "unicode-width 0.2.0", + "unicode-width", ] [[package]] @@ -1469,14 +1469,14 @@ checksum = "e21f680e8c5f1900297d394627d495351b9e37761f7bbf90116bd5eeb6e80967" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "oxc_allocator" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9c94c4b7eca262bed12a600ae43fdc7546081755af321de79821acd3c5e45" +checksum = "b18e24923867bc335264d0ee98b60263dabd50ff19983d781f6a5ce0ca964429" dependencies = [ "allocator-api2", "bumpalo", @@ -1487,13 +1487,12 @@ dependencies = [ [[package]] name = "oxc_ast" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e5af333869e3c080f8c9b15aa78d27071c8ca7eee8a86ad0a32eefd9a1ba1e" +checksum = "ded17501d4e1535e765d2e5cadf28cad03ec87d39931d1481b9e34f733b98474" dependencies = [ "bitflags", "cow-utils", - "nonmax", "oxc_allocator", "oxc_ast_macros", "oxc_estree", @@ -1504,20 +1503,32 @@ dependencies = [ [[package]] name = "oxc_ast_macros" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eca883d41a92aa68620385a28bbc6d016221982e7d22c4120fd1a7ffcb9be8b" +checksum = "ade1cdc274922b8246436c8722afb70d07bf18d4b126354a21cbca1796dab041" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", +] + +[[package]] +name = "oxc_ast_visit" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1222c2d9e93ee199bb4f9919c3d8a99c5ffe8db2a3a9e67fa0c4f5c54634d5f4" +dependencies = [ + "oxc_allocator", + "oxc_ast", + "oxc_span", + "oxc_syntax", ] [[package]] name = "oxc_cfg" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "768c0e8e0cd1ff280c39b5d291fab9937419a70bc9964cc1c4fe7e57541fbdd9" +checksum = "8a8980b4c13c150ca80e9896392db78cd5d2c250675fcfa4c8d89972dfa60126" dependencies = [ "bitflags", "itertools", @@ -1530,9 +1541,9 @@ dependencies = [ [[package]] name = "oxc_codegen" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf00ecbc5cc550a9fe34aff598ea826e7c8fbb4f988f6fe08bd5521bdd4b6c" +checksum = "187c5ab8a0a7f6e2ea4da99f0bc22645133ff0192f6385561e7050d04796c4a4" dependencies = [ "bitflags", "cow-utils", @@ -1551,9 +1562,9 @@ dependencies = [ [[package]] name = "oxc_data_structures" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9268d8b0aefbc7d7c175e673c34f8b1be450f5e0af838ec3a2d5224fd116bb" +checksum = "59020f1b37242b5041cb039898c0234f22ebe193910622968552353d74ed885e" dependencies = [ "assert-unchecked", "ropey", @@ -1561,9 +1572,9 @@ dependencies = [ [[package]] name = "oxc_diagnostics" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9549fb1a8f37c4e5fa61fadcaf439402e9c1541d3442987594e9d173389443" +checksum = "aa9d41fe75156b30adcfbce4cba8b7e3316c1e650da0c90f90cd1923980d4de5" dependencies = [ "cow-utils", "oxc-miette", @@ -1571,9 +1582,9 @@ dependencies = [ [[package]] name = "oxc_ecmascript" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833da37fb0dcf12e58f2380dadade222c5b5caf2494f6ed0b4355f74af46d453" +checksum = "ea8a969324e2fb6ba5c48f1f48125ef283df9aa66c69a6a9f88ce66c2017d0fb" dependencies = [ "cow-utils", "num-bigint", @@ -1585,9 +1596,9 @@ dependencies = [ [[package]] name = "oxc_estree" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb42f17f05b19f20edfef46916e62bdd03ecde89dc06e131b27adc715c19e1dc" +checksum = "4dbd7bb1b12e006fd02c7d61a1aece96e4c6336c9b9e8d568ad5f6dfd4c315c2" [[package]] name = "oxc_index" @@ -1597,9 +1608,9 @@ checksum = "2fa07b0cfa997730afed43705766ef27792873fdf5215b1391949fec678d2392" [[package]] name = "oxc_mangler" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1718e6788566d0d7d72596526c4e8c9b666939fa8b1948914a90a3122fe835" +checksum = "6a297a0c747bb800bf6ac05fd5c281cf045d9cd7b65b5f7c212f65834b85fac9" dependencies = [ "fixedbitset", "itertools", @@ -1613,13 +1624,14 @@ dependencies = [ [[package]] name = "oxc_minifier" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "358a1f68e7f76062ba3c53f140d52d50d34dfdeb53e5e7bbffdd8c19eb212b3f" +checksum = "52fa721e44be1eb5e1231cccce0d1e03aba06e3515d59107608cb23498ce9fad" dependencies = [ "cow-utils", "oxc_allocator", "oxc_ast", + "oxc_ast_visit", "oxc_codegen", "oxc_data_structures", "oxc_ecmascript", @@ -1634,9 +1646,9 @@ dependencies = [ [[package]] name = "oxc_parser" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416b26d59eb0c273239620de864c21f2bbfd098510dff92af554e2a0a464b70d" +checksum = "1bc8294a24383bcb7f518604769b07915a14c21b53077725a272736ef90b3c99" dependencies = [ "assert-unchecked", "bitflags", @@ -1657,9 +1669,9 @@ dependencies = [ [[package]] name = "oxc_regular_expression" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "691d451203f63304fd68cacac3bbbcea6578a545e2681d761eee53b47cc2a8ce" +checksum = "e84b8e555281da67deac9b6a88d6f95e390f9fe692fa8f8a6868011076a2ee33" dependencies = [ "oxc_allocator", "oxc_ast_macros", @@ -1673,14 +1685,15 @@ dependencies = [ [[package]] name = "oxc_semantic" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d91a99031a2640eab43251d3108b129981c8dc049ded28d94378db929c140f" +checksum = "adb18fa7e368a33a54bd7dc4730de56cd8e26bca6cbffc3798811645e63f3a57" dependencies = [ "assert-unchecked", "itertools", "oxc_allocator", "oxc_ast", + "oxc_ast_visit", "oxc_cfg", "oxc_data_structures", "oxc_diagnostics", @@ -1695,9 +1708,9 @@ dependencies = [ [[package]] name = "oxc_sourcemap" -version = "2.0.2" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b84540840cb31eaea9548f93a271da369d69792bd7149bff1a44b0af9eb7a1" +checksum = "6665c417b2aa1c426a7b142bcc0d2f47d9fee9e6f88610f054cfa7ce6623001e" dependencies = [ "base64-simd", "cfg-if", @@ -1709,9 +1722,9 @@ dependencies = [ [[package]] name = "oxc_span" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf5c92fba70b2fe8e1a34f249447915338b5165c6a0f563ff9b14a99204d0ba3" +checksum = "704d1f7229aafcd1291dacd1d39927cd9fd77ac3c05e6edca32e25f52329dcd5" dependencies = [ "compact_str", "oxc-miette", @@ -1722,9 +1735,9 @@ dependencies = [ [[package]] name = "oxc_syntax" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1339878529f3a78b8b365d23e62a326dfc3dd21b4c128619105b83d2bc0cfbfb" +checksum = "2697e97541b2b8f8b95152ea00931d73b254bbcb2eb590192ebc4e76a7748d3f" dependencies = [ "assert-unchecked", "bitflags", @@ -1743,14 +1756,15 @@ dependencies = [ [[package]] name = "oxc_traverse" -version = "0.53.0" +version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b9a49b46d61f4fea58bdba8430bfbe82814c0fbdf4a291d6c57d3d9ffc5ee0" +checksum = "c70727b18b6e5b66d068e5e282a44674bf8dd72f39d9c503d665a0b61e9b5667" dependencies = [ "compact_str", "itoa", "oxc_allocator", "oxc_ast", + "oxc_ast_visit", "oxc_data_structures", "oxc_ecmascript", "oxc_semantic", @@ -1767,7 +1781,7 @@ checksum = "b915f831b85d984193fdc3d3611505871dc139b2534530fa01c1a6a6707b6723" dependencies = [ "bytecount", "fnv", - "unicode-width 0.2.0", + "unicode-width", ] [[package]] @@ -1857,7 +1871,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -1883,9 +1897,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" @@ -1930,14 +1944,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" dependencies = [ "unicode-ident", ] @@ -1954,9 +1968,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.38" +version = "1.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" dependencies = [ "proc-macro2", ] @@ -2019,9 +2033,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" dependencies = [ "bitflags", ] @@ -2137,15 +2151,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "ryu-js" @@ -2198,9 +2212,9 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "seq-macro" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" [[package]] name = "serde" @@ -2213,9 +2227,9 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "364fec0df39c49a083c9a8a18a23a6bcfd9af130fe9fe321d18520a0d113e09e" dependencies = [ "serde", ] @@ -2228,14 +2242,14 @@ checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2245,9 +2259,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -2369,9 +2383,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" dependencies = [ "proc-macro2", "quote", @@ -2404,7 +2418,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -2423,13 +2437,13 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -2449,7 +2463,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -2488,7 +2502,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -2635,9 +2649,9 @@ checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-linebreak" @@ -2645,12 +2659,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.0" @@ -2858,7 +2866,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] @@ -2869,7 +2877,7 @@ checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.99", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8ff81d4fc..80d45c372 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = ["crates/*"] package.description = "The Bitcoin Research Kit is a suite of tools designed to extract, compute and display data stored on a Bitcoin Core node" package.license = "MIT" package.edition = "2024" -package.version = "0.0.4" +package.version = "0.0.6" package.repository = "https://github.com/bitcoinresearchkit/brk" [workspace.dependencies] @@ -30,6 +30,6 @@ log = { version = "0.4.26" } minreq = { version = "2.13.2", features = ["https", "serde_json"] } rayon = "1.10.0" serde = { version = "1.0.218", features = ["derive"] } -serde_json = { version = "1.0.139", features = ["float_roundtrip"] } +serde_json = { version = "1.0.140", features = ["float_roundtrip"] } tabled = "0.18.0" zerocopy = { version = "0.8.21", features = ["derive"] } diff --git a/crates/brk/src/lib.rs b/crates/brk/src/lib.rs index 30046f602..c4ce77e1e 100644 --- a/crates/brk/src/lib.rs +++ b/crates/brk/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!(concat!("../", env!("CARGO_PKG_README")))] #[cfg(feature = "core")] diff --git a/crates/brk_cli/src/query.rs b/crates/brk_cli/src/query.rs index 1a39386e9..2ed28188d 100644 --- a/crates/brk_cli/src/query.rs +++ b/crates/brk_cli/src/query.rs @@ -8,15 +8,19 @@ use crate::run::RunConfig; pub fn query(params: QueryParams) -> color_eyre::Result<()> { let config = RunConfig::import(None)?; - let mut indexer = Indexer::new(&config.indexeddir())?; + let mut indexer = Indexer::new(config.indexeddir())?; indexer.import_vecs()?; - let mut computer = Computer::new(&config.computeddir()); + let mut computer = Computer::new(config.computeddir()); computer.import_vecs()?; let query = Query::build(&indexer, &computer); - let ids = params.values.iter().flat_map(|v| v.split(",")).collect::>(); + let ids = params + .values + .iter() + .flat_map(|v| v.split(",")) + .collect::>(); let index = Index::try_from(params.index.as_str())?; @@ -36,7 +40,8 @@ pub fn query(params: QueryParams) -> color_eyre::Result<()> { Value::List(v) => vec![v], Value::Matrix(v) => v, }; - let mut table = v.to_table(ids.iter().map(|id| id.to_string()).collect::>()); + let mut table = + v.to_table(ids.iter().map(|id| id.to_string()).collect::>()); table.with(Style::psql()); table.to_string() } diff --git a/crates/brk_cli/src/run.rs b/crates/brk_cli/src/run.rs index 9c2b44062..ea46651f1 100644 --- a/crates/brk_cli/src/run.rs +++ b/crates/brk_cli/src/run.rs @@ -8,7 +8,7 @@ use std::{ use brk_computer::Computer; use brk_exit::Exit; use brk_indexer::Indexer; -use brk_parser::rpc::{self, Auth, RpcApi}; +use brk_parser::rpc::{self, Auth, Client, RpcApi}; use brk_server::tokio; use clap::{Parser, ValueEnum}; use color_eyre::eyre::eyre; @@ -20,26 +20,17 @@ use crate::path_dot_brk; pub fn run(config: RunConfig) -> color_eyre::Result<()> { let config = RunConfig::import(Some(config))?; - let bitcoin_dir = config.bitcoindir(); - - let rpc = Box::leak(Box::new(rpc::Client::new( - &format!( - "http://{}:{}", - config.rpcconnect().unwrap_or(&"localhost".to_string()), - config.rpcport().unwrap_or(8332) - ), - config.to_rpc_auth().unwrap(), - )?)); + let rpc = config.rpc()?; let exit = Exit::new(); - let parser = brk_parser::Parser::new(bitcoin_dir.as_path(), rpc); + let parser = brk_parser::Parser::new(config.bitcoindir(), rpc); - let mut indexer = Indexer::new(&config.indexeddir())?; + let mut indexer = Indexer::new(config.indexeddir())?; indexer.import_stores()?; indexer.import_vecs()?; - let mut computer = Computer::new(&config.computeddir()); + let mut computer = Computer::new(config.computeddir()); computer.import_stores()?; computer.import_vecs()?; @@ -52,7 +43,9 @@ pub fn run(config: RunConfig) -> color_eyre::Result<()> { let handle = if config.serve() { Some(tokio::spawn(async move { - brk_server::main(served_indexer, served_computer).await.unwrap(); + brk_server::main(served_indexer, served_computer) + .await + .unwrap(); })) } else { None @@ -231,7 +224,7 @@ impl RunConfig { std::process::exit(1); } - if self.to_rpc_auth().is_err() { + if self.rpc_auth().is_err() { println!( "No way found to authenticate the RPC client, please either set --rpccookiefile or --rpcuser and --rpcpassword.\nRun the program with '-h' for help." ); @@ -249,7 +242,18 @@ impl RunConfig { fs::write(path, toml::to_string(self).unwrap()) } - pub fn to_rpc_auth(&self) -> color_eyre::Result { + pub fn rpc(&self) -> color_eyre::Result<&'static Client> { + Ok(Box::leak(Box::new(rpc::Client::new( + &format!( + "http://{}:{}", + self.rpcconnect().unwrap_or(&"localhost".to_string()), + self.rpcport().unwrap_or(8332) + ), + self.rpc_auth().unwrap(), + )?))) + } + + fn rpc_auth(&self) -> color_eyre::Result { let cookie = self.path_cookiefile(); if cookie.is_file() { @@ -264,11 +268,11 @@ impl RunConfig { } } - pub fn rpcconnect(&self) -> Option<&String> { + fn rpcconnect(&self) -> Option<&String> { self.rpcconnect.as_ref() } - pub fn rpcport(&self) -> Option { + fn rpcport(&self) -> Option { self.rpcport } @@ -297,11 +301,13 @@ impl RunConfig { } pub fn process(&self) -> bool { - self.mode.is_none_or(|m| m == Mode::All || m == Mode::Processor) + self.mode + .is_none_or(|m| m == Mode::All || m == Mode::Processor) } pub fn serve(&self) -> bool { - self.mode.is_none_or(|m| m == Mode::All || m == Mode::Server) + self.mode + .is_none_or(|m| m == Mode::All || m == Mode::Server) } fn path_cookiefile(&self) -> PathBuf { @@ -314,7 +320,9 @@ impl RunConfig { fn fix_user_path(path: &str) -> PathBuf { let fix = move |pattern: &str| { if path.starts_with(pattern) { - let path = &path.replace(&format!("{pattern}/"), "").replace(pattern, ""); + let path = &path + .replace(&format!("{pattern}/"), "") + .replace(pattern, ""); let home = std::env::var("HOME").unwrap(); @@ -328,7 +336,20 @@ impl RunConfig { } } -#[derive(Default, Debug, Clone, Copy, Parser, ValueEnum, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[derive( + Default, + Debug, + Clone, + Copy, + Parser, + ValueEnum, + Serialize, + Deserialize, + PartialEq, + Eq, + PartialOrd, + Ord, +)] pub enum Mode { #[default] All, diff --git a/crates/brk_computer/src/main.rs b/crates/brk_computer/examples/main.rs similarity index 81% rename from crates/brk_computer/src/main.rs rename to crates/brk_computer/examples/main.rs index 80646985f..2d50a500d 100644 --- a/crates/brk_computer/src/main.rs +++ b/crates/brk_computer/examples/main.rs @@ -17,19 +17,19 @@ pub fn main() -> color_eyre::Result<()> { let bitcoin_dir = Path::new("../../../bitcoin"); let rpc = Box::leak(Box::new(rpc::Client::new( "http://localhost:8332", - rpc::Auth::CookieFile(Path::new(bitcoin_dir).join(".cookie")), + rpc::Auth::CookieFile(bitcoin_dir.join(".cookie")), )?)); let exit = Exit::new(); - let parser = Parser::new(bitcoin_dir, rpc); + let parser = Parser::new(bitcoin_dir.to_owned(), rpc); let outputs_dir = Path::new("../../_outputs"); - let mut indexer = Indexer::new(&outputs_dir.join("indexed"))?; + let mut indexer = Indexer::new(outputs_dir.join("indexed"))?; indexer.import_stores()?; indexer.import_vecs()?; - let mut computer = Computer::new(&outputs_dir.join("computed")); + let mut computer = Computer::new(outputs_dir.join("computed")); computer.import_stores()?; computer.import_vecs()?; diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index 275c0a1aa..b55c9d1de 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::path::{Path, PathBuf}; @@ -23,9 +24,9 @@ pub struct Computer { } impl Computer { - pub fn new(computed_dir: &Path) -> Self { + pub fn new(computed_dir: PathBuf) -> Self { Self { - path: computed_dir.to_owned(), + path: computed_dir, vecs: None, stores: None, } @@ -36,6 +37,8 @@ impl Computer { Ok(()) } + /// Do NOT import multiple times are things will break !!! + /// Clone struct instead pub fn import_stores(&mut self) -> color_eyre::Result<()> { self.stores = Some(Stores::import(&self.path.join("stores"))?); Ok(()) @@ -43,7 +46,12 @@ impl Computer { } impl Computer { - pub fn compute(&mut self, indexer: &mut Indexer, starting_indexes: Indexes, exit: &Exit) -> color_eyre::Result<()> { + pub fn compute( + &mut self, + indexer: &mut Indexer, + starting_indexes: Indexes, + exit: &Exit, + ) -> color_eyre::Result<()> { info!("Computing..."); let height_count = indexer.vecs().height_to_size.len(); diff --git a/crates/brk_core/Cargo.toml b/crates/brk_core/Cargo.toml index 89eb7b4f8..f32a9cabe 100644 --- a/crates/brk_core/Cargo.toml +++ b/crates/brk_core/Cargo.toml @@ -16,7 +16,7 @@ log = { workspace = true } rapidhash = "1.4.0" rlimit = "0.10.2" serde = { workspace = true } -serde_bytes = "0.11.15" +serde_bytes = "0.11.16" zerocopy = { workspace = true } [package.metadata.cargo-machete] diff --git a/crates/brk_core/src/lib.rs b/crates/brk_core/src/lib.rs index 2c5951430..3ef0e86c4 100644 --- a/crates/brk_core/src/lib.rs +++ b/crates/brk_core/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] mod error; diff --git a/crates/brk_core/src/structs/addressbytes.rs b/crates/brk_core/src/structs/addressbytes.rs index 285f0d5f4..d572b0d3e 100644 --- a/crates/brk_core/src/structs/addressbytes.rs +++ b/crates/brk_core/src/structs/addressbytes.rs @@ -1,6 +1,13 @@ -use bitcoin::ScriptBuf; +use std::fmt; + +use bitcoin::{ + Address, Network, ScriptBuf, + hex::{Case, DisplayHex}, + opcodes, + script::Builder, +}; use derive_deref::{Deref, DerefMut}; -use serde::Serialize; +use serde::{Serialize, Serializer}; use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout}; use crate::Error; @@ -89,64 +96,207 @@ impl TryFrom<(&ScriptBuf, Addresstype)> for Addressbytes { } } +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2PK65AddressBytes(U8x65); + +impl fmt::Display for P2PK65AddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.to_hex_string(Case::Lower)) + } +} + +impl Serialize for P2PK65AddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2PK65AddressBytes) -> Self { Self::P2PK65(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2PK33AddressBytes(U8x33); + +impl fmt::Display for P2PK33AddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.to_hex_string(Case::Lower)) + } +} + +impl Serialize for P2PK33AddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2PK33AddressBytes) -> Self { Self::P2PK33(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2PKHAddressBytes(U8x20); + +impl fmt::Display for P2PKHAddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let script = Builder::new() + .push_opcode(opcodes::all::OP_DUP) + .push_opcode(opcodes::all::OP_HASH160) + .push_slice(*self.0) + .push_opcode(opcodes::all::OP_EQUALVERIFY) + .push_opcode(opcodes::all::OP_CHECKSIG) + .into_script(); + let address = Address::from_script(&script, Network::Bitcoin).unwrap(); + write!(f, "{}", address) + } +} + +impl Serialize for P2PKHAddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2PKHAddressBytes) -> Self { Self::P2PKH(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2SHAddressBytes(U8x20); + +impl fmt::Display for P2SHAddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let script = Builder::new() + .push_opcode(opcodes::all::OP_HASH160) + .push_slice(*self.0) + .push_opcode(opcodes::all::OP_EQUAL) + .into_script(); + let address = Address::from_script(&script, Network::Bitcoin).unwrap(); + write!(f, "{}", address) + } +} + +impl Serialize for P2SHAddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2SHAddressBytes) -> Self { Self::P2SH(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2WPKHAddressBytes(U8x20); + +impl fmt::Display for P2WPKHAddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let script = Builder::new().push_int(0).push_slice(*self.0).into_script(); + let address = Address::from_script(&script, Network::Bitcoin).unwrap(); + write!(f, "{}", address) + } +} + +impl Serialize for P2WPKHAddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2WPKHAddressBytes) -> Self { Self::P2WPKH(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2WSHAddressBytes(U8x32); + +impl fmt::Display for P2WSHAddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let script = Builder::new().push_int(0).push_slice(*self.0).into_script(); + let address = Address::from_script(&script, Network::Bitcoin).unwrap(); + write!(f, "{}", address) + } +} + +impl Serialize for P2WSHAddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2WSHAddressBytes) -> Self { Self::P2WSH(value) } } + +#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] +pub struct P2TRAddressBytes(U8x32); + +impl fmt::Display for P2TRAddressBytes { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let script = Builder::new().push_int(1).push_slice(*self.0).into_script(); + let address = Address::from_script(&script, Network::Bitcoin).unwrap(); + write!(f, "{}", address) + } +} + +impl Serialize for P2TRAddressBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&self.to_string()) + } +} + impl From for Addressbytes { fn from(value: P2TRAddressBytes) -> Self { Self::P2TR(value) } } -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2PK65AddressBytes(U8x65); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2PK33AddressBytes(U8x33); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2PKHAddressBytes(U8x20); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2SHAddressBytes(U8x20); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2WPKHAddressBytes(U8x20); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2WSHAddressBytes(U8x32); - -#[derive(Debug, Clone, Deref, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] -pub struct P2TRAddressBytes(U8x32); - -#[derive(Debug, Clone, Deref, DerefMut, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive( + Debug, + Clone, + Deref, + DerefMut, + PartialEq, + Eq, + Immutable, + IntoBytes, + KnownLayout, + FromBytes, + Serialize, +)] pub struct U8x20([u8; 20]); impl From<&[u8]> for U8x20 { fn from(slice: &[u8]) -> Self { @@ -156,7 +306,19 @@ impl From<&[u8]> for U8x20 { } } -#[derive(Debug, Clone, Deref, DerefMut, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive( + Debug, + Clone, + Deref, + DerefMut, + PartialEq, + Eq, + Immutable, + IntoBytes, + KnownLayout, + FromBytes, + Serialize, +)] pub struct U8x32([u8; 32]); impl From<&[u8]> for U8x32 { fn from(slice: &[u8]) -> Self { @@ -166,7 +328,19 @@ impl From<&[u8]> for U8x32 { } } -#[derive(Debug, Clone, Deref, DerefMut, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive( + Debug, + Clone, + Deref, + DerefMut, + PartialEq, + Eq, + Immutable, + IntoBytes, + KnownLayout, + FromBytes, + Serialize, +)] pub struct U8x33(#[serde(with = "serde_bytes")] [u8; 33]); impl From<&[u8]> for U8x33 { fn from(slice: &[u8]) -> Self { @@ -176,7 +350,19 @@ impl From<&[u8]> for U8x33 { } } -#[derive(Debug, Clone, Deref, DerefMut, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive( + Debug, + Clone, + Deref, + DerefMut, + PartialEq, + Eq, + Immutable, + IntoBytes, + KnownLayout, + FromBytes, + Serialize, +)] pub struct U8x64(#[serde(with = "serde_bytes")] [u8; 64]); impl From<&[u8]> for U8x64 { fn from(slice: &[u8]) -> Self { @@ -186,7 +372,19 @@ impl From<&[u8]> for U8x64 { } } -#[derive(Debug, Clone, Deref, DerefMut, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive( + Debug, + Clone, + Deref, + DerefMut, + PartialEq, + Eq, + Immutable, + IntoBytes, + KnownLayout, + FromBytes, + Serialize, +)] pub struct U8x65(#[serde(with = "serde_bytes")] [u8; 65]); impl From<&[u8]> for U8x65 { fn from(slice: &[u8]) -> Self { diff --git a/crates/brk_core/src/structs/blockhash.rs b/crates/brk_core/src/structs/blockhash.rs index fd06c9fdb..f1375219a 100644 --- a/crates/brk_core/src/structs/blockhash.rs +++ b/crates/brk_core/src/structs/blockhash.rs @@ -1,13 +1,14 @@ -use std::mem; +use std::{fmt, mem}; +use bitcoin::hashes::Hash; use bitcoincore_rpc::{Client, RpcApi}; use derive_deref::Deref; -use serde::Serialize; +use serde::{Serialize, Serializer}; use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout}; use super::Height; -#[derive(Debug, Deref, Clone, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive(Debug, Deref, Clone, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] pub struct BlockHash([u8; 32]); impl From for BlockHash { @@ -22,9 +23,30 @@ impl From for bitcoin::BlockHash { } } +impl From<&BlockHash> for bitcoin::BlockHash { + fn from(value: &BlockHash) -> Self { + bitcoin::BlockHash::from_slice(&value.0).unwrap() + } +} + impl TryFrom<(&Client, Height)> for BlockHash { type Error = bitcoincore_rpc::Error; fn try_from((rpc, height): (&Client, Height)) -> Result { Ok(Self::from(rpc.get_block_hash(u64::from(height))?)) } } + +impl fmt::Display for BlockHash { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", bitcoin::BlockHash::from(self)) + } +} + +impl Serialize for BlockHash { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} diff --git a/crates/brk_core/src/structs/date.rs b/crates/brk_core/src/structs/date.rs index 3a448b08b..8aed1398d 100644 --- a/crates/brk_core/src/structs/date.rs +++ b/crates/brk_core/src/structs/date.rs @@ -1,11 +1,11 @@ use jiff::{Span, civil::Date as Date_, tz::TimeZone}; -use serde::Serialize; +use serde::{Serialize, Serializer}; use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout}; use super::{Dateindex, Timestamp}; #[derive( - Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromBytes, Immutable, IntoBytes, KnownLayout, Serialize, + Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, FromBytes, Immutable, IntoBytes, KnownLayout, )] pub struct Date(u32); @@ -52,7 +52,9 @@ impl From for Date_ { impl From for Date { fn from(value: Timestamp) -> Self { - Self::from(Date_::from(jiff::Timestamp::from(value).to_zoned(TimeZone::UTC))) + Self::from(Date_::from( + jiff::Timestamp::from(value).to_zoned(TimeZone::UTC), + )) } } @@ -68,6 +70,20 @@ impl From for Date { impl std::fmt::Display for Date { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_str(&format!("{}-{}-{}", self.year(), self.month(), self.day())) + f.write_str(&format!( + "{}-{:0>2}-{:0>2}", + self.year(), + self.month(), + self.day() + )) + } +} + +impl Serialize for Date { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) } } diff --git a/crates/brk_core/src/structs/txid.rs b/crates/brk_core/src/structs/txid.rs index c180ab457..0b0475c0e 100644 --- a/crates/brk_core/src/structs/txid.rs +++ b/crates/brk_core/src/structs/txid.rs @@ -1,10 +1,11 @@ -use std::mem; +use std::{fmt, mem}; +use bitcoin::hashes::Hash; use derive_deref::Deref; -use serde::Serialize; +use serde::{Serialize, Serializer}; use zerocopy::{FromBytes, Immutable, IntoBytes, KnownLayout}; -#[derive(Debug, Deref, Clone, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes, Serialize)] +#[derive(Debug, Deref, Clone, PartialEq, Eq, Immutable, IntoBytes, KnownLayout, FromBytes)] pub struct Txid([u8; 32]); impl From for Txid { @@ -18,3 +19,24 @@ impl From for bitcoin::Txid { unsafe { mem::transmute(value) } } } + +impl From<&Txid> for bitcoin::Txid { + fn from(value: &Txid) -> Self { + bitcoin::Txid::from_slice(&value.0).unwrap() + } +} + +impl fmt::Display for Txid { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", bitcoin::Txid::from(self)) + } +} + +impl Serialize for Txid { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } +} diff --git a/crates/brk_exit/src/lib.rs b/crates/brk_exit/src/lib.rs index d574cf433..1d4208c4f 100644 --- a/crates/brk_exit/src/lib.rs +++ b/crates/brk_exit/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] use std::{ diff --git a/crates/brk_fetcher/src/main.rs b/crates/brk_fetcher/examples/main.rs similarity index 67% rename from crates/brk_fetcher/src/main.rs rename to crates/brk_fetcher/examples/main.rs index 3dccf1f22..91817fb4d 100644 --- a/crates/brk_fetcher/src/main.rs +++ b/crates/brk_fetcher/examples/main.rs @@ -9,7 +9,11 @@ fn main() -> color_eyre::Result<()> { let mut fetcher = Fetcher::import(None)?; dbg!(fetcher.get_date(Date::new(2025, 1, 1))?); - dbg!(fetcher.get_height(885604_u32.into(), 1740683986.into(), Some(1740683000.into()))?); + dbg!(fetcher.get_height( + 880_000_u32.into(), + 1740683986.into(), + Some(1740683000.into()) + )?); Ok(()) } diff --git a/crates/brk_fetcher/src/fetchers/kibo.rs b/crates/brk_fetcher/src/fetchers/kibo.rs index 20fcb6dba..3182a65b4 100644 --- a/crates/brk_fetcher/src/fetchers/kibo.rs +++ b/crates/brk_fetcher/src/fetchers/kibo.rs @@ -30,12 +30,19 @@ impl Kibo { pub fn get_from_height(&mut self, height: Height) -> color_eyre::Result { #[allow(clippy::map_entry)] if !self.height_to_ohlc_vec.contains_key(&height) - || ((usize::from(height) + self.height_to_ohlc_vec.get(&height).unwrap().len()) <= usize::from(height)) + || ((usize::from(height) + self.height_to_ohlc_vec.get(&height).unwrap().len()) + <= usize::from(height)) { - self.height_to_ohlc_vec - .insert(height, Self::fetch_height_prices(height)?); + self.height_to_ohlc_vec.insert( + height, + Self::fetch_height_prices(height).inspect_err(|e| { + dbg!(e); + })?, + ); } + dbg!(&self.height_to_ohlc_vec.keys()); + self.height_to_ohlc_vec .get(&height) .unwrap() @@ -51,9 +58,9 @@ impl Kibo { |try_index| { let base_url = Self::get_base_url(try_index); - let body: Value = minreq::get(format!("{base_url}/height-to-price?chunk={}", height)) - .send()? - .json()?; + let url = format!("{base_url}/height-to-price?chunk={}", height); + + let body: Value = minreq::get(url).send()?.json()?; let vec = body .as_object() @@ -91,7 +98,8 @@ impl Kibo { .0 < date { - self.year_to_date_to_ohlc.insert(year, Self::fetch_date_prices(year)?); + self.year_to_date_to_ohlc + .insert(year, Self::fetch_date_prices(year)?); } self.year_to_date_to_ohlc @@ -125,7 +133,8 @@ impl Kibo { .context("Expect to be an object")? .iter() .map(|(serialized_date, value)| -> color_eyre::Result<_> { - let date = Date::from(jiff::civil::Date::from_str(serialized_date).unwrap()); + let date = + Date::from(jiff::civil::Date::from_str(serialized_date).unwrap()); Ok((date, Self::value_to_ohlc(value)?)) }) .collect::, _>>() diff --git a/crates/brk_fetcher/src/fetchers/retry.rs b/crates/brk_fetcher/src/fetchers/retry.rs index 3e1ab4675..b1a607031 100644 --- a/crates/brk_fetcher/src/fetchers/retry.rs +++ b/crates/brk_fetcher/src/fetchers/retry.rs @@ -1,4 +1,4 @@ -use std::{thread::sleep, time::Duration}; +use std::{fmt::Debug, thread::sleep, time::Duration}; use log::info; @@ -6,7 +6,10 @@ pub fn retry( function: impl Fn(usize) -> color_eyre::Result, sleep_in_s: u64, retries: usize, -) -> color_eyre::Result { +) -> color_eyre::Result +where + T: Debug, +{ let mut i = 0; loop { diff --git a/crates/brk_fetcher/src/lib.rs b/crates/brk_fetcher/src/lib.rs index 72aa1294a..db4a75cdc 100644 --- a/crates/brk_fetcher/src/lib.rs +++ b/crates/brk_fetcher/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::{collections::BTreeMap, fs, path::Path}; @@ -93,9 +94,10 @@ impl Fetcher { previous_timestamp: Option, name: &str, ) -> color_eyre::Result { - let previous_ohlc = previous_timestamp.map_or(Some(OHLCCents::default()), |previous_timestamp| { - tree.get(&previous_timestamp).cloned() - }); + let previous_ohlc = previous_timestamp + .map_or(Some(OHLCCents::default()), |previous_timestamp| { + tree.get(&previous_timestamp).cloned() + }); let last_ohlc = tree.get(×tamp); diff --git a/crates/brk_indexer/src/main.rs b/crates/brk_indexer/examples/main.rs similarity index 87% rename from crates/brk_indexer/src/main.rs rename to crates/brk_indexer/examples/main.rs index abc51e0bd..8935d6b2b 100644 --- a/crates/brk_indexer/src/main.rs +++ b/crates/brk_indexer/examples/main.rs @@ -16,13 +16,13 @@ fn main() -> color_eyre::Result<()> { let bitcoin_dir = Path::new("../../../bitcoin"); let rpc = Box::leak(Box::new(rpc::Client::new( "http://localhost:8332", - rpc::Auth::CookieFile(Path::new(bitcoin_dir).join(".cookie")), + rpc::Auth::CookieFile(bitcoin_dir.join(".cookie")), )?)); let exit = Exit::new(); - let parser = Parser::new(bitcoin_dir, rpc); + let parser = Parser::new(bitcoin_dir.to_owned(), rpc); - let mut indexer = Indexer::new(Path::new("../../_outputs/indexed"))?; + let mut indexer = Indexer::new(Path::new("../../_outputs/indexed").to_owned())?; indexer.import_stores()?; indexer.import_vecs()?; diff --git a/crates/brk_indexer/src/lib.rs b/crates/brk_indexer/src/lib.rs index 08d5e10d7..e04a4c6b5 100644 --- a/crates/brk_indexer/src/lib.rs +++ b/crates/brk_indexer/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::{ @@ -11,8 +12,8 @@ use std::{ }; use brk_core::{ - AddressHash, Addressbytes, Addressindex, Addresstype, BlockHash, BlockHashPrefix, Height, Sats, Timestamp, Txid, - TxidPrefix, Txindex, Txinindex, Txoutindex, Vin, Vout, setrlimit, + AddressHash, Addressbytes, Addressindex, Addresstype, BlockHash, BlockHashPrefix, Height, Sats, + Timestamp, Txid, TxidPrefix, Txindex, Txinindex, Txoutindex, Vin, Vout, setrlimit, }; pub use brk_parser::*; @@ -39,10 +40,10 @@ pub struct Indexer { } impl Indexer { - pub fn new(indexes_dir: &Path) -> color_eyre::Result { + pub fn new(indexes_dir: PathBuf) -> color_eyre::Result { setrlimit()?; Ok(Self { - path: indexes_dir.to_owned(), + path: indexes_dir, vecs: None, stores: None, }) @@ -53,27 +54,40 @@ impl Indexer { Ok(()) } + /// Do NOT import multiple times are things will break !!! pub fn import_stores(&mut self) -> color_eyre::Result<()> { self.stores = Some(Stores::import(&self.path.join("stores"))?); Ok(()) } - pub fn index(&mut self, parser: &Parser, rpc: &'static rpc::Client, exit: &Exit) -> color_eyre::Result { + pub fn index( + &mut self, + parser: &Parser, + rpc: &'static rpc::Client, + exit: &Exit, + ) -> color_eyre::Result { let check_collisions = true; - let starting_indexes = Indexes::try_from((self.vecs.as_mut().unwrap(), self.stores.as_ref().unwrap(), rpc)) - .unwrap_or_else(|_| { - let indexes = Indexes::default(); - indexes.push_if_needed(self.vecs.as_mut().unwrap()).unwrap(); - indexes - }); + let starting_indexes = Indexes::try_from(( + self.vecs.as_mut().unwrap(), + self.stores.as_ref().unwrap(), + rpc, + )) + .unwrap_or_else(|_| { + let indexes = Indexes::default(); + indexes.push_if_needed(self.vecs.as_mut().unwrap()).unwrap(); + indexes + }); exit.block(); self.stores .as_mut() .unwrap() .rollback_if_needed(self.vecs.as_ref().unwrap(), &starting_indexes)?; - self.vecs.as_mut().unwrap().rollback_if_needed(&starting_indexes)?; + self.vecs + .as_mut() + .unwrap() + .rollback_if_needed(&starting_indexes)?; exit.release(); let vecs = self.vecs.as_mut().unwrap(); @@ -84,25 +98,31 @@ impl Indexer { let start = Some(idxs.height); let end = None; //Some(Height::new(400_000)); - if starting_indexes.height > Height::try_from(rpc)? || end.is_some_and(|end| starting_indexes.height > end) { + if starting_indexes.height > Height::try_from(rpc)? + || end.is_some_and(|end| starting_indexes.height > end) + { return Ok(starting_indexes); } info!("Started indexing..."); - let export_if_needed = - |stores: &mut Stores, vecs: &mut Vecs, height: Height, rem: bool, exit: &Exit| -> color_eyre::Result<()> { - if height == 0 || (height % SNAPSHOT_BLOCK_RANGE != 0) != rem || exit.triggered() { - return Ok(()); - } + let export_if_needed = |stores: &mut Stores, + vecs: &mut Vecs, + height: Height, + rem: bool, + exit: &Exit| + -> color_eyre::Result<()> { + if height == 0 || (height % SNAPSHOT_BLOCK_RANGE != 0) != rem || exit.triggered() { + return Ok(()); + } - info!("Exporting..."); - exit.block(); - stores.commit(height)?; - vecs.flush(height)?; - exit.release(); - Ok(()) - }; + info!("Exporting..."); + exit.block(); + stores.commit(height)?; + vecs.flush(height)?; + exit.release(); + Ok(()) + }; parser.parse(start, None).iter().try_for_each( |(height, block, blockhash)| -> color_eyre::Result<()> { diff --git a/crates/brk_logger/src/main.rs b/crates/brk_logger/examples/main.rs similarity index 100% rename from crates/brk_logger/src/main.rs rename to crates/brk_logger/examples/main.rs diff --git a/crates/brk_logger/src/lib.rs b/crates/brk_logger/src/lib.rs index 634b19dca..e3bebbc6f 100644 --- a/crates/brk_logger/src/lib.rs +++ b/crates/brk_logger/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::{ @@ -18,7 +19,11 @@ use jiff::{Timestamp, tz}; pub fn init(path: Option<&Path>) { let file = path.map(|path| { let _ = fs::remove_file(path); - OpenOptions::new().create(true).append(true).open(path).unwrap() + OpenOptions::new() + .create(true) + .append(true) + .open(path) + .unwrap() }); Builder::from_env(Env::default().default_filter_or("info,fjall=off,lsm_tree=off")) @@ -34,7 +39,14 @@ pub fn init(path: Option<&Path>) { let args = record.args(); if let Some(file) = file.as_ref() { - let _ = write(file.try_clone().unwrap(), &date_time, target, &level, dash, args); + let _ = write( + file.try_clone().unwrap(), + &date_time, + target, + &level, + dash, + args, + ); } let colored_date_time = date_time.bright_black(); @@ -48,7 +60,14 @@ pub fn init(path: Option<&Path>) { }; let colored_dash = dash.bright_black(); - write(buf, colored_date_time, target, colored_level, colored_dash, args) + write( + buf, + colored_date_time, + target, + colored_level, + colored_dash, + args, + ) }) .init(); } diff --git a/crates/brk_parser/examples/main.rs b/crates/brk_parser/examples/main.rs new file mode 100644 index 000000000..411a103e1 --- /dev/null +++ b/crates/brk_parser/examples/main.rs @@ -0,0 +1,58 @@ +use std::path::Path; + +use bitcoincore_rpc::{Auth, Client}; +use brk_core::Height; +use brk_parser::Parser; + +fn main() { + let i = std::time::Instant::now(); + + let bitcoin_dir = Path::new("../../../bitcoin"); + let rpc = Box::leak(Box::new( + Client::new( + "http://localhost:8332", + Auth::CookieFile(bitcoin_dir.join(".cookie")), + ) + .unwrap(), + )); + + // let start = None; + // let end = None; + + let parser = Parser::new(bitcoin_dir.to_owned(), rpc); + + // parser + // .parse(start, end) + // .iter() + // .for_each(|(height, _block, hash)| { + // println!("{height}: {hash}"); + // }); + + println!( + "{}", + parser + .get(Height::new(0)) + .txdata + .first() + .unwrap() + .output + .first() + .unwrap() + .script_pubkey + ); + + println!( + "{}", + parser + .get(Height::new(840_000)) + .txdata + .first() + .unwrap() + .output + .first() + .unwrap() + .value + ); + + dbg!(i.elapsed()); +} diff --git a/crates/brk_parser/src/lib.rs b/crates/brk_parser/src/lib.rs index 22ff1e558..37e3ce50e 100644 --- a/crates/brk_parser/src/lib.rs +++ b/crates/brk_parser/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::{ @@ -8,7 +9,7 @@ use std::{ collections::BTreeMap, fs::{self}, ops::ControlFlow, - path::{Path, PathBuf}, + path::PathBuf, thread, }; @@ -52,15 +53,16 @@ pub struct Parser { } impl Parser { - pub fn new(bitcoin_dir: &Path, rpc: &'static bitcoincore_rpc::Client) -> Self { - Self { - bitcoin_dir: bitcoin_dir.to_owned(), - rpc, - } + pub fn new(bitcoin_dir: PathBuf, rpc: &'static bitcoincore_rpc::Client) -> Self { + Self { bitcoin_dir, rpc } } pub fn get(&self, height: Height) -> Block { - self.parse(Some(height), Some(height)).iter().next().unwrap().1 + self.parse(Some(height), Some(height)) + .iter() + .next() + .unwrap() + .1 } /// @@ -68,7 +70,11 @@ impl Parser { /// /// For an example checkout `./main.rs` /// - pub fn parse(&self, start: Option, end: Option) -> Receiver<(Height, Block, BlockHash)> { + pub fn parse( + &self, + start: Option, + end: Option, + ) -> Receiver<(Height, Block, BlockHash)> { let bitcoin_dir = self.bitcoin_dir.as_path(); let rpc = self.rpc; @@ -119,9 +125,12 @@ impl Parser { } } - let len = - u32::from_le_bytes(xor_i.bytes(&mut blk_bytes[i..(i + 4)], &xor_bytes).try_into().unwrap()) - as usize; + let len = u32::from_le_bytes( + xor_i + .bytes(&mut blk_bytes[i..(i + 4)], &xor_bytes) + .try_into() + .unwrap(), + ) as usize; i += 4; let block_bytes = (blk_bytes[i..(i + len)]).to_vec(); @@ -152,18 +161,19 @@ impl Parser { BlockState::decode(block_state, xor_i, &xor_bytes); }); - bulk.drain(..).try_for_each(|(blk_metadata, block_state, _)| { - let block = match block_state { - BlockState::Decoded(block) => block, - _ => unreachable!(), - }; + bulk.drain(..) + .try_for_each(|(blk_metadata, block_state, _)| { + let block = match block_state { + BlockState::Decoded(block) => block, + _ => unreachable!(), + }; - if send_block.send((blk_metadata, block)).is_err() { - return ControlFlow::Break(()); - } + if send_block.send((blk_metadata, block)).is_err() { + return ControlFlow::Break(()); + } - ControlFlow::Continue(()) - }) + ControlFlow::Continue(()) + }) }; recv_bytes.iter().try_for_each(|tuple| { @@ -230,7 +240,9 @@ impl Parser { let mut opt = if current_height == height { Some((block, hash)) } else { - if start.is_none_or(|start| start <= height) && end.is_none_or(|end| end >= height) { + if start.is_none_or(|start| start <= height) + && end.is_none_or(|end| end >= height) + { future_blocks.insert(height, (block, hash)); } None @@ -247,7 +259,9 @@ impl Parser { return ControlFlow::Break(()); } - send_height_block_hash.send((current_height, block, hash)).unwrap(); + send_height_block_hash + .send((current_height, block, hash)) + .unwrap(); if end.is_some_and(|end| end == current_height) { return ControlFlow::Break(()); diff --git a/crates/brk_parser/src/main.rs b/crates/brk_parser/src/main.rs deleted file mode 100644 index c7bf1c6a8..000000000 --- a/crates/brk_parser/src/main.rs +++ /dev/null @@ -1,32 +0,0 @@ -use std::path::Path; - -use bitcoincore_rpc::{Auth, Client}; -use brk_core::Height; -use brk_parser::Parser; - -fn main() { - let i = std::time::Instant::now(); - - let bitcoin_dir = Path::new("../../../bitcoin"); - let rpc = Box::leak(Box::new( - Client::new( - "http://localhost:8332", - Auth::CookieFile(Path::new(bitcoin_dir).join(".cookie")), - ) - .unwrap(), - )); - - let start = None; - let end = None; - - let parser = Parser::new(bitcoin_dir, rpc); - - parser.parse(start, end).iter().for_each(|(height, _block, hash)| { - println!("{height}: {hash}"); - }); - - parser.get(Height::new(0)); - parser.get(Height::new(840_000)); - - dbg!(i.elapsed()); -} diff --git a/crates/brk_query/src/main.rs b/crates/brk_query/examples/main.rs similarity index 81% rename from crates/brk_query/src/main.rs rename to crates/brk_query/examples/main.rs index 13f9d3432..b04032d13 100644 --- a/crates/brk_query/src/main.rs +++ b/crates/brk_query/examples/main.rs @@ -9,10 +9,10 @@ pub fn main() -> color_eyre::Result<()> { let outputs_dir = Path::new("../../_outputs"); - let mut indexer = Indexer::new(&outputs_dir.join("indexed"))?; + let mut indexer = Indexer::new(outputs_dir.join("indexed"))?; indexer.import_vecs()?; - let mut computer = Computer::new(&outputs_dir.join("computed")); + let mut computer = Computer::new(outputs_dir.join("computed")); computer.import_vecs()?; let query = Query::build(&indexer, &computer); diff --git a/crates/brk_query/src/index.rs b/crates/brk_query/src/index.rs index 1bde51c2b..3fedd6677 100644 --- a/crates/brk_query/src/index.rs +++ b/crates/brk_query/src/index.rs @@ -38,7 +38,8 @@ impl Index { ] } - pub fn self_to_ids(&self) -> &[&str] { + pub fn possible_values(&self) -> &[&str] { + // Always have the "correct" id at the end match self { Self::Dateindex => &["d", "date", "dateindex"], Self::Height => &["h", "height"], @@ -56,10 +57,10 @@ impl Index { } } - pub fn possible_values() -> Vec { + pub fn all_possible_values() -> Vec { Self::all() .iter() - .flat_map(|i| i.self_to_ids().iter().map(|s| s.to_string())) + .flat_map(|i| i.possible_values().iter().map(|s| s.to_string())) .collect::>() } } @@ -68,19 +69,19 @@ impl TryFrom<&str> for Index { type Error = color_eyre::Report; fn try_from(value: &str) -> Result { Ok(match value { - v if (Self::Dateindex).self_to_ids().contains(&v) => Self::Dateindex, - v if (Self::Height).self_to_ids().contains(&v) => Self::Height, - v if (Self::Txindex).self_to_ids().contains(&v) => Self::Txindex, - v if (Self::Txinindex).self_to_ids().contains(&v) => Self::Txinindex, - v if (Self::Txoutindex).self_to_ids().contains(&v) => Self::Txoutindex, - v if (Self::Addressindex).self_to_ids().contains(&v) => Self::Addressindex, - v if (Self::P2PK33index).self_to_ids().contains(&v) => Self::P2PK33index, - v if (Self::P2PK65index).self_to_ids().contains(&v) => Self::P2PK65index, - v if (Self::P2PKHindex).self_to_ids().contains(&v) => Self::P2PKHindex, - v if (Self::P2SHindex).self_to_ids().contains(&v) => Self::P2SHindex, - v if (Self::P2TRindex).self_to_ids().contains(&v) => Self::P2TRindex, - v if (Self::P2WPKHindex).self_to_ids().contains(&v) => Self::P2WPKHindex, - v if (Self::P2WSHindex).self_to_ids().contains(&v) => Self::P2WSHindex, + v if (Self::Dateindex).possible_values().contains(&v) => Self::Dateindex, + v if (Self::Height).possible_values().contains(&v) => Self::Height, + v if (Self::Txindex).possible_values().contains(&v) => Self::Txindex, + v if (Self::Txinindex).possible_values().contains(&v) => Self::Txinindex, + v if (Self::Txoutindex).possible_values().contains(&v) => Self::Txoutindex, + v if (Self::Addressindex).possible_values().contains(&v) => Self::Addressindex, + v if (Self::P2PK33index).possible_values().contains(&v) => Self::P2PK33index, + v if (Self::P2PK65index).possible_values().contains(&v) => Self::P2PK65index, + v if (Self::P2PKHindex).possible_values().contains(&v) => Self::P2PKHindex, + v if (Self::P2SHindex).possible_values().contains(&v) => Self::P2SHindex, + v if (Self::P2TRindex).possible_values().contains(&v) => Self::P2TRindex, + v if (Self::P2WPKHindex).possible_values().contains(&v) => Self::P2WPKHindex, + v if (Self::P2WSHindex).possible_values().contains(&v) => Self::P2WSHindex, _ => return Err(eyre!("Bad index")), }) } diff --git a/crates/brk_query/src/lib.rs b/crates/brk_query/src/lib.rs index 413583967..e563e199b 100644 --- a/crates/brk_query/src/lib.rs +++ b/crates/brk_query/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use brk_computer::Computer; @@ -61,10 +62,15 @@ impl<'a> Query<'a> { let tuples = ids .iter() .map(|s| { - ( - s.to_owned(), - self.vecid_to_index_to_vec.get(&s.to_lowercase().replace("_", "-")), - ) + let mut id = s.to_lowercase().replace("_", "-"); + let mut res = self.vecid_to_index_to_vec.get(&id); + if res.is_none() { + if let Ok(index) = Index::try_from(id.as_str()) { + id = index.possible_values().last().unwrap().to_string(); + res = self.vecid_to_index_to_vec.get(&id) + } + } + (id, res) }) .filter(|(_, opt)| opt.is_some()) .map(|(id, vec)| (id, vec.unwrap())) @@ -77,7 +83,9 @@ impl<'a> Query<'a> { let mut values = tuples .iter() .flat_map(|(_, i_to_v)| i_to_v.get(&index)) - .map(|vec| -> brk_vec::Result> { vec.collect_range_values(from, to) }) + .map(|vec| -> brk_vec::Result> { + vec.collect_range_values(from, to) + }) .collect::>>()?; if values.is_empty() { @@ -88,7 +96,11 @@ impl<'a> Query<'a> { Ok(match format { Some(Format::CSV) | Some(Format::TSV) => { - let delimiter = if format == Some(Format::CSV) { ',' } else { '\t' }; + let delimiter = if format == Some(Format::CSV) { + ',' + } else { + '\t' + }; let mut text = tuples .into_iter() @@ -120,7 +132,8 @@ impl<'a> Query<'a> { } } Some(Format::MD) => { - let mut table = values.to_table(ids.iter().map(|s| s.to_string()).collect::>()); + let mut table = + values.to_table(tuples.iter().map(|(s, _)| s.to_owned()).collect::>()); table.with(Style::markdown()); diff --git a/crates/brk_query/src/params.rs b/crates/brk_query/src/params.rs index 91c77e084..672cc7891 100644 --- a/crates/brk_query/src/params.rs +++ b/crates/brk_query/src/params.rs @@ -5,7 +5,7 @@ use crate::{Format, Index}; #[derive(Debug, Deserialize, Parser)] pub struct Params { - #[clap(short, long, value_parser = PossibleValuesParser::new(Index::possible_values()))] + #[clap(short, long, value_parser = PossibleValuesParser::new(Index::all_possible_values()))] /// Index of the values requested pub index: String, #[clap(short, long, value_delimiter = ' ', num_args = 1..)] diff --git a/crates/brk_server/Cargo.toml b/crates/brk_server/Cargo.toml index 5a2e2b4b5..e449674c0 100644 --- a/crates/brk_server/Cargo.toml +++ b/crates/brk_server/Cargo.toml @@ -18,7 +18,7 @@ brk_vec = { workspace = true } color-eyre = { workspace = true } jiff = { workspace = true } log = { workspace = true } -oxc = { version = "0.53.0", features = ["codegen", "minifier"] } +oxc = { version = "0.54.0", features = ["codegen", "minifier"] } serde_json = { workspace = true } tokio = { version = "1.43.0", features = ["full"] } tower-http = { version = "0.6.2", features = ["compression-full"] } diff --git a/crates/brk_server/src/main.rs b/crates/brk_server/examples/main.rs similarity index 83% rename from crates/brk_server/src/main.rs rename to crates/brk_server/examples/main.rs index d105608ce..f7524ae0b 100644 --- a/crates/brk_server/src/main.rs +++ b/crates/brk_server/examples/main.rs @@ -17,19 +17,19 @@ pub fn main() -> color_eyre::Result<()> { let bitcoin_dir = Path::new("../../../bitcoin"); let rpc = Box::leak(Box::new(rpc::Client::new( "http://localhost:8332", - rpc::Auth::CookieFile(Path::new(bitcoin_dir).join(".cookie")), + rpc::Auth::CookieFile(bitcoin_dir.join(".cookie")), )?)); let exit = Exit::new(); - let parser = Parser::new(bitcoin_dir, rpc); + let parser = Parser::new(bitcoin_dir.to_owned(), rpc); let outputs_dir = Path::new("../../_outputs"); - let mut indexer = Indexer::new(&outputs_dir.join("indexed"))?; + let mut indexer = Indexer::new(outputs_dir.join("indexed"))?; indexer.import_stores()?; indexer.import_vecs()?; - let mut computer = Computer::new(&outputs_dir.join("computed")); + let mut computer = Computer::new(outputs_dir.join("computed")); computer.import_stores()?; computer.import_vecs()?; @@ -41,7 +41,9 @@ pub fn main() -> color_eyre::Result<()> { let served_computer = computer.clone(); tokio::spawn(async move { - brk_server::main(served_indexer, served_computer).await.unwrap(); + brk_server::main(served_indexer, served_computer) + .await + .unwrap(); }); loop { diff --git a/crates/brk_server/src/lib.rs b/crates/brk_server/src/lib.rs index 03490a340..d23e0fa25 100644 --- a/crates/brk_server/src/lib.rs +++ b/crates/brk_server/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::time::Instant; @@ -37,7 +38,11 @@ pub async fn main(indexer: Indexer, computer: Computer) -> color_eyre::Result<() let state = AppState { query }; - let compression_layer = CompressionLayer::new().br(true).deflate(true).gzip(true).zstd(true); + let compression_layer = CompressionLayer::new() + .br(true) + .deflate(true) + .gzip(true) + .zstd(true); let router = Router::new() .add_api_routes() diff --git a/crates/brk_vec/src/main.rs b/crates/brk_vec/examples/main.rs similarity index 100% rename from crates/brk_vec/src/main.rs rename to crates/brk_vec/examples/main.rs diff --git a/crates/brk_vec/src/lib.rs b/crates/brk_vec/src/lib.rs index a5530e0c9..52aaa7c77 100644 --- a/crates/brk_vec/src/lib.rs +++ b/crates/brk_vec/src/lib.rs @@ -1,6 +1,7 @@ +#![cfg_attr(docsrs, feature(doc_cfg))] #![doc = include_str!("../README.md")] #![doc = "\n## Example\n\n```rust"] -#![doc = include_str!("main.rs")] +#![doc = include_str!("../examples/main.rs")] #![doc = "```"] use std::{ @@ -81,7 +82,11 @@ where pub fn forced_import(path: &Path, version: Version) -> Result { let res = Self::import(path, version); match res { - Err(Error::WrongEndian) | Err(Error::DifferentVersion { found: _, expected: _ }) => { + Err(Error::WrongEndian) + | Err(Error::DifferentVersion { + found: _, + expected: _, + }) => { fs::remove_dir_all(path)?; Self::import(path, version) } @@ -243,7 +248,9 @@ where return Ok(Some(Value::Ref(T::try_ref_from_bytes(slice)?))); } - Ok(self.open_then_read_(index).map_or(None, |v| Some(Value::Owned(v)))) + Ok(self + .open_then_read_(index) + .map_or(None, |v| Some(Value::Owned(v)))) } #[inline] @@ -289,7 +296,10 @@ where let disk_len = I::from(Self::read_disk_len_(&file)?); let pushed_len = I::from(self.pushed_len()); - Self::seek_(&mut file, Self::index_to_byte_index(Self::i_to_usize(index)?))?; + Self::seek_( + &mut file, + Self::index_to_byte_index(Self::i_to_usize(index)?), + )?; let mut buf = Self::create_buffer(); @@ -301,7 +311,10 @@ where let disk_len = Self::i_to_usize(disk_len)?; let mut i = I::default(); while i < pushed_len { - f((i + disk_len, self.pushed.get(Self::i_to_usize(i)?).as_ref().unwrap()))?; + f(( + i + disk_len, + self.pushed.get(Self::i_to_usize(i)?).as_ref().unwrap(), + ))?; i = i + 1; } @@ -525,7 +538,12 @@ where } pub fn file_name(&self) -> String { - self.path().file_name().unwrap().to_str().unwrap().to_owned() + self.path() + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_owned() } #[inline] @@ -567,10 +585,14 @@ where A: StoredType, F: Fn(&A, I) -> T, { - self.validate_computed_version_or_reset_file(Version::from(0) + self.version + other.version)?; + self.validate_computed_version_or_reset_file( + Version::from(0) + self.version + other.version, + )?; let index = max_from.min(I::from(self.len())); - other.iter_from(index, |(i, a)| self.push_and_flush_if_needed(i, t(a, i), exit))?; + other.iter_from(index, |(i, a)| { + self.push_and_flush_if_needed(i, t(a, i), exit) + })?; Ok(self.safe_flush(exit)?) } @@ -585,7 +607,9 @@ where I: StoredType + StoredIndex, T: StoredIndex, { - self.validate_computed_version_or_reset_file(Version::from(0) + self.version + other.version)?; + self.validate_computed_version_or_reset_file( + Version::from(0) + self.version + other.version, + )?; let index = max_from.min(self.read_last()?.cloned().unwrap_or_default()); other.iter_from(index, |(v, i)| self.push_and_flush_if_needed(*i, v, exit))?; @@ -612,7 +636,8 @@ where first_indexes.iter_from(index, |(value, first_index)| { let first_index = Self::i_to_usize(*first_index)?; let last_index = Self::i_to_usize(*last_indexes.read(value)?.unwrap())?; - (first_index..last_index).try_for_each(|index| self.push_and_flush_if_needed(I::from(index), value, exit)) + (first_index..last_index) + .try_for_each(|index| self.push_and_flush_if_needed(I::from(index), value, exit)) })?; Ok(self.safe_flush(exit)?) @@ -628,7 +653,9 @@ where where T: Copy + From + Sub + StoredIndex, { - self.validate_computed_version_or_reset_file(Version::from(0) + self.version + first_indexes.version)?; + self.validate_computed_version_or_reset_file( + Version::from(0) + self.version + first_indexes.version, + )?; let index = max_from.min(I::from(self.len())); let one = T::from(1); @@ -691,7 +718,11 @@ where let index = max_from.min(I::from(self.len())); self_to_other.iter_from(index, |(i, other)| { - self.push_and_flush_if_needed(i, T::from(other_to_self.read(*other)?.unwrap() == &i), exit) + self.push_and_flush_if_needed( + i, + T::from(other_to_self.read(*other)?.unwrap() == &i), + exit, + ) })?; Ok(self.safe_flush(exit)?) diff --git a/publish.sh b/publish.sh index 873313098..69fb8b148 100755 --- a/publish.sh +++ b/publish.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -cargo check +cargo build --all-targets cd crates/brk diff --git a/rustfmt.toml b/rustfmt.toml deleted file mode 100644 index 753065179..000000000 --- a/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -max_width = 120