this repo has no description

initial redis client library

+5834
+846
.zig-cache/h/1ef9644cbfd1c616427bbed8232f5e78.txt
··· 1 + 0 2 + 15678 455263845 1760154801000000000 f0bdf7a0d76753ffab1319907ec69cf1 1 compiler/test_runner.zig 3 + 4423 477686209 1769067622995541449 2fe0cb0590bf0c31071eb30281c5e919 0 src/redis.zig 4 + 22376 455283044 1760154801000000000 2d968f90418b6afe5ba91eaa2e18ba71 1 ubsan_rt.zig 5 + 7957 455282973 1760154801000000000 0ebbb46b337b65e85e7d177cfc93d2ca 1 std/std.zig 6 + 4423 477686209 1769067622995541449 2fe0cb0590bf0c31071eb30281c5e919 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/redis.zig 7 + 2525 455282429 1760154801000000000 71e0dabdb301ba10f8ca420941767e70 1 std/BitStack.zig 8 + 100909 455282461 1760154801000000000 13a2e2104f4f0987e695d4e96ddf1e3d 1 std/Build.zig 9 + 4266 455282541 1760154801000000000 16fdba428de22eb1305e855dec42f9a9 1 std/buf_map.zig 10 + 4526 455282542 1760154801000000000 8e63f8aad9b21f2cac5dcdcafd975d93 1 std/buf_set.zig 11 + 8139 455282462 1760154801000000000 b344fa05d00dd94ca9bb8e95cc23b3fc 1 std/DoublyLinkedList.zig 12 + 25874 455282706 1760154801000000000 84e0fbf3feb0ac8196cb74e389a3ccb0 1 std/dynamic_library.zig 13 + 35271 455282475 1760154801000000000 0d7d03be6dc0cb75afa123aa4eb4d818 1 std/Io.zig 14 + 43556 455282858 1760154801000000000 5bfaba216d6a1896e7f4b43e7ee7fe1a 1 std/multi_array_list.zig 15 + 21416 455282961 1760154801000000000 4328abc876b82840e689434566876bc7 1 std/priority_queue.zig 16 + 33889 455282960 1760154801000000000 431c78ed77c39d0be4be43c7634c12d0 1 std/priority_dequeue.zig 17 + 60600 455282476 1760154801000000000 518fc21273ed20754da5c332f4c01208 1 std/Progress.zig 18 + 17628 455282490 1760154801000000000 697e28034ef9cf05bb04d3be028a9653 1 std/Random.zig 19 + 20351 455282965 1760154801000000000 41f61f133b5c7661bc5f90889fd39045 1 std/segmented_list.zig 20 + 10911 455282491 1760154801000000000 72379f2cc10c10e56c76ebebd42ca14c 1 std/SemanticVersion.zig 21 + 5252 455282492 1760154801000000000 b2d7e2ffcc15cc25fbc30a3e3799cfba 1 std/SinglyLinkedList.zig 22 + 107284 455282521 1760154801000000000 f6122a744524ffe9ac4ca0b30e195789 1 std/Target.zig 23 + 60783 455282533 1760154801000000000 c6b7ffdf4ef9d1a067c790209a989cbb 1 std/Thread.zig 24 + 24524 455282984 1760154801000000000 1694ad0602c4425ddf33879d415f4ab1 1 std/treap.zig 25 + 31490 455282534 1760154801000000000 7cd075d309fe4bb3e810216b10d3f0c8 1 std/Uri.zig 26 + 95685 455282536 1760154801000000000 a68eb5aa7a6d2c07cb820b6b5ffa0604 1 std/array_list.zig 27 + 119750 455282535 1760154801000000000 a483a92911be1b36d25671285d410963 1 std/array_hash_map.zig 28 + 19425 455282538 1760154801000000000 09d08e5d80b113466699bf4262b53875 1 std/atomic.zig 29 + 24490 455282539 1760154801000000000 db10a569a8a9a16313103b691a443b4a 1 std/base64.zig 30 + 69019 455282540 1760154801000000000 a44de477fecc990a1381fe54649a934b 1 std/bit_set.zig 31 + 39860 455282545 1760154801000000000 bab8724be90660375455f96475ebd26f 1 std/builtin.zig 32 + 362358 455282555 1760154801000000000 5960e7594dae4d71cff9606967779bee 1 std/c.zig 33 + 51742 455282556 1760154801000000000 a9384cc5046eaeedcb1b30e646b423dc 1 std/coff.zig 34 + 372 455282584 1760154801000000000 b867983786f01e8333e32b633eb10410 1 std/compress.zig 35 + 17640 455282972 1760154801000000000 bd79322afba3cc08000a99c21bfd26d7 1 std/static_string_map.zig 36 + 13676 455282681 1760154801000000000 56a50f35f9d4227c9754ad2bad741de1 1 std/crypto.zig 37 + 69506 455282696 1760154801000000000 91241872064e64c681a13b7de815e984 1 std/debug.zig 38 + 11083 455264147 1760154801000000000 3c8016eb348fede9a19b94ec4869d8a6 1 compiler_rt.zig 39 + 4894 455282705 1760154801000000000 61fff94fe737bda88edd8ca624c0a93c 1 std/dwarf.zig 40 + 65720 455282707 1760154801000000000 bbe1ed25b53adc620fcc2bcd89a2a536 1 std/elf.zig 41 + 57857 455282708 1760154801000000000 e8bdba1d4814ce140abed00d8ac27c66 1 std/enums.zig 42 + 58752 455282722 1760154801000000000 94d08677478fb7c8fd9ecad13a05a7f6 1 std/fmt.zig 43 + 34417 455282731 1760154801000000000 2d9a528a5756bb811d20d393011711e8 1 std/fs.zig 44 + 4919 455282732 1760154801000000000 9c3f0431c1637a1fc64fa91b0520d1b3 1 std/gpu.zig 45 + 4120 455282747 1760154801000000000 287776a366bc2fa9071678dd14432afc 1 std/hash.zig 46 + 80684 455282748 1760154801000000000 5d2dba5503b8646ccb51c7481cec177d 1 std/hash_map.zig 47 + 35783 455282759 1760154801000000000 291afdd8c7934ab8495ad0cb24e3272b 1 std/heap.zig 48 + 39240 455282767 1760154801000000000 948901b44d7c0b5b43749fa91ebd4552 1 std/http.zig 49 + 5465 455282780 1760154801000000000 050dd347d737c8ab1673d3762b02a7e0 1 std/json.zig 50 + 18649 455282781 1760154801000000000 f1185edfabdd268969ce0577870e98a2 1 std/leb128.zig 51 + 8342 455282782 1760154801000000000 7a79e5053bcf4725fcf9ca5e03c43252 1 std/log.zig 52 + 70826 455282783 1760154801000000000 6a8358e9e839fb48052b1b0c7aa87559 1 std/macho.zig 53 + 74776 455282851 1760154801000000000 d4a0c6126fce11a0cafaea7b313668ac 1 std/math.zig 54 + 185101 455282854 1760154801000000000 bc292b07814f9e246c209f5298245036 1 std/mem.zig 55 + 39789 455282857 1760154801000000000 05e33fd489986e7ef7a2114c8f3040d0 1 std/meta.zig 56 + 88647 455282861 1760154801000000000 caa891873da45c5d032ca6c5c2da3039 1 std/net.zig 57 + 10310 455282954 1760154801000000000 2384f794189b66c622279a439a06e7a5 1 std/os.zig 58 + 2016 455282862 1760154801000000000 b634eff517218815e970c18230425d31 1 std/once.zig 59 + 13947 455282955 1760154801000000000 4e879b4dee70c859bd0938a160593e4c 1 std/pdb.zig 60 + 11147 455282956 1760154801000000000 4c4ae9402f913845c31e3b4781231385 1 std/pie.zig 61 + 290949 455282959 1760154801000000000 f9612ff2c4a8842713d76f25e5978004 1 std/posix.zig 62 + 79140 455282964 1760154801000000000 dd30dcce55de4d9018a7fbd907898b9c 1 std/process.zig 63 + 39596 455282970 1760154801000000000 338f2628729e859f51865caf708004bc 1 std/sort.zig 64 + 23280 455282966 1760154801000000000 8de2dfb1368f1051037084ba56ea4a97 1 std/simd.zig 65 + 16059 455282537 1760154801000000000 7d6ee226b3aea4e399efa02748582a57 1 std/ascii.zig 66 + 42826 455282977 1760154801000000000 55143931b33969e1e759f8623049586c 1 std/tar.zig 67 + 50117 455282980 1760154801000000000 88b236605010f41cfbb7049ca826a88e 1 std/testing.zig 68 + 11575 455282983 1760154801000000000 04290176ff236793a2846b7afe763a99 1 std/time.zig 69 + 11173 455282985 1760154801000000000 a51ee0838574fdd01999198cbeff620f 1 std/tz.zig 70 + 85999 455282988 1760154801000000000 a384b975bb355f986219464058d80145 1 std/unicode.zig 71 + 12292 455282993 1760154801000000000 8757ba546e520503fcc6a58d9b0d0083 1 std/valgrind.zig 72 + 17661 455282994 1760154801000000000 a8988138c7ee50f868cd1db24ab3d1d6 1 std/wasm.zig 73 + 37103 455283037 1760154801000000000 954dfee598538ddb98e9fc105c2e0a39 1 std/zig.zig 74 + 26592 455283038 1760154801000000000 2d4666d88f0c60307ae5724c74a78854 1 std/zip.zig 75 + 1242 455283043 1760154801000000000 c5e5cebc2cfc9353dc65aa5193442b60 1 std/zon.zig 76 + 28071 455282971 1760154801000000000 76d2b688d1d45fbb74ca560efdaac238 1 std/start.zig 77 + 5929 455282677 1760154801000000000 a75e2588e1a73369810b6ba7657e4bfd 1 std/crypto/tlcsprng.zig 78 + 59803 455282435 1760154801000000000 b6406a99c6bcfa6765bfb08eafcbff0d 1 std/Build/Cache.zig 79 + 38694 455282455 1760154801000000000 4bafc6be1344a4b0b4bfce1abc099568 1 std/Build/Step.zig 80 + 26376 455282437 1760154801000000000 bb934510edbc055949ffff1646e5e1e6 1 std/Build/Module.zig 81 + 43006 455282458 1760154801000000000 01457aac972ac3a8e51fa2185c19c1be 1 std/Build/Watch.zig 82 + 17168 455282436 1760154801000000000 907b4dad04e8cdc9fb34a46e35e44fb3 1 std/Build/Fuzz.zig 83 + 30754 455282459 1760154801000000000 9a7faf2066913f9911ffcf2596f0704c 1 std/Build/WebServer.zig 84 + 10407 455282460 1760154801000000000 219f7675797b83c184e56753dff6542a 1 std/Build/abi.zig 85 + 68505 455282469 1760154801000000000 136aa2b3a9c2358af2e6a17cfb4b5311 1 std/Io/Reader.zig 86 + 107573 455282470 1760154801000000000 3f1536dfea295ac1f88cc2d9509e9014 1 std/Io/Writer.zig 87 + 14469 455282464 1760154801000000000 50460af6b2b24665a01f2798a19968d6 1 std/Io/DeprecatedReader.zig 88 + 3660 455282465 1760154801000000000 667198a0bb922d33d2c2fb81a9a25d30 1 std/Io/DeprecatedWriter.zig 89 + 6043 455282472 1760154801000000000 8a44e6b03e4a42b09a4077448a7c41db 1 std/Io/fixed_buffer_stream.zig 90 + 1227 455282471 1760154801000000000 8e42c53c443deeb5a1d9cd2b1a3dbee7 1 std/Io/counting_reader.zig 91 + 5692 455282474 1760154801000000000 1ef2fac09b5b843536005bd1350d920d 1 std/Io/tty.zig 92 + 0 455282473 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Io/test.zig 93 + 1811 455282478 1760154801000000000 4f975bd4c885c2b17936c7c15e2a1fa0 1 std/Random/Ascon.zig 94 + 2685 455282479 1760154801000000000 5244bfd5edd68ad074bfdf866029fa86 1 std/Random/ChaCha.zig 95 + 6100 455282480 1760154801000000000 14fb5367ee7128106466c91abe89d828 1 std/Random/Isaac64.zig 96 + 2727 455282481 1760154801000000000 98b129620d81fc551cc2747eb5e93a2d 1 std/Random/Pcg.zig 97 + 3242 455282485 1760154801000000000 13e05c7b4ba6bd757c30dbc6e1520198 1 std/Random/Xoroshiro128.zig 98 + 3177 455282486 1760154801000000000 ece4176296c0d5a4735a0e13195d3e89 1 std/Random/Xoshiro256.zig 99 + 3158 455282483 1760154801000000000 e0b128479f8a117718ec288761f83ac0 1 std/Random/Sfc64.zig 100 + 3699 455282482 1760154801000000000 f562dad96707be48e6745a1f57cbf27c 1 std/Random/RomuTrio.zig 101 + 530 455282484 1760154801000000000 6862d091fadcbbb652464ab10689bd23 1 std/Random/SplitMix64.zig 102 + 4526 455282489 1760154801000000000 8ac3cfca93be2f623ce661fc9fb27686 1 std/Random/ziggurat.zig 103 + 0 455282488 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Random/test.zig 104 + 29955 455282494 1760154801000000000 7abef445358bc9111ee7720810ab2dfe 1 std/Target/Query.zig 105 + 106498 455282495 1760154801000000000 4e1faa0e06f720a8513cc19957f2cd52 1 std/Target/aarch64.zig 106 + 104612 455282496 1760154801000000000 06339133610c2f04ff7073b54ed9f610 1 std/Target/amdgcn.zig 107 + 1274 455282497 1760154801000000000 c251325fefba8d6614a0692c5ceb2eea 1 std/Target/arc.zig 108 + 79071 455282498 1760154801000000000 c8ffd174d8ea40cc06efcf87bf4b657a 1 std/Target/arm.zig 109 + 71492 455282499 1760154801000000000 8dcc898c0cae23c1a6c85b1acad47ada 1 std/Target/avr.zig 110 + 2425 455282500 1760154801000000000 3376bf5f146580e9b3ce5e329a604817 1 std/Target/bpf.zig 111 + 77604 455282501 1760154801000000000 be007dfe415760a79fc1d9d7dc89a548 1 std/Target/csky.zig 112 + 18058 455282503 1760154801000000000 8ccf22d3bcff20d7636d8251948f4618 1 std/Target/hexagon.zig 113 + 665 455282502 1760154801000000000 1dec26e22b22006cd47d45b427f8a00c 1 std/Target/generic.zig 114 + 1207 455282504 1760154801000000000 2119135642c6ce06557e5005da5d27d3 1 std/Target/lanai.zig 115 + 6753 455282505 1760154801000000000 da13f92a1b8d03cc797a3beeaa2922d6 1 std/Target/loongarch.zig 116 + 7140 455282506 1760154801000000000 85a640161b5e75f1b0e44aafa7b2ac12 1 std/Target/m68k.zig 117 + 16348 455282507 1760154801000000000 12a09875d65985836758c030c651b686 1 std/Target/mips.zig 118 + 2227 455282508 1760154801000000000 f424aba074f946c774143fd6a0cc9b02 1 std/Target/msp430.zig 119 + 16613 455282509 1760154801000000000 166964aa1c4340f0f5e8c2079fbe6806 1 std/Target/nvptx.zig 120 + 36467 455282510 1760154801000000000 aba041f244b5c814708cec688ed2ab9b 1 std/Target/powerpc.zig 121 + 1396 455282511 1760154801000000000 11966b944c6a6f5eb378759087686f44 1 std/Target/propeller.zig 122 + 90023 455282512 1760154801000000000 f9c2faa81a8573bbbf95b94084ffd3be 1 std/Target/riscv.zig 123 + 30256 455282513 1760154801000000000 a3772db647d2b9a091f142be3fe81a5a 1 std/Target/s390x.zig 124 + 21324 455282514 1760154801000000000 dff9a38ced436d7efc5afea4972eb822 1 std/Target/sparc.zig 125 + 5037 455282515 1760154801000000000 7a802abba56de166296a02820267f278 1 std/Target/spirv.zig 126 + 1276 455282516 1760154801000000000 320e5694ddc1e4347015e29952472e47 1 std/Target/ve.zig 127 + 6517 455282517 1760154801000000000 1babc8b342fb599193f79f08f76e9463 1 std/Target/wasm.zig 128 + 139090 455282518 1760154801000000000 6c63cbfe59447c9f4755d8b977fd0e4d 1 std/Target/x86.zig 129 + 1234 455282519 1760154801000000000 9977314bd28dc12c6017784ed96cc578 1 std/Target/xcore.zig 130 + 1274 455282520 1760154801000000000 b20b4af52a8974acb1c9cf688822a23c 1 std/Target/xtensa.zig 131 + 42124 455282524 1760154801000000000 a3d49f74bb65b5f4d7a02d5cac8c7afe 1 std/Thread/Futex.zig 132 + 9112 455282529 1760154801000000000 fe6a25bfea2dcf9533b026b4e0846b98 1 std/Thread/ResetEvent.zig 133 + 10156 455282527 1760154801000000000 f3390bd4b6bae3fe12192885ee63130d 1 std/Thread/Mutex.zig 134 + 2650 455282531 1760154801000000000 3ea6f138fe347f9c36c6331f8ba278e3 1 std/Thread/Semaphore.zig 135 + 23329 455282523 1760154801000000000 6fcf321e05d855b3995cb3a50125c3f8 1 std/Thread/Condition.zig 136 + 11411 455282530 1760154801000000000 215e3b4416494f856a25895960f5a4ca 1 std/Thread/RwLock.zig 137 + 9540 455282528 1760154801000000000 628f9bee010911810b3c9193792c6f53 1 std/Thread/Pool.zig 138 + 1988 455282532 1760154801000000000 6793266710d780758ac32c2edcc166a9 1 std/Thread/WaitGroup.zig 139 + 59140 455282544 1760154801000000000 92182faee34134d52a9ad2d0a5a5fb2f 1 std/builtin/assembly.zig 140 + 50235 455282547 1760154801000000000 9708ebe35d8d2550494584ceeba81209 1 std/c/darwin.zig 141 + 11274 455282549 1760154801000000000 09bec7c3f40f6de5099b6d1914d351cf 1 std/c/freebsd.zig 142 + 9878 455282554 1760154801000000000 ab1e53cee5c67832574a9055e0108e66 1 std/c/solaris.zig 143 + 6617 455282551 1760154801000000000 d16786c18fabd57be5a8635a6ef08bb1 1 std/c/netbsd.zig 144 + 3875 455282548 1760154801000000000 907c436f260d11e9f80420d838051111 1 std/c/dragonfly.zig 145 + 15535 455282550 1760154801000000000 43ebba145dd0318d69788910b66220e7 1 std/c/haiku.zig 146 + 13681 455282552 1760154801000000000 06689937d111c195fd6baae889fc720b 1 std/c/openbsd.zig 147 + 3099 455282553 1760154801000000000 6a897bb99820db129b41bc2b5d6046bb 1 std/c/serenity.zig 148 + 6341 455282565 1760154801000000000 33490794e8bee84517ccfebe261d4eae 1 std/compress/flate.zig 149 + 3010 455282573 1760154801000000000 e6aae4a5afa281030d98b006a53807e0 1 std/compress/lzma.zig 150 + 894 455282576 1760154801000000000 0112dea02a7ad758670754ecb2e3ff09 1 std/compress/lzma2.zig 151 + 5317 455282580 1760154801000000000 23792685eae819b737bc8922607d4ba7 1 std/compress/xz.zig 152 + 6605 455282583 1760154801000000000 295f3b5136806a9f26e893c51e33025d 1 std/compress/zstd.zig 153 + 10441 455282676 1760154801000000000 b922de5f94704738f619903775fecb17 1 std/crypto/timing_safe.zig 154 + 47614 455282600 1760154801000000000 a03a980a4a1a9a95bf94441f8c307101 1 std/crypto/aegis.zig 155 + 6851 455282606 1760154801000000000 ea7fad6fda828c72abcc0148e4659e9c 1 std/crypto/aes_gcm.zig 156 + 15331 455282607 1760154801000000000 250e8a7b0eaeef0184fd38096c7a562a 1 std/crypto/aes_ocb.zig 157 + 51909 455282614 1760154801000000000 451cb3546d86929665419cd05bea0293 1 std/crypto/chacha20.zig 158 + 6309 455282638 1760154801000000000 1318dc8b9450bda7d30b2f2bd66ef98f 1 std/crypto/isap.zig 159 + 27260 455282670 1760154801000000000 b95f25fd28a65f6f71761d12efaee503 1 std/crypto/salsa20.zig 160 + 3626 455282637 1760154801000000000 7d28bd5a64f521b7f7322612e4d5f562 1 std/crypto/hmac.zig 161 + 18629 455282674 1760154801000000000 0ee80c1bcfed0bfc7fe20c0fd3c04d22 1 std/crypto/siphash.zig 162 + 6226 455282615 1760154801000000000 4270e1555211de4aca948cd086fc7129 1 std/crypto/cmac.zig 163 + 8993 455282605 1760154801000000000 1565baef5de85c1722fc1f3661e7418c 1 std/crypto/aes.zig 164 + 15303 455282639 1760154801000000000 ac2b7ab43674f07a4208ffa738f420c5 1 std/crypto/keccak_p.zig 165 + 9666 455282609 1760154801000000000 bfcf52448d42cda00bcaa777deca80cf 1 std/crypto/ascon.zig 166 + 2303 455282642 1760154801000000000 64e2696fd33ff024c44aee16a197afac 1 std/crypto/modes.zig 167 + 8666 455282593 1760154801000000000 3f63b88b98e1cb4a076af7d105c52b5f 1 std/crypto/25519/x25519.zig 168 + 65291 455282641 1760154801000000000 d602189df4b86e3751c21259bc485f24 1 std/crypto/ml_kem.zig 169 + 8492 455282587 1760154801000000000 1ad8b856fa664e2584776361ba03bdc0 1 std/crypto/25519/curve25519.zig 170 + 25932 455282589 1760154801000000000 a2d994ac2ed36751f95ac92b85a4931d 1 std/crypto/25519/edwards25519.zig 171 + 16174 455282651 1760154801000000000 1624d5389942bffd6016dc87453db0b7 1 std/crypto/pcurves/p256.zig 172 + 16370 455282657 1760154801000000000 c7fb645fa9fd8e26db3c4252856cdc9d 1 std/crypto/pcurves/p384.zig 173 + 7971 455282591 1760154801000000000 d0d33655dcbd80c50d53283108a54034 1 std/crypto/25519/ristretto255.zig 174 + 20520 455282663 1760154801000000000 e8ead8fcc9affae7d203ecb87a0e8236 1 std/crypto/pcurves/secp256k1.zig 175 + 29319 455282612 1760154801000000000 30d94c7ccda432eb5df2b6e7c68e0c35 1 std/crypto/blake2.zig 176 + 41428 455282613 1760154801000000000 711b0501d46a7c267b6f90ee8be3aacd 1 std/crypto/blake3.zig 177 + 9751 455282640 1760154801000000000 d4911af79a2684c60a4325e9142b1609 1 std/crypto/md5.zig 178 + 9321 455282599 1760154801000000000 15ebe6e9b9de51b93b00e1b463f00cb4 1 std/crypto/Sha1.zig 179 + 36825 455282672 1760154801000000000 bfc45b688f4f79b09cd3fa2ec3ce7a9e 1 std/crypto/sha2.zig 180 + 35726 455282673 1760154801000000000 74ba21545a132750f9a4eef5a37da502 1 std/crypto/sha3.zig 181 + 2756 455282635 1760154801000000000 3f1b15f01d5b6045525b1b5b73081e67 1 std/crypto/hash_composition.zig 182 + 3703 455282636 1760154801000000000 09d36564cbdc5d24ea6fa90e4b7dd6e5 1 std/crypto/hkdf.zig 183 + 20494 455282634 1760154801000000000 c857473fa22ec9e817a3c52e298e2eec 1 std/crypto/ghash_polyval.zig 184 + 7259 455282669 1760154801000000000 1b5aed273103196d0bdc885bc2b6ec2c 1 std/crypto/poly1305.zig 185 + 28906 455282608 1760154801000000000 da61f4b2f151f214129e329fd7af44dc 1 std/crypto/argon2.zig 186 + 37669 455282610 1760154801000000000 147c9e47e9a5a805c79882ce141f1fad 1 std/crypto/bcrypt.zig 187 + 25878 455282671 1760154801000000000 21725e7f671298d416186499754301ea 1 std/crypto/scrypt.zig 188 + 8451 455282643 1760154801000000000 e0bc6ddf2119b9cfe2a19626ded9635a 1 std/crypto/pbkdf2.zig 189 + 13838 455282668 1760154801000000000 7867fa74be498feed958e4107163a822 1 std/crypto/phc_encoding.zig 190 + 31401 455282588 1760154801000000000 727ee4c7eeb22bc4a90a96437f332593 1 std/crypto/25519/ed25519.zig 191 + 395201 455282631 1760154801000000000 4f4d382c531f90a2b4550ea4207a4d70 1 std/crypto/ecdsa.zig 192 + 38465 455282633 1760154801000000000 5ec16eac7226fcb11dbfeba8f371ee79 1 std/crypto/ff.zig 193 + 165 455282630 1760154801000000000 0ab9a19cc7544d7896d8555b38c3292a 1 std/crypto/codecs.zig 194 + 1715 455282632 1760154801000000000 f0b8832dd923baeda761e9855ed9d1ab 1 std/crypto/errors.zig 195 + 25575 455282680 1760154801000000000 05de4a472e23ccd4ece1a15329fc0dcb 1 std/crypto/tls.zig 196 + 50895 455282598 1760154801000000000 37739975874d2d5867dbd6043614417c 1 std/crypto/Certificate.zig 197 + 4783 455282691 1760154801000000000 bcebc8664d30ed61fbe6f4f52df7e6c8 1 std/debug/MemoryAccessor.zig 198 + 2664 455282689 1760154801000000000 d18c45d7c3943d59326b6215041f7b9b 1 std/debug/FixedBufferReader.zig 199 + 95718 455282688 1760154801000000000 031ee6c2142eb78ee4d751fdef4e8aee 1 std/debug/Dwarf.zig 200 + 22200 455282692 1760154801000000000 cadc751a24d7fe6cd0045c67d91fccc4 1 std/debug/Pdb.zig 201 + 90918 455282693 1760154801000000000 1af6e89bf60261270c63c0b89b93dbe4 1 std/debug/SelfInfo.zig 202 + 2274 455282690 1760154801000000000 a1cbdaf27c5043ba4157f3a1bfcd68fd 1 std/debug/Info.zig 203 + 8486 455282683 1760154801000000000 2ff9c5b27e3411a59088d247231e9d0f 1 std/debug/Coverage.zig 204 + 3221 455282695 1760154801000000000 ff7b6d80307d98046c1a6b71ce9736cb 1 std/debug/simple_panic.zig 205 + 2349 455282694 1760154801000000000 58f6d8954e49f4e277db7b9bad6e1f3c 1 std/debug/no_panic.zig 206 + 3939 455282704 1760154801000000000 5ee5df976eaaf300e36cd234fc3f2f43 1 std/dwarf/TAG.zig 207 + 7632 455282698 1760154801000000000 101aeaf3e9df594bf04093c15135dc96 1 std/dwarf/AT.zig 208 + 5693 455282703 1760154801000000000 01d731f8d28ba8382ff3c5885d5e0c75 1 std/dwarf/OP.zig 209 + 1963 455282702 1760154801000000000 055280c08a34f56d3d4ea7d69cf3fca3 1 std/dwarf/LANG.zig 210 + 1399 455282701 1760154801000000000 40a7d4ac60d12c6e9ca294acaed35474 1 std/dwarf/FORM.zig 211 + 1479 455282699 1760154801000000000 8bd901aaa561652b86f99819d0da7a57 1 std/dwarf/ATE.zig 212 + 643 455282700 1760154801000000000 6f6a9e4e1602df062ad02179710971c4 1 std/dwarf/EH.zig 213 + 94944 455282710 1760154801000000000 f351cb76a2427938af1d074abce787ce 1 std/fmt/float.zig 214 + 13189 455282721 1760154801000000000 8fcd1365fb1fe2c743d223fc34880b6a 1 std/fmt/parse_float.zig 215 + 2845 455282724 1760154801000000000 4f058fd80be3876870bc26a123c9de42 1 std/fs/AtomicFile.zig 216 + 115037 455282725 1760154801000000000 ad15ff549e0ce2f53861a15a248cb609 1 std/fs/Dir.zig 217 + 85774 455282726 1760154801000000000 506ab4301360b02d7f84b4e4e163ff28 1 std/fs/File.zig 218 + 78108 455282728 1760154801000000000 be1cf725a1de08084d5bf813f6758d74 1 std/fs/path.zig 219 + 1888 455282730 1760154801000000000 2c143a188f1f9a5e0b6cf6eb3a2a3825 1 std/fs/wasi.zig 220 + 2665 455282727 1760154801000000000 a74f4aed0521f238f302bbce59933ebd 1 std/fs/get_app_data_dir.zig 221 + 0 455282729 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/fs/test.zig 222 + 2797 455282734 1760154801000000000 e2d2903d78455f002bdf1543be5bd9b3 1 std/hash/Adler32.zig 223 + 14624 455282735 1760154801000000000 5d40bb3c14d452873d2170a0dc501e12 1 std/hash/auto_hash.zig 224 + 19972 455282741 1760154801000000000 c36dede4b91e35db37ea45c66dbe6fe9 1 std/hash/crc.zig 225 + 1890 455282742 1760154801000000000 8022a7844b1545ef9cc7889a3a71944a 1 std/hash/fnv.zig 226 + 9977 455282743 1760154801000000000 26add2cb2571b835338f163c8ca63459 1 std/hash/murmur.zig 227 + 12412 455282737 1760154801000000000 cd681dc3507b42839b769eae04b1dc3b 1 std/hash/cityhash.zig 228 + 8367 455282745 1760154801000000000 4744eb583f951c0ddcee1cf3bdde33fb 1 std/hash/wyhash.zig 229 + 41799 455282746 1760154801000000000 ee3e90d0630039df9f6254b022ce80e1 1 std/hash/xxhash.zig 230 + 13560 455282755 1760154801000000000 12f037849d64048bd40c550289bf0826 1 std/heap/arena_allocator.zig 231 + 7465 455282752 1760154801000000000 c45d8aa65e37758c03dbedc65850dbf5 1 std/heap/SmpAllocator.zig 232 + 7575 455282750 1760154801000000000 b8819311409154f2ecf659e0c1e915b6 1 std/heap/FixedBufferAllocator.zig 233 + 8217 455282751 1760154801000000000 fb438f5e75bc8857d9d1a5b0e9421e85 1 std/heap/PageAllocator.zig 234 + 7469 455282758 1760154801000000000 d0066bdd4d2784177387f85d9c416259 1 std/heap/sbrk_allocator.zig 235 + 1681 455282753 1760154801000000000 720fc81adedeb4b35463081496f20d4a 1 std/heap/ThreadSafeAllocator.zig 236 + 10472 455282754 1760154801000000000 21ee044c07f5991f129755da06deea5a 1 std/heap/WasmAllocator.zig 237 + 59918 455282756 1760154801000000000 552ab3f08dc9b1a495663dc5b84ab562 1 std/heap/debug_allocator.zig 238 + 8049 455282757 1760154801000000000 cd6c38f86fa0a1bd7ddaa85a0e7f94f7 1 std/heap/memory_pool.zig 239 + 70726 455282762 1760154801000000000 aa5ce17d76ef4eee632f9862adf3aa9f 1 std/http/Client.zig 240 + 31360 455282765 1760154801000000000 abd6ae4080522f73e4745e5efce346dc 1 std/http/Server.zig 241 + 13015 455282763 1760154801000000000 4c7e2ad894ad12f141066550c9bb326a 1 std/http/HeadParser.zig 242 + 3791 455282761 1760154801000000000 61420280e3c9986a74a687031fdcf831 1 std/http/ChunkParser.zig 243 + 3108 455282764 1760154801000000000 149ac2b5413f4e7bdf793b3740a63558 1 std/http/HeaderIterator.zig 244 + 0 455282766 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/http/test.zig 245 + 7996 455282772 1760154801000000000 8b3aa35651f2969c3a859a3fab94f443 1 std/json/dynamic.zig 246 + 3272 455282774 1760154801000000000 39fdbe23f321a0cb11a35e428810a09e 1 std/json/hashmap.zig 247 + 72868 455282770 1760154801000000000 ae7b2e59c7744ce34ba98c07df5ef06b 1 std/json/Scanner.zig 248 + 33944 455282777 1760154801000000000 1ce81c644431a9617acab806f3e0fa7a 1 std/json/static.zig 249 + 37319 455282771 1760154801000000000 48c6d66b659b03b4e105add369592eda 1 std/json/Stringify.zig 250 + 0 455282779 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/test.zig 251 + 0 455282769 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/JSONTestSuite_test.zig 252 + 12048 455282824 1760154801000000000 423025cbe9a3339e236aaf0fc007496c 1 std/math/float.zig 253 + 1681 455282832 1760154801000000000 23aba00e34aa5a807ee8d4bddf2738c5 1 std/math/isnan.zig 254 + 7877 455282825 1760154801000000000 21099ae36d31e459824cfc3757a834f2 1 std/math/frexp.zig 255 + 4458 455282842 1760154801000000000 78dbab36632b04ee9c8bc0e72a713100 1 std/math/modf.zig 256 + 1136 455282820 1760154801000000000 9f0946a16071ec7d7cb9f45c227c22f1 1 std/math/copysign.zig 257 + 1083 455282830 1760154801000000000 eb357e7577b828d5fc2ce3b4118459f2 1 std/math/isfinite.zig 258 + 1775 455282831 1760154801000000000 44fb86a5536455ca3877bb415347c6ac 1 std/math/isinf.zig 259 + 1456 455282834 1760154801000000000 a37461dca6f9345d8f8a2729c13b9ff6 1 std/math/iszero.zig 260 + 1837 455282833 1760154801000000000 cb4e66e7b3adbf190150294715c788b0 1 std/math/isnormal.zig 261 + 19209 455282843 1760154801000000000 000ec81e9c79a332fb482883ab800777 1 std/math/nextafter.zig 262 + 1557 455282847 1760154801000000000 3157574850d20851e8580a398e6895a9 1 std/math/signbit.zig 263 + 503 455282846 1760154801000000000 66d1263715127908b281862dba5dc24b 1 std/math/scalbn.zig 264 + 6839 455282836 1760154801000000000 65cf74d2abee4d99cea2993060dc9cc0 1 std/math/ldexp.zig 265 + 9113 455282844 1760154801000000000 2a24fb6143c914862a5d74c95a9f8b13 1 std/math/pow.zig 266 + 7647 455282845 1760154801000000000 0973f1b6b3c7b008fe03e68add8caaab 1 std/math/powi.zig 267 + 2837 455282849 1760154801000000000 50e9a695059ca6bb04cd979304e4c09b 1 std/math/sqrt.zig 268 + 4812 455282796 1760154801000000000 6f62d1f1ae7bff93c034f6f664aeaa12 1 std/math/cbrt.zig 269 + 5378 455282785 1760154801000000000 25b4039f6f32ddc437baa4061a3f8c3d 1 std/math/acos.zig 270 + 5337 455282787 1760154801000000000 eb35acdb17b747cc2f790e4ff8666d54 1 std/math/asin.zig 271 + 7275 455282789 1760154801000000000 5d8af88aea5f35ce7e37d0f0af8a4baf 1 std/math/atan.zig 272 + 10553 455282790 1760154801000000000 0cafcb907ba579b6b64631165a647329 1 std/math/atan2.zig 273 + 4748 455282828 1760154801000000000 910e3c3ba1e7626618c73be7f12f9319 1 std/math/hypot.zig 274 + 11499 455282822 1760154801000000000 1ddb2b66fbdf7acb2a4ad484203ae340 1 std/math/expm1.zig 275 + 5519 455282829 1760154801000000000 eacf48263508740f77738f675caef7a6 1 std/math/ilogb.zig 276 + 2531 455282837 1760154801000000000 b3b40fd4682f372913e09bc18ca3fcd6 1 std/math/log.zig 277 + 1919 455282840 1760154801000000000 a350e2bd40b9fc740607c3d658668abb 1 std/math/log2.zig 278 + 5553 455282838 1760154801000000000 e10fe90c6d01abfe27b7f2ee6e929a68 1 std/math/log10.zig 279 + 4219 455282841 1760154801000000000 88ffa0f96518ccc1715935c0618e543e 1 std/math/log_int.zig 280 + 8872 455282839 1760154801000000000 754de08c8dc06a6115beb96e5a991ad7 1 std/math/log1p.zig 281 + 4299 455282788 1760154801000000000 9d6c681faf8421823919e5bf347bf740 1 std/math/asinh.zig 282 + 2756 455282786 1760154801000000000 349667a0bb1e62bdc0383bce5747190c 1 std/math/acosh.zig 283 + 3399 455282791 1760154801000000000 7b22337c4a4df112f2c4be431b076007 1 std/math/atanh.zig 284 + 4294 455282848 1760154801000000000 42ef534228feb279b81e6fa2a5d79333 1 std/math/sinh.zig 285 + 4157 455282821 1760154801000000000 1dcc281bf0ca8a9782e5ae845f7b1fa5 1 std/math/cosh.zig 286 + 4581 455282850 1760154801000000000 2b64632014a58c73e7052420b356fcaa 1 std/math/tanh.zig 287 + 2024 455282827 1760154801000000000 28fd0ee50d92f0c08fd6aab95d6f15ee 1 std/math/gcd.zig 288 + 1194 455282835 1760154801000000000 40b3836f0a2277cb76754547dd483869 1 std/math/lcm.zig 289 + 11487 455282826 1760154801000000000 c0bf0098a075fd684bcbeff41e5abbc4 1 std/math/gamma.zig 290 + 6563 455282819 1760154801000000000 dccdf309b3630a59978e204ea0cbde99 1 std/math/complex.zig 291 + 746 455282795 1760154801000000000 cd57ee7b96c9ee1b66a3e7fc3ef16da9 1 std/math/big.zig 292 + 17806 455282853 1760154801000000000 83d7eca4345a674e2c9b3eb780fe9bd9 1 std/mem/Allocator.zig 293 + 6027 455282856 1760154801000000000 a9b245c6e260e2a4606e53d2d51f65c6 1 std/meta/trailer_flags.zig 294 + 0 455282860 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/net/test.zig 295 + 284102 455282897 1760154801000000000 3b47cf9538b4e1fc4671c5ae183d1d05 1 std/os/linux.zig 296 + 10460 455282900 1760154801000000000 488b62d22bbe9301ab373d2949f7d23b 1 std/os/plan9.zig 297 + 7746 455282938 1760154801000000000 931017d063b5a98aee21c888aac3dc3d 1 std/os/uefi.zig 298 + 16108 455282939 1760154801000000000 3cfe5b8a9735273d6782d1c456b08f15 1 std/os/wasi.zig 299 + 34093 455282864 1760154801000000000 d0e8187f608f5706844bd3662b1ea1ad 1 std/os/emscripten.zig 300 + 207257 455282953 1760154801000000000 773327deeb78ed0db89c9fa256583be1 1 std/os/windows.zig 301 + 2097 455282865 1760154801000000000 6b77b7f42ffec7eedf37dfecdfdd7014 1 std/os/freebsd.zig 302 + 0 455282958 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/posix/test.zig 303 + 72495 455282963 1760154801000000000 1abeeac93914da7ad3620fbfad5f1f43 1 std/process/Child.zig 304 + 51714 455282968 1760154801000000000 eb8790d984ce4a6ddd6376d877c85ff1 1 std/sort/block.zig 305 + 12404 455282969 1760154801000000000 4aec5577b3c4edbe484599906af3ae5d 1 std/sort/pdq.zig 306 + 17117 455282975 1760154801000000000 5e6a75c2975430f5d46623d1537855a5 1 std/tar/Writer.zig 307 + 0 455282976 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/tar/test.zig 308 + 5694 455282979 1760154801000000000 cd71b2d90772c02d65444191f9fd7d5d 1 std/testing/FailingAllocator.zig 309 + 6764 455282982 1760154801000000000 c674a37722ac57c1bfc929140e058755 1 std/time/epoch.zig 310 + 7574 455282992 1760154801000000000 d017fea857f95f2c01199efab8dbf965 1 std/valgrind/memcheck.zig 311 + 2493 455282991 1760154801000000000 30a771b8491dd283a50c6166babded38 1 std/valgrind/callgrind.zig 312 + 1249 455282990 1760154801000000000 6781a2e56089a14f4f2a391169bf7c05 1 std/valgrind/cachegrind.zig 313 + 62827 455283036 1760154801000000000 d1f5a0dbf135b754ed6a703e23df50e6 1 std/zig/tokenizer.zig 314 + 32614 455283003 1760154801000000000 198542319824c4a3f109c64260324d68 1 std/zig/ErrorBundle.zig 315 + 7166 455283007 1760154801000000000 860d7dc4b9813278374fb24397bb0a4d 1 std/zig/Server.zig 316 + 1605 455283002 1760154801000000000 7cfa1ea3449449667ebf6c5201f6dbaf 1 std/zig/Client.zig 317 + 14323 455283024 1760154801000000000 7e26c1a770304af7ccd5f605ada0a2e5 1 std/zig/string_literal.zig 318 + 6720 455283020 1760154801000000000 07baee4aa2d7c097b1307a2cdec422cf 1 std/zig/number_literal.zig 319 + 1666 455283023 1760154801000000000 87e0eb501395d68ddce525f8555f960c 1 std/zig/primitives.zig 320 + 148759 455282998 1760154801000000000 5f6f4c60784f8ab4107f3383e980dfca 1 std/zig/Ast.zig 321 + 568292 455282999 1760154801000000000 cd6d40183f2ae21282fd3d5fbbfc8238 1 std/zig/AstGen.zig 322 + 204779 455283009 1760154801000000000 4104285d49190afffd58ec1c3544ed4a 1 std/zig/Zir.zig 323 + 9166 455283010 1760154801000000000 6e1c16d90de3a0ffaeaf1d478014a072 1 std/zig/Zoir.zig 324 + 36096 455283011 1760154801000000000 a625edc6603167137dcd761c6dc77e82 1 std/zig/ZonGen.zig 325 + 58192 455283034 1760154801000000000 5bdfb45767fdafcc0df8cbf9812e246f 1 std/zig/system.zig 326 + 21416 455283001 1760154801000000000 d1b3749b34a2551f94643e698928aae0 1 std/zig/BuiltinFn.zig 327 + 41574 455283000 1760154801000000000 a042f3e8774e8bd3822b35117bbc3d78 1 std/zig/AstRlAnnotate.zig 328 + 36100 455283005 1760154801000000000 62fa4ce130060129db4288d3749f2488 1 std/zig/LibCInstallation.zig 329 + 45848 455283008 1760154801000000000 e70747937d94d1333d148947c57547da 1 std/zig/WindowsSdk.zig 330 + 9786 455283004 1760154801000000000 280d2bdf0f1a8f96ecaa4af86ba0a60e 1 std/zig/LibCDirs.zig 331 + 25071 455283035 1760154801000000000 959e2ad518bd8b10bbd16a31cfe2cf7a 1 std/zig/target.zig 332 + 247 455283019 1760154801000000000 4fee6920e55c663811dd32d69b7f2937 1 std/zig/llvm.zig 333 + 8713 455283012 1760154801000000000 53cfae8a8276d7204622550f50243f6b 1 std/zig/c_builtins.zig 334 + 28363 455283013 1760154801000000000 e2c60f43c6ae6eb4e168dc7fabd2138a 1 std/zig/c_translation.zig 335 + 117417 455283041 1760154801000000000 44bbbfd954ceece2effe8772c11d2f24 1 std/zon/parse.zig 336 + 46916 455283042 1760154801000000000 7bf4408cdd1c84975a793e5daefb12a8 1 std/zon/stringify.zig 337 + 32288 455283040 1760154801000000000 5eeb9845ed3d086fe03083e2f7b9e446 1 std/zon/Serializer.zig 338 + 2159 455282950 1760154801000000000 e912d0164349d3c86eb8b1226a86388f 1 std/os/windows/tls.zig 339 + 10957 455263894 1760154801000000000 86adef0c76818174cbce959185f8aa9c 1 compiler_rt/common.zig 340 + 7394 455263899 1760154801000000000 4d63e8360c0ca220253582124186fb27 1 compiler_rt/count0bits.zig 341 + 1385 455264084 1760154801000000000 929736d7c0636ec88ef908c0b4c15a65 1 compiler_rt/parity.zig 342 + 1916 455264088 1760154801000000000 9e893175f43f5d42fd541260ca5386e7 1 compiler_rt/popcount.zig 343 + 2762 455263872 1760154801000000000 972f20e5339815a5e21e7b0bc6202353 1 compiler_rt/bitreverse.zig 344 + 3260 455263876 1760154801000000000 0ec938dfe8c0a2d466838df303eef58d 1 compiler_rt/bswap.zig 345 + 1971 455263885 1760154801000000000 f4b500a005ae4486ff3df7110a9e2523 1 compiler_rt/cmp.zig 346 + 4845 455264098 1760154801000000000 8761326b4fa02822928e9a2bf1845ea7 1 compiler_rt/shift.zig 347 + 1171 455264070 1760154801000000000 b64a4252e2958ab85e11cf3e72046c01 1 compiler_rt/negXi2.zig 348 + 27737 455264037 1760154801000000000 0dc9529debd21eeb1908af208d1f2e9e 1 compiler_rt/int.zig 349 + 3064 455264049 1760154801000000000 c4a4e1485c87b5438551c701951d1b90 1 compiler_rt/mulXi3.zig 350 + 1113 455263917 1760154801000000000 8a9686a30bb60ded94cfbc7b0c188192 1 compiler_rt/divti3.zig 351 + 770 455264140 1760154801000000000 6c53a5d81aa4786ec59e8bd320265f7d 1 compiler_rt/udivti3.zig 352 + 1380 455264047 1760154801000000000 e03900eae21e2b320a2e62fc03e5074f 1 compiler_rt/modti3.zig 353 + 846 455264141 1760154801000000000 afc9b4b801628d3040423cf318155f2f 1 compiler_rt/umodti3.zig 354 + 671 455263848 1760154801000000000 a6cfe83f9d8eb6e22dee6dc0ccee3367 1 compiler_rt/absv.zig 355 + 311 455263851 1760154801000000000 9a044dbb5695c2eea3bda231bfeda676 1 compiler_rt/absvsi2.zig 356 + 311 455263849 1760154801000000000 0c0607d153f93dee28f63beeb116cbc1 1 compiler_rt/absvdi2.zig 357 + 314 455263853 1760154801000000000 d826815938d3df68320935b9968c29db 1 compiler_rt/absvti2.zig 358 + 1303 455264078 1760154801000000000 50df1f7234ac1a8d4f2093362c90b93e 1 compiler_rt/negv.zig 359 + 874 455263865 1760154801000000000 02f065d511a9d47115363632c4dbdeda 1 compiler_rt/addvsi3.zig 360 + 860 455264114 1760154801000000000 28391dec7d271786c0a340a5d698d3ba 1 compiler_rt/subvsi3.zig 361 + 932 455264113 1760154801000000000 c20c4bc9d2bbfbdf0b900e7d7218879e 1 compiler_rt/subvdi3.zig 362 + 902 455264067 1760154801000000000 45f09fd05e65513dfd810114991820f4 1 compiler_rt/mulvsi3.zig 363 + 1752 455263859 1760154801000000000 1e067dd191e3750e2eebc9a9891bfe8d 1 compiler_rt/addo.zig 364 + 1742 455264107 1760154801000000000 a6e4dadcd9f88d3c47b48642ea0242d5 1 compiler_rt/subo.zig 365 + 2643 455264059 1760154801000000000 7437cfee5e2a6d47f221d2f163a92242 1 compiler_rt/mulo.zig 366 + 6009 455263927 1760154801000000000 013ab2758ced7bbc2fc6988565eeb6c7 1 compiler_rt/extendf.zig 367 + 920 455263930 1760154801000000000 f422913a85e1e91ef2039ab58547c0fc 1 compiler_rt/extendhfsf2.zig 368 + 373 455263929 1760154801000000000 ed651ccba735e247ddf2016832e06f1c 1 compiler_rt/extendhfdf2.zig 369 + 376 455263931 1760154801000000000 0c74a49a05b638424700546195a373ee 1 compiler_rt/extendhftf2.zig 370 + 373 455263932 1760154801000000000 23b1c51db225608b57400e8118ffa9ec 1 compiler_rt/extendhfxf2.zig 371 + 644 455263933 1760154801000000000 5bd066e81499f866ae53e4e86d5e5c07 1 compiler_rt/extendsfdf2.zig 372 + 781 455263934 1760154801000000000 e52fbda9a494609786f8fcb77d847604 1 compiler_rt/extendsftf2.zig 373 + 360 455263935 1760154801000000000 e942ea8b9c6b17baaeea42c96e99effa 1 compiler_rt/extendsfxf2.zig 374 + 781 455263925 1760154801000000000 87ecde8777ad8ff8ed4dbc9c650f0270 1 compiler_rt/extenddftf2.zig 375 + 364 455263926 1760154801000000000 9f715eab9e2e310deef980aead0e7500 1 compiler_rt/extenddfxf2.zig 376 + 1604 455263936 1760154801000000000 c4862b4d4cfcee360ed2c56a114cbf4a 1 compiler_rt/extendxftf2.zig 377 + 8121 455264121 1760154801000000000 20afe15564559323e44421df48412060 1 compiler_rt/truncf.zig 378 + 881 455264123 1760154801000000000 47d13f34934c26c69eb88e81670d8f85 1 compiler_rt/truncsfhf2.zig 379 + 616 455264119 1760154801000000000 0641d56997ae4f4b5207adc68dc72f3b 1 compiler_rt/truncdfhf2.zig 380 + 600 455264120 1760154801000000000 02da0cc6b32c97637c74cbb10ccb54db 1 compiler_rt/truncdfsf2.zig 381 + 356 455264129 1760154801000000000 3bf820f222640094f3a72a66ffe8198e 1 compiler_rt/truncxfhf2.zig 382 + 333 455264130 1760154801000000000 66119941d376ee0a437b06bd3072d524 1 compiler_rt/truncxfsf2.zig 383 + 333 455264128 1760154801000000000 c13541abc36c28230d412dc5252b693e 1 compiler_rt/truncxfdf2.zig 384 + 359 455264125 1760154801000000000 d8f660a94187293e5a911454282b4029 1 compiler_rt/trunctfhf2.zig 385 + 731 455264126 1760154801000000000 13584c74605e851e6d831a9e0fce9886 1 compiler_rt/trunctfsf2.zig 386 + 731 455264124 1760154801000000000 457c0f6c909aa10450fd884ff88287f9 1 compiler_rt/trunctfdf2.zig 387 + 2852 455264127 1760154801000000000 d8494bd8878af1312bf45635b710a4b1 1 compiler_rt/trunctfxf2.zig 388 + 4079 455264038 1760154801000000000 5a505058b770b465ce081eb6a57e7a43 1 compiler_rt/int_from_float.zig 389 + 341 455263947 1760154801000000000 287cd5239eed800fcc228dfe9a2734d4 1 compiler_rt/fixhfsi.zig 390 + 341 455263945 1760154801000000000 8acd6b1ce769a390c40385d65d7fad51 1 compiler_rt/fixhfdi.zig 391 + 713 455263948 1760154801000000000 f02a5506718df6aec134d680607bf58f 1 compiler_rt/fixhfti.zig 392 + 564 455263946 1760154801000000000 9ae4ea7e25821706c5468c7c2c445448 1 compiler_rt/fixhfei.zig 393 + 616 455263952 1760154801000000000 703dfbffebdc9fddd06b6c8d668e5e6a 1 compiler_rt/fixsfsi.zig 394 + 701 455263950 1760154801000000000 88e7049e069292d16c1ff8720dff21c5 1 compiler_rt/fixsfdi.zig 395 + 713 455263953 1760154801000000000 27665f157ae97b6a905d2c3b3d14b55c 1 compiler_rt/fixsfti.zig 396 + 564 455263951 1760154801000000000 9296a734389623faf0ccbbce95248896 1 compiler_rt/fixsfei.zig 397 + 616 455263943 1760154801000000000 d6c6cfff39408568470a4ce56f20701b 1 compiler_rt/fixdfsi.zig 398 + 701 455263941 1760154801000000000 d37fe214a882924d291912211617b7e0 1 compiler_rt/fixdfdi.zig 399 + 713 455263944 1760154801000000000 acf45affbae83f950121a0e78d1d9d43 1 compiler_rt/fixdfti.zig 400 + 564 455263942 1760154801000000000 475c0ed3637871aa4bdba39fb7ac07c7 1 compiler_rt/fixdfei.zig 401 + 736 455263956 1760154801000000000 9e04b0c9b7e24d0a417e6418967a82bf 1 compiler_rt/fixtfsi.zig 402 + 736 455263954 1760154801000000000 54e8e270c03030539e0b628265ebe138 1 compiler_rt/fixtfdi.zig 403 + 867 455263957 1760154801000000000 159fff04699a850f0877d0d860fc5c23 1 compiler_rt/fixtfti.zig 404 + 565 455263955 1760154801000000000 f3202275d298913c25f0f8dfd3242be8 1 compiler_rt/fixtfei.zig 405 + 341 455263980 1760154801000000000 c5d9b1d68c225613e28b45cb4cec11bc 1 compiler_rt/fixxfsi.zig 406 + 341 455263978 1760154801000000000 87e625ba575a65977f04b534e5fc766d 1 compiler_rt/fixxfdi.zig 407 + 713 455263981 1760154801000000000 66c8929d08870c9d48875898ac51d464 1 compiler_rt/fixxfti.zig 408 + 564 455263979 1760154801000000000 4e4a4e4ac45142bc6c99b298914cc0e4 1 compiler_rt/fixxfei.zig 409 + 350 455263964 1760154801000000000 ba04537148169a4eda9cc74755e9d2b2 1 compiler_rt/fixunshfsi.zig 410 + 350 455263962 1760154801000000000 3f19d12e7ff9198e211b2298b6bd5efc 1 compiler_rt/fixunshfdi.zig 411 + 731 455263965 1760154801000000000 3dc5d5bb0159c254a4dc44defc534d08 1 compiler_rt/fixunshfti.zig 412 + 575 455263963 1760154801000000000 7747207f7d598d23ace14265322b94f9 1 compiler_rt/fixunshfei.zig 413 + 628 455263968 1760154801000000000 57232664ed8c180d0347c1a5b7fb707c 1 compiler_rt/fixunssfsi.zig 414 + 713 455263966 1760154801000000000 7ccb1263e66738a414ca7a9521baf546 1 compiler_rt/fixunssfdi.zig 415 + 731 455263969 1760154801000000000 46aa3b64c89e9e65d2ce377e2fda821b 1 compiler_rt/fixunssfti.zig 416 + 575 455263967 1760154801000000000 38283592b0bac48f035456b4aa28b777 1 compiler_rt/fixunssfei.zig 417 + 628 455263960 1760154801000000000 18ae349f0a3aee101c1024994601c18b 1 compiler_rt/fixunsdfsi.zig 418 + 713 455263958 1760154801000000000 15697c6d14ff144c8a8fbbbfc25b56ac 1 compiler_rt/fixunsdfdi.zig 419 + 731 455263961 1760154801000000000 ccb4ab408cf9f6b931333d2e2281d138 1 compiler_rt/fixunsdfti.zig 420 + 575 455263959 1760154801000000000 0a1cb46013571dde4b1bb4448121ba85 1 compiler_rt/fixunsdfei.zig 421 + 754 455263972 1760154801000000000 717dbc2cecb0b7f0417ed241602b0235 1 compiler_rt/fixunstfsi.zig 422 + 754 455263970 1760154801000000000 e0117ad5626119b0e5de39f22424c41d 1 compiler_rt/fixunstfdi.zig 423 + 891 455263973 1760154801000000000 c4d7fd8a337264713824559441d264bf 1 compiler_rt/fixunstfti.zig 424 + 576 455263971 1760154801000000000 cf926c64f6225389c139b32f9fce285b 1 compiler_rt/fixunstfei.zig 425 + 350 455263976 1760154801000000000 08e70a885b4a61a0e97871cbe7781a36 1 compiler_rt/fixunsxfsi.zig 426 + 350 455263974 1760154801000000000 9df747511c3f54bb2bb63cfce791b071 1 compiler_rt/fixunsxfdi.zig 427 + 731 455263977 1760154801000000000 89cbbf3a56b9124c65e08a4c565b4754 1 compiler_rt/fixunsxfti.zig 428 + 575 455263975 1760154801000000000 9834bffa03e61a47b5f6368b93c2b278 1 compiler_rt/fixunsxfei.zig 429 + 4111 455263982 1760154801000000000 0731ddef2609f045793d30b988a64339 1 compiler_rt/float_from_int.zig 430 + 347 455263995 1760154801000000000 46437c47ae3550f8dfea8ffe706e5cd5 1 compiler_rt/floatsihf.zig 431 + 619 455263996 1760154801000000000 d0709844134d344f649fe5de487e8d43 1 compiler_rt/floatsisf.zig 432 + 619 455263994 1760154801000000000 eb5e4bb9bdf0af3d17044dbab1c19f6a 1 compiler_rt/floatsidf.zig 433 + 748 455263997 1760154801000000000 6acf05da538e6fe3f7a19cdbf9326f26 1 compiler_rt/floatsitf.zig 434 + 347 455263998 1760154801000000000 f364c5d870c6ecf44a5a38ec49aaabe6 1 compiler_rt/floatsixf.zig 435 + 347 455263985 1760154801000000000 2b30fc40286f695404a52daa3020e46d 1 compiler_rt/floatdihf.zig 436 + 704 455263986 1760154801000000000 be61dfcf3ef7f7cb87fdb442491846aa 1 compiler_rt/floatdisf.zig 437 + 704 455263984 1760154801000000000 cf1600427d0617517935eed129801a82 1 compiler_rt/floatdidf.zig 438 + 748 455263987 1760154801000000000 8811790f2053d4000e252e7019110198 1 compiler_rt/floatditf.zig 439 + 347 455263988 1760154801000000000 eb71124e4f62f32423d28d002b3dc4fa 1 compiler_rt/floatdixf.zig 440 + 712 455264000 1760154801000000000 b0cac521d295bf19d575119ed72c24e5 1 compiler_rt/floattihf.zig 441 + 712 455264001 1760154801000000000 72a9275278530696bb432b1a92758b42 1 compiler_rt/floattisf.zig 442 + 712 455263999 1760154801000000000 5dde3f565fe32da11fe052594ee197ee 1 compiler_rt/floattidf.zig 443 + 872 455264002 1760154801000000000 1ae512923174c3e6fa1ba8d65abf6c4f 1 compiler_rt/floattitf.zig 444 + 712 455264003 1760154801000000000 e7550374f92dcebdb11cdef092ffb719 1 compiler_rt/floattixf.zig 445 + 569 455263990 1760154801000000000 6cacec7f1baf3962451f632af2333d15 1 compiler_rt/floateihf.zig 446 + 569 455263991 1760154801000000000 00ff12ec132a6de0ddba566b32f0ce56 1 compiler_rt/floateisf.zig 447 + 569 455263989 1760154801000000000 39f48db5b22c07b8e1ede4f6ad7dfeab 1 compiler_rt/floateidf.zig 448 + 571 455263992 1760154801000000000 558b7faae150629fc02a56c6f795823a 1 compiler_rt/floateitf.zig 449 + 569 455263993 1760154801000000000 3219adecb483c360d12a9f49677362a1 1 compiler_rt/floateixf.zig 450 + 357 455264015 1760154801000000000 00a0cc52e80a5d8768c00c875a2c38fb 1 compiler_rt/floatunsihf.zig 451 + 628 455264016 1760154801000000000 7758994bb35f2593765f89bd87e8f055 1 compiler_rt/floatunsisf.zig 452 + 628 455264014 1760154801000000000 20cada91ea193709f7cdb30fc7e305ed 1 compiler_rt/floatunsidf.zig 453 + 761 455264017 1760154801000000000 c3fa8cad530a016146e93e31095198f1 1 compiler_rt/floatunsitf.zig 454 + 353 455264018 1760154801000000000 182b577da08432924ceb5ee9bd0f2d88 1 compiler_rt/floatunsixf.zig 455 + 353 455264005 1760154801000000000 0e605deb96515a6775375e7e47db3215 1 compiler_rt/floatundihf.zig 456 + 713 455264006 1760154801000000000 e063c2d245ac649a28457da928aa6736 1 compiler_rt/floatundisf.zig 457 + 713 455264004 1760154801000000000 904d6181c4aecb7405c8e4edc325cc82 1 compiler_rt/floatundidf.zig 458 + 761 455264007 1760154801000000000 3e7630bf1c35c7de0a6c3ffd69b2673d 1 compiler_rt/floatunditf.zig 459 + 353 455264008 1760154801000000000 1799170b2737a9e2a28a9808dd0e051a 1 compiler_rt/floatundixf.zig 460 + 724 455264020 1760154801000000000 2df4b1f0edb48dd79ccda95408b91311 1 compiler_rt/floatuntihf.zig 461 + 724 455264021 1760154801000000000 b990cd4c97634e1f3f4261191531b301 1 compiler_rt/floatuntisf.zig 462 + 724 455264019 1760154801000000000 f7a4d0e5f29f41cadf67ddd6f68c29df 1 compiler_rt/floatuntidf.zig 463 + 888 455264022 1760154801000000000 db22f0e3984446069375f2cae2a9aca7 1 compiler_rt/floatuntitf.zig 464 + 724 455264023 1760154801000000000 bc561095bbe802fe90354de9e376c896 1 compiler_rt/floatuntixf.zig 465 + 577 455264010 1760154801000000000 588ff37c9a79b9efee8d8ab27866c544 1 compiler_rt/floatuneihf.zig 466 + 577 455264011 1760154801000000000 83c4fadef25daa676e2b17560f7b5b9f 1 compiler_rt/floatuneisf.zig 467 + 577 455264009 1760154801000000000 9ab7e41efc150cfc29183a68faa98145 1 compiler_rt/floatuneidf.zig 468 + 579 455264012 1760154801000000000 c63445cffc5e5f137b97a50c2bb9ef88 1 compiler_rt/floatuneitf.zig 469 + 577 455264013 1760154801000000000 36f8e586a4b887c1b1b1537a5a28ae74 1 compiler_rt/floatuneixf.zig 470 + 4582 455263896 1760154801000000000 e5686ffdd46c3d4d1c4485eb9eef4475 1 compiler_rt/comparef.zig 471 + 2267 455263888 1760154801000000000 f21670514136306b5c179b4ee414d001 1 compiler_rt/cmphf2.zig 472 + 3161 455263889 1760154801000000000 2bb653afb77db3d5045cbb9a02ba3d6f 1 compiler_rt/cmpsf2.zig 473 + 3161 455263886 1760154801000000000 5ff781811d3f999df43ff5a63d8e0b2f 1 compiler_rt/cmpdf2.zig 474 + 4739 455263891 1760154801000000000 13d86b526247d5092d8aacf0b67bdcf1 1 compiler_rt/cmptf2.zig 475 + 2248 455263893 1760154801000000000 c47b1b506563f516dd85df37da1ca80d 1 compiler_rt/cmpxf2.zig 476 + 341 455264143 1760154801000000000 2ed4e26e2ea3869e810a2840aa44890c 1 compiler_rt/unordhf2.zig 477 + 634 455264144 1760154801000000000 ab97f41ff7e85578831672d29873bb7c 1 compiler_rt/unordsf2.zig 478 + 634 455264142 1760154801000000000 8fcd7331877db9156a9489d458816d1a 1 compiler_rt/unorddf2.zig 479 + 341 455264146 1760154801000000000 c6765ab1f830c13ccdf800de46e1d4c3 1 compiler_rt/unordxf2.zig 480 + 656 455264145 1760154801000000000 2a6c721c57e5b4fc4d03f1414d3bfa0c 1 compiler_rt/unordtf2.zig 481 + 960 455264032 1760154801000000000 44f070ee85c4299b7b861a8753e20983 1 compiler_rt/gehf2.zig 482 + 1567 455264033 1760154801000000000 d83ee65d70e22642ca348d28af9e8b1d 1 compiler_rt/gesf2.zig 483 + 1567 455264031 1760154801000000000 f7babfa2824209ae274b4f7f048979ff 1 compiler_rt/gedf2.zig 484 + 531 455264035 1760154801000000000 825137d9239fe8820abd067fa358ff6c 1 compiler_rt/gexf2.zig 485 + 1375 455264034 1760154801000000000 baf5038daac3654c38c49861c12af8f8 1 compiler_rt/getf2.zig 486 + 6348 455263856 1760154801000000000 9d6fb22665d5ae546ff48bce14f4265e 1 compiler_rt/addf3.zig 487 + 319 455263858 1760154801000000000 522a47928eb441889cd2d8293ee58f93 1 compiler_rt/addhf3.zig 488 + 594 455263863 1760154801000000000 98c81cd3c52b093c912ead4cc50ee463 1 compiler_rt/addsf3.zig 489 + 594 455263855 1760154801000000000 2fd1f70cd54ab97c68acda6ccd8698ca 1 compiler_rt/adddf3.zig 490 + 725 455263864 1760154801000000000 37b20d2aff3bdc9e0e864c4dd0285ce2 1 compiler_rt/addtf3.zig 491 + 323 455263866 1760154801000000000 3de55ee7141ae65ffda2d57872f49058 1 compiler_rt/addxf3.zig 492 + 406 455264106 1760154801000000000 974a08d8b377c7154ee50e645c4aa5f1 1 compiler_rt/subhf3.zig 493 + 735 455264111 1760154801000000000 c6bad960b48197993e5154abc0dad73e 1 compiler_rt/subsf3.zig 494 + 735 455264105 1760154801000000000 932c462bb7a1ebd827a8601a1a673d8f 1 compiler_rt/subdf3.zig 495 + 884 455264112 1760154801000000000 68c91ec93f437c6420395ef3a23d922a 1 compiler_rt/subtf3.zig 496 + 399 455264115 1760154801000000000 78f78d004278fcfad7128556fb169afb 1 compiler_rt/subxf3.zig 497 + 8398 455264055 1760154801000000000 2e26880d97fb35e9bd4cc1993465b0cb 1 compiler_rt/mulf3.zig 498 + 323 455264058 1760154801000000000 da7bee33a5dc12783e6265082c6339c5 1 compiler_rt/mulhf3.zig 499 + 598 455264064 1760154801000000000 fee4abf27cb742c17acbc579ce4181c9 1 compiler_rt/mulsf3.zig 500 + 598 455264054 1760154801000000000 a3c5a4d1d76996c6a8862bc7edee60e9 1 compiler_rt/muldf3.zig 501 + 737 455264066 1760154801000000000 05e662af04b7c0553caed681261620bc 1 compiler_rt/multf3.zig 502 + 323 455264069 1760154801000000000 20b9631d337fdb552805ef976ffdc51e 1 compiler_rt/mulxf3.zig 503 + 344 455263909 1760154801000000000 c658197861ba0fe65f6c4da66921da72 1 compiler_rt/divhf3.zig 504 + 8574 455263912 1760154801000000000 57deaddafd7a8db15df6bbeca7d2d850 1 compiler_rt/divsf3.zig 505 + 9366 455263906 1760154801000000000 3f0a4a77ece42e5c0a92b591f8219814 1 compiler_rt/divdf3.zig 506 + 8669 455263920 1760154801000000000 9c07b341767fa995dedd55167cc3e222 1 compiler_rt/divxf3.zig 507 + 9925 455263915 1760154801000000000 28531f064bbb7a862fb99a6dd7127380 1 compiler_rt/divtf3.zig 508 + 265 455264073 1760154801000000000 ff779eb9e3281d0f8136f5b61b8e6515 1 compiler_rt/neghf2.zig 509 + 530 455264074 1760154801000000000 e570a93d326095aad9dfa0af89f5e12d 1 compiler_rt/negsf2.zig 510 + 530 455264071 1760154801000000000 239867284b810ba2b4b7139ff96a22c0 1 compiler_rt/negdf2.zig 511 + 409 455264076 1760154801000000000 68cda8c4538ebcdadbb16771ebed9613 1 compiler_rt/negtf2.zig 512 + 265 455264082 1760154801000000000 e6f608fbc42d09928e6d353d3e4ae05e 1 compiler_rt/negxf2.zig 513 + 2072 455264092 1760154801000000000 73e4d664a217ad2fe999244a64307073 1 compiler_rt/powiXf2.zig 514 + 2275 455264051 1760154801000000000 31c049fe940585ddd225b0c4f49de0ab 1 compiler_rt/mulc3.zig 515 + 425 455264057 1760154801000000000 9057d1c7c2b8e98f5c09215baab464e3 1 compiler_rt/mulhc3.zig 516 + 425 455264063 1760154801000000000 46a186b40dbf8b1a78fd7664e825477d 1 compiler_rt/mulsc3.zig 517 + 425 455264053 1760154801000000000 ae9761607983803a875dc03e2bcf93b2 1 compiler_rt/muldc3.zig 518 + 425 455264068 1760154801000000000 241de1bd5170ea794fe6a65e3ca1c4b6 1 compiler_rt/mulxc3.zig 519 + 581 455264065 1760154801000000000 8ff2e7539ccf94a8ea6a7d0fb870f8ac 1 compiler_rt/multc3.zig 520 + 2280 455263903 1760154801000000000 9e6aaeda713b6cd43eca1180606dc9f8 1 compiler_rt/divc3.zig 521 + 434 455263908 1760154801000000000 99234ee0594362f25d0034479872a24d 1 compiler_rt/divhc3.zig 522 + 434 455263911 1760154801000000000 19324ba1cf08e607b54db47c52783c60 1 compiler_rt/divsc3.zig 523 + 434 455263905 1760154801000000000 a5c0557ad47ea2daea69c331226b6bb8 1 compiler_rt/divdc3.zig 524 + 434 455263919 1760154801000000000 0ba3ba63c22ba9609413264f8e142986 1 compiler_rt/divxc3.zig 525 + 590 455263914 1760154801000000000 b09a8555aa3985adc8de9d9dbbaeaab0 1 compiler_rt/divtc3.zig 526 + 5139 455263880 1760154801000000000 3377d5bdbc89549229fcc2bdded00385 1 compiler_rt/ceil.zig 527 + 5691 455263898 1760154801000000000 4e53be9b20a311a96eb63bafe37225d8 1 compiler_rt/cos.zig 528 + 11677 455263923 1760154801000000000 c4da63d897aa5d3cef3988faddf0733e 1 compiler_rt/exp.zig 529 + 20924 455263924 1760154801000000000 8444963967b3c617eebec50d6b319393 1 compiler_rt/exp2.zig 530 + 1913 455263937 1760154801000000000 d639f3899db4d8abd8eb6de3c9db692b 1 compiler_rt/fabs.zig 531 + 6290 455264024 1760154801000000000 f78026c2945813b1868334b3f8d6b1ea 1 compiler_rt/floor.zig 532 + 11575 455264025 1760154801000000000 acbf337ea57443d50122200a70477bd3 1 compiler_rt/fma.zig 533 + 2867 455264026 1760154801000000000 53832890224a36ee564f78656fad8acb 1 compiler_rt/fmax.zig 534 + 2869 455264027 1760154801000000000 16d3b98ffc9e7622d085e6ec340bef8b 1 compiler_rt/fmin.zig 535 + 12218 455264028 1760154801000000000 6096cb43202506289c56b29536a3c88b 1 compiler_rt/fmod.zig 536 + 8304 455264040 1760154801000000000 4a2ae209edc8dde5555884addb0c3270 1 compiler_rt/log.zig 537 + 9499 455264041 1760154801000000000 192e6cb083dc2203281a462a1129dc3e 1 compiler_rt/log10.zig 538 + 8927 455264042 1760154801000000000 788bd8e755b980f4765163024433bbef 1 compiler_rt/log2.zig 539 + 5307 455264097 1760154801000000000 64efbcc2e1df4cd325e1f4f05a9b43b6 1 compiler_rt/round.zig 540 + 6783 455264100 1760154801000000000 46b58824ce56ea0819341b2de4e4ce88 1 compiler_rt/sin.zig 541 + 8779 455264101 1760154801000000000 3372bf45f142a4244845a7d576e8a739 1 compiler_rt/sincos.zig 542 + 8445 455264102 1760154801000000000 834a20db0b154a40177782adbf1d021c 1 compiler_rt/sqrt.zig 543 + 6175 455264116 1760154801000000000 38bdd1e5397ae3ef6734324ee90f2cd8 1 compiler_rt/tan.zig 544 + 4509 455264118 1760154801000000000 452e79786bcf746a89464e0b468a1772 1 compiler_rt/trunc.zig 545 + 2047 455263910 1760154801000000000 1b5ba254fdfc08708a375c730450065e 1 compiler_rt/divmodei4.zig 546 + 5345 455264136 1760154801000000000 ce988d5b59fa957acec0cc0f5514f027 1 compiler_rt/udivmodei4.zig 547 + 886 455264138 1760154801000000000 3884d7d5d17d10b6c390591f14760c21 1 compiler_rt/udivmodti4.zig 548 + 2988 455264083 1760154801000000000 727f94ca1d77099453ad061b28f9f45b 1 compiler_rt/os_version_check.zig 549 + 12571 455263922 1760154801000000000 f2228bdf0cb635f1b1b962a3db633e85 1 compiler_rt/emutls.zig 550 + 11159 455263867 1760154801000000000 ef54630cfc4305fe4ecb7743de685276 1 compiler_rt/arm.zig 551 + 2563 455263869 1760154801000000000 667b1a412a0d66f8b44b2a8e8e4e16e2 1 compiler_rt/aulldiv.zig 552 + 2618 455263870 1760154801000000000 420aa19734f8e183daf736d09d96e8e9 1 compiler_rt/aullrem.zig 553 + 7746 455263881 1760154801000000000 65f560b740acc191d870c5c89599c99a 1 compiler_rt/clear_cache.zig 554 + 45809 455264036 1760154801000000000 8aceb9f3653d891b582dbd9b55b0d02a 1 compiler_rt/hexagon.zig 555 + 26388 455263868 1760154801000000000 2dbf62f073b314f8249867dbbbfb5589 1 compiler_rt/atomics.zig 556 + 9539 455264104 1760154801000000000 1d35c260060522cd892607322c1b0e17 1 compiler_rt/stack_probe.zig 557 + 79084 455263847 1760154801000000000 bda0e04701fa77ae568c29186ee9ccfb 1 compiler_rt/aarch64_outline_atomics.zig 558 + 6452 455264044 1760154801000000000 4cf074ce1df0bab8aba60356cc8ab857 1 compiler_rt/memcpy.zig 559 + 876 455264046 1760154801000000000 13a474bc83ea39da1548064a0ec84fe6 1 compiler_rt/memset.zig 560 + 7246 455264045 1760154801000000000 ab21f482b4ceecf867dcaf6370424fd5 1 compiler_rt/memmove.zig 561 + 931 455264043 1760154801000000000 ab9203076a9f7358651a1ac57a2238e6 1 compiler_rt/memcmp.zig 562 + 874 455263871 1760154801000000000 964d18da8969575344227310559069cf 1 compiler_rt/bcmp.zig 563 + 4524 455264103 1760154801000000000 3e80fe1b407f6f691b38a2b042fb4b64 1 compiler_rt/ssp.zig 564 + 8052 455282434 1760154801000000000 bbc3cbd53ca9eaab481a4b2874506c59 1 std/Build/Cache/Path.zig 565 + 2142 455282433 1760154801000000000 fe57a392618de045bf46b476d4e9b36f 1 std/Build/Cache/Directory.zig 566 + 37958 455282432 1760154801000000000 09f6c6d5c5a3e85759082f1ad46ebffa 1 std/Build/Cache/DepTokenizer.zig 567 + 2901 455282439 1760154801000000000 d277c72d570fa923fd437605bbd83e30 1 std/Build/Step/CheckFile.zig 568 + 117426 455282440 1760154801000000000 f327f9fe4a8649cc483e714c56bdafff 1 std/Build/Step/CheckObject.zig 569 + 41853 455282442 1760154801000000000 b089407ebc9e35a98f96dcfafbea622a 1 std/Build/Step/ConfigHeader.zig 570 + 831 455282443 1760154801000000000 0f223ee68995072c4beb7fd3ae600b02 1 std/Build/Step/Fail.zig 571 + 2711 455282444 1760154801000000000 72715636b21818d37288de283148c101 1 std/Build/Step/Fmt.zig 572 + 7843 455282445 1760154801000000000 b720790bf6e89535660d8996075ceed1 1 std/Build/Step/InstallArtifact.zig 573 + 4431 455282446 1760154801000000000 d1f0707c6afc3c9202b9d6dd0c114338 1 std/Build/Step/InstallDir.zig 574 + 1460 455282447 1760154801000000000 0040eb5b0836e8fa2056b8e33d66b4dd 1 std/Build/Step/InstallFile.zig 575 + 8154 455282448 1760154801000000000 fdd933a4e6d14f259812199ba337c9f2 1 std/Build/Step/ObjCopy.zig 576 + 87950 455282441 1760154801000000000 0bd85692649c85718b6ee8e4a977c7c8 1 std/Build/Step/Compile.zig 577 + 23856 455282449 1760154801000000000 04314b9ec6c4719520c8922f20479b10 1 std/Build/Step/Options.zig 578 + 1443 455282450 1760154801000000000 ad5ec7793142fc110b85e04588c7be90 1 std/Build/Step/RemoveDir.zig 579 + 73144 455282451 1760154801000000000 defa27d5c5918845503abf3bee647924 1 std/Build/Step/Run.zig 580 + 7560 455282452 1760154801000000000 9797ebcb743e2fc012570da797df3407 1 std/Build/Step/TranslateC.zig 581 + 13184 455282454 1760154801000000000 d3b8a19eb1eb2d1fa857b99bfea07950 1 std/Build/Step/WriteFile.zig 582 + 4247 455282453 1760154801000000000 78c06c4c05a1846f4e7d6ff9c0da4068 1 std/Build/Step/UpdateSourceFiles.zig 583 + 22825 455282457 1760154801000000000 e4bcf69644dd1afc10772570851bf6db 1 std/Build/Watch/FsEvents.zig 584 + 3139 455282467 1760154801000000000 9cdab6e064cbd6eed941e14fce46bc3f 1 std/Io/Reader/Limited.zig 585 + 0 455282468 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Io/Reader/test.zig 586 + 2533 455282526 1760154801000000000 e0af5510611c7c2688093972c6ace145 1 std/Thread/Mutex/Recursive.zig 587 + 11928 455282560 1760154801000000000 7a1e10e0d0e9210d2757e410d8473def 1 std/compress/flate/Compress.zig 588 + 47768 455282561 1760154801000000000 d87a77c2d3a950f7fb4503b2e91beb66 1 std/compress/flate/Decompress.zig 589 + 18914 455282562 1760154801000000000 c9cb33e59ca13018183045e0a1d980a9 1 std/compress/flate/HuffmanEncoder.zig 590 + 11871 455282570 1760154801000000000 1a80b6a0f5b379bcaa6324ad497a62d9 1 std/compress/lzma/decode.zig 591 + 0 455282571 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/compress/lzma/test.zig 592 + 3774 455282572 1760154801000000000 ba9dc0a0f8124583244e2f0c677410fc 1 std/compress/lzma/vec2d.zig 593 + 4704 455282575 1760154801000000000 34dab553e7d44c4c18351939467c745c 1 std/compress/lzma2/decode.zig 594 + 7157 455282578 1760154801000000000 a0e5aefb8ceae6798c4b2fe9540cefee 1 std/compress/xz/block.zig 595 + 0 455282579 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/compress/xz/test.zig 596 + 78531 455282582 1760154801000000000 d44d8434a6ff685d9cec10bd257151c5 1 std/compress/zstd/Decompress.zig 597 + 0 455282675 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/crypto/test.zig 598 + 22223 455282602 1760154801000000000 7e23bb5bcd64c4725f7c071dd3496b74 1 std/crypto/aes/aesni.zig 599 + 22711 455282603 1760154801000000000 8e77a640bfd456ac5363ff36bd93c4ba 1 std/crypto/aes/armcrypto.zig 600 + 33347 455282604 1760154801000000000 7de9cecbcab3c869e16f2fbaf7076a48 1 std/crypto/aes/soft.zig 601 + 14574 455282590 1760154801000000000 b552b509d9ec611014aa027c881ac91c 1 std/crypto/25519/field.zig 602 + 33703 455282592 1760154801000000000 d4b52682012c0195eb1aa7312d067798 1 std/crypto/25519/scalar.zig 603 + 338 455282647 1760154801000000000 433b788abb384ec7e4c3641754e6dde9 1 std/crypto/pcurves/p256/field.zig 604 + 7421 455282650 1760154801000000000 00494b8811c2d7df07fff5d27198954c 1 std/crypto/pcurves/p256/scalar.zig 605 + 5656 455282665 1760154801000000000 05c95744a349b07172e4c400b1e28cc1 1 std/crypto/pcurves/tests/p256.zig 606 + 376 455282653 1760154801000000000 69a49ff5f537dcd2044702ac14b6891c 1 std/crypto/pcurves/p384/field.zig 607 + 6669 455282656 1760154801000000000 7aee4435d80a972d5bcff185b164ee8e 1 std/crypto/pcurves/p384/scalar.zig 608 + 6707 455282666 1760154801000000000 3f1e1e56980e64672ccd1fba3a631951 1 std/crypto/pcurves/tests/p384.zig 609 + 343 455282659 1760154801000000000 738b22249e1d3a4c001765286bc82756 1 std/crypto/pcurves/secp256k1/field.zig 610 + 7426 455282660 1760154801000000000 1b99358655e3f9a938c25cb631d52e50 1 std/crypto/pcurves/secp256k1/scalar.zig 611 + 6029 455282667 1760154801000000000 4a9ce792ab6709c6ebf9e7dbf5e30590 1 std/crypto/pcurves/tests/secp256k1.zig 612 + 11649 455282628 1760154801000000000 884bf9edd77ebad5200670e26c236280 1 std/crypto/codecs/asn1.zig 613 + 17997 455282629 1760154801000000000 7ea1a954927b43ca5ab7f95c3becd401 1 std/crypto/codecs/base64_hex_ct.zig 614 + 81614 455282679 1760154801000000000 470f907682a83e0bd6639a9c16ae79c2 1 std/crypto/tls/Client.zig 615 + 12470 455282597 1760154801000000000 9c92810e5147e8de0f25e1658fa23a75 1 std/crypto/Certificate/Bundle.zig 616 + 71838 455282687 1760154801000000000 5c3513456ba79222f02ca36a90963776 1 std/debug/Dwarf/expression.zig 617 + 17609 455282685 1760154801000000000 f39611d52911878891dbef3fba794ac1 1 std/debug/Dwarf/abi.zig 618 + 10007 455282686 1760154801000000000 46471a00c4eea2acab55cc6337899adc 1 std/debug/Dwarf/call_frame.zig 619 + 9426 455282720 1760154801000000000 19fe74e26814be7f5083c3d8b5a0983e 1 std/fmt/parse_float/parse.zig 620 + 2950 455282717 1760154801000000000 e2f6cedde735fdaf086b7e0efdb66505 1 std/fmt/parse_float/convert_hex.zig 621 + 5401 455282716 1760154801000000000 cbeba905313f9b6c917fb231993989fe 1 std/fmt/parse_float/convert_fast.zig 622 + 48543 455282715 1760154801000000000 82c419f8469193cf67852d0ac4c65f55 1 std/fmt/parse_float/convert_eisel_lemire.zig 623 + 4586 455282718 1760154801000000000 2562e4c50c6403023d508a0c7e1f15f0 1 std/fmt/parse_float/convert_slow.zig 624 + 3506 455282739 1760154801000000000 9428b7df45d5b928d9c004b955588fe0 1 std/hash/crc/impl.zig 625 + 0 455282740 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/hash/crc/test.zig 626 + 2075 455282744 1760154801000000000 5910881f138d791cfa09dd89cc12fc40 1 std/hash/verify.zig 627 + 237477 455282947 1760154801000000000 67644436e9162e79563b60f574b36f99 1 std/os/windows/ntstatus.zig 628 + 0 455282773 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/dynamic_test.zig 629 + 0 455282775 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/hashmap_test.zig 630 + 0 455282776 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/scanner_test.zig 631 + 0 455282778 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/static_test.zig 632 + 995 455282823 1760154801000000000 59077bc2784a5df334de08609b4c2a55 1 std/math/expo2.zig 633 + 452 455282798 1760154801000000000 ce633e6b665f3caba98995a3f146d7c7 1 std/math/complex/abs.zig 634 + 678 455282800 1760154801000000000 9dd2ece0bd4c6366c4a3cb5bf7b3db17 1 std/math/complex/acosh.zig 635 + 608 455282799 1760154801000000000 e3a7d70f219edead2e32e66a9476a469 1 std/math/complex/acos.zig 636 + 458 455282801 1760154801000000000 2fea305ef49ff29fdd688d2f7342051d 1 std/math/complex/arg.zig 637 + 641 455282803 1760154801000000000 59bed4da0e5763cbf2a3e08ec4bc9c6c 1 std/math/complex/asinh.zig 638 + 750 455282802 1760154801000000000 26f02f5afc54b9ec7673ddd6d0fcc3a9 1 std/math/complex/asin.zig 639 + 645 455282805 1760154801000000000 adf7751d27453fed0d4977a2dc50e85e 1 std/math/complex/atanh.zig 640 + 2527 455282804 1760154801000000000 2a909954adb7520e1eb158124c280ca2 1 std/math/complex/atan.zig 641 + 484 455282806 1760154801000000000 a9e61e0f7280deab3d077856af6ca8d9 1 std/math/complex/conj.zig 642 + 5818 455282808 1760154801000000000 3b53a3d1a1285447f00cc90f422cb7b1 1 std/math/complex/cosh.zig 643 + 577 455282807 1760154801000000000 26877517b7d9d620e841272fd8ea3661 1 std/math/complex/cos.zig 644 + 4899 455282809 1760154801000000000 4f31c5e9d921097840da690cc0324595 1 std/math/complex/exp.zig 645 + 620 455282811 1760154801000000000 4e4bb03cdbb57072938d447952587286 1 std/math/complex/log.zig 646 + 608 455282812 1760154801000000000 1258f2af84237de74fd033b6776798f2 1 std/math/complex/pow.zig 647 + 628 455282813 1760154801000000000 b5f2e65410101f915fb75fa5712c2fd4 1 std/math/complex/proj.zig 648 + 5363 455282815 1760154801000000000 89568cfbf7f8196aafffbd55ea670070 1 std/math/complex/sinh.zig 649 + 620 455282814 1760154801000000000 4aade0cdfc8ac82b062412f5566aec6c 1 std/math/complex/sin.zig 650 + 4249 455282816 1760154801000000000 0aeb21db75d92940ddcb1491d2f0445e 1 std/math/complex/sqrt.zig 651 + 3847 455282818 1760154801000000000 98009ed972f9f5fcb177d10a345456e1 1 std/math/complex/tanh.zig 652 + 626 455282817 1760154801000000000 ac4f4ba1ea51c6a8f2101a7bdf3b0d7c 1 std/math/complex/tan.zig 653 + 175949 455282793 1760154801000000000 0a5bbf25108279be2f993ad7617db7b4 1 std/math/big/int.zig 654 + 3762 455282894 1760154801000000000 2fd0c246f4a8e9ba6ccef5ff7cf0ccfe 1 std/os/linux/vdso.zig 655 + 0 455282891 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/os/linux/test.zig 656 + 13117 455282895 1760154801000000000 71b9a59db11f287d3253e001a21a4028 1 std/os/linux/x86.zig 657 + 13489 455282896 1760154801000000000 958bec870d653d2a62890b93b463512b 1 std/os/linux/x86_64.zig 658 + 6720 455282868 1760154801000000000 186c59f27378f16795ba8c8611b5ed95 1 std/os/linux/aarch64.zig 659 + 7970 455282869 1760154801000000000 0f4c26b73e6698859b53f9b715f3d611 1 std/os/linux/arm.zig 660 + 6097 455282876 1760154801000000000 a5e8b96435a27d99de81726a3b93e16d 1 std/os/linux/hexagon.zig 661 + 6540 455282885 1760154801000000000 9b9c64b903ecbb48c7b6c661455ef036 1 std/os/linux/riscv32.zig 662 + 6541 455282886 1760154801000000000 b833f96b582cdd1676bf2bda0ac01e90 1 std/os/linux/riscv64.zig 663 + 10847 455282889 1760154801000000000 0c589fb5ebf73b4b5662a31d45d76c75 1 std/os/linux/sparc64.zig 664 + 7941 455282879 1760154801000000000 7e1c50fd483adea99b19665fe38b2f72 1 std/os/linux/loongarch64.zig 665 + 6634 455282880 1760154801000000000 ad9a26a1c9c2d04c67203fdcf578c9f1 1 std/os/linux/m68k.zig 666 + 11254 455282881 1760154801000000000 69fd31ffc9e830951f1293a9ee9cfb72 1 std/os/linux/mips.zig 667 + 10635 455282882 1760154801000000000 ff911a8bf83253a4b85221f8a5f72189 1 std/os/linux/mips64.zig 668 + 11375 455282883 1760154801000000000 c689805d51c081e34daf6fbc5a98b5ed 1 std/os/linux/powerpc.zig 669 + 11367 455282884 1760154801000000000 9859b17cc2c3e96bf4a8b8f5b254c760 1 std/os/linux/powerpc64.zig 670 + 7186 455282887 1760154801000000000 29692c77734256a2fc877fcec567d9a0 1 std/os/linux/s390x.zig 671 + 4390 455282892 1760154801000000000 9e872767168dbe4e563e8ca82d35d42e 1 std/os/linux/thumb.zig 672 + 18676 455282893 1760154801000000000 79cbf225d0993e9837e569f3e09e0314 1 std/os/linux/tls.zig 673 + 46056 455282875 1760154801000000000 9fe341cf598b87b036f8a411741658f9 1 std/os/linux/bpf.zig 674 + 1297 455282878 1760154801000000000 daac8c407161fbb4bb996238aee46635 1 std/os/linux/ioctl.zig 675 + 8427 455282888 1760154801000000000 b845f84a2ea6f5532d8ffc78297dafed 1 std/os/linux/seccomp.zig 676 + 183126 455282890 1760154801000000000 fd2ae47bc58a4f876d2cb8205d4888ea 1 std/os/linux/syscalls.zig 677 + 19909 455282877 1760154801000000000 a1611786e4dda806effaf2301a5cf0ae 1 std/os/linux/io_uring_sqe.zig 678 + 173427 455282867 1760154801000000000 46b12a066a5e37b8a275732fa67d5529 1 std/os/linux/IoUring.zig 679 + 2126 455282899 1760154801000000000 d6f497f7c3ede56b9dd8eb2cae54c566 1 std/os/plan9/x86_64.zig 680 + 2368 455282929 1760154801000000000 ef3b4d934ff0fc89d4b9c013f363e19f 1 std/os/uefi/protocol.zig 681 + 37311 455282902 1760154801000000000 a67c5d40f56e40984ce32fba49cfa0bc 1 std/os/uefi/device_path.zig 682 + 2078 455282903 1760154801000000000 13b23e26af6b210b16c77d73b956e867 1 std/os/uefi/hii.zig 683 + 10107 455282930 1760154801000000000 e4c1fe82be2b68376749dbb625002706 1 std/os/uefi/status.zig 684 + 10741 455282937 1760154801000000000 3ec6d3df7b26921a90d6a5400e0d4eb3 1 std/os/uefi/tables.zig 685 + 3906 455282904 1760154801000000000 5c4587a7b4f3370e256119bdab607b4a 1 std/os/uefi/pool_allocator.zig 686 + 0 455282949 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/os/windows/test.zig 687 + 2144 455282941 1760154801000000000 25e202ff708858513ae7203c6f1043cf 1 std/os/windows/advapi32.zig 688 + 19302 455282943 1760154801000000000 4166d597fb4bd529b9418c145598c4d4 1 std/os/windows/kernel32.zig 689 + 12119 455282946 1760154801000000000 90384510a1298bc4a80542f39d2cc399 1 std/os/windows/ntdll.zig 690 + 77480 455282952 1760154801000000000 d85c6950ac08847c1673726e62f4953f 1 std/os/windows/ws2_32.zig 691 + 850 455282942 1760154801000000000 058a13f92bf4ee16e52beb60bf057dc9 1 std/os/windows/crypt32.zig 692 + 20117 455282945 1760154801000000000 696b67a75a9a665eb00672233edffbb2 1 std/os/windows/nls.zig 693 + 130227 455282951 1760154801000000000 a0ee928ca20f189c11667764ca96b243 1 std/os/windows/win32error.zig 694 + 3697 455282944 1760154801000000000 f5f54b1cf522ff663148d3c96268d459 1 std/os/windows/lang.zig 695 + 8449 455282948 1760154801000000000 3c42a760ba486f9b9455bd95d20d2e0b 1 std/os/windows/sublang.zig 696 + 135650 455283006 1760154801000000000 a31eb8d48506c25579555c4efd1a9faf 1 std/zig/Parse.zig 697 + 142067 455282997 1760154801000000000 c11d0a46b8fb10db9e0b6b86306a47a4 1 std/zig/Ast/Render.zig 698 + 8409 455283026 1760154801000000000 05fc398cc2e6071c55b8a2a2fbc73720 1 std/zig/system/NativePaths.zig 699 + 12217 455283032 1760154801000000000 431d341ca0da87ee822118293b8def7c 1 std/zig/system/windows.zig 700 + 2441 455283030 1760154801000000000 35ecedf1e23a5fca314cc4de0bb8b2f9 1 std/zig/system/darwin.zig 701 + 15180 455283031 1760154801000000000 33621c7cb8fc88d890376af63807d420 1 std/zig/system/linux.zig 702 + 26641 455283033 1760154801000000000 1653caac0003b8e8b9474f11b36c5a76 1 std/zig/system/x86.zig 703 + 19941 455283015 1760154801000000000 43431a1cd764230b64c7ea49ae836f33 1 std/zig/llvm/BitcodeReader.zig 704 + 17956 455283017 1760154801000000000 fc195102d6af02ed5678e5f0aa8b8390 1 std/zig/llvm/bitcode_writer.zig 705 + 592181 455283016 1760154801000000000 eb4547393bea04ef1cf32079beef364a 1 std/zig/llvm/Builder.zig 706 + 0 455263883 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzsi2_test.zig 707 + 0 455263882 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzdi2_test.zig 708 + 0 455263884 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzti2_test.zig 709 + 0 455263901 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzsi2_test.zig 710 + 0 455263900 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzdi2_test.zig 711 + 0 455263902 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzti2_test.zig 712 + 0 455263939 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffssi2_test.zig 713 + 0 455263938 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffsdi2_test.zig 714 + 0 455263940 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffsti2_test.zig 715 + 0 455264086 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/paritysi2_test.zig 716 + 0 455264085 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/paritydi2_test.zig 717 + 0 455264087 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/parityti2_test.zig 718 + 0 455264090 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountsi2_test.zig 719 + 0 455264089 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountdi2_test.zig 720 + 0 455264091 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountti2_test.zig 721 + 0 455263874 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreversesi2_test.zig 722 + 0 455263873 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreversedi2_test.zig 723 + 0 455263875 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreverseti2_test.zig 724 + 0 455263878 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapsi2_test.zig 725 + 0 455263877 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapdi2_test.zig 726 + 0 455263879 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapti2_test.zig 727 + 0 455263890 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpsi2_test.zig 728 + 0 455263887 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpdi2_test.zig 729 + 0 455263892 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpti2_test.zig 730 + 0 455264132 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpsi2_test.zig 731 + 0 455264131 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpdi2_test.zig 732 + 0 455264133 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpti2_test.zig 733 + 0 455264099 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/shift_test.zig 734 + 0 455264075 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negsi2_test.zig 735 + 0 455264072 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negdi2_test.zig 736 + 0 455264077 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negti2_test.zig 737 + 4285 455264134 1760154801000000000 3a706e00becb790763e2c63d183e345f 1 compiler_rt/udivmod.zig 738 + 0 455264135 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/udivmoddi4_test.zig 739 + 0 455264050 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulXi3_test.zig 740 + 0 455263918 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divti3_test.zig 741 + 0 455264048 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/modti3_test.zig 742 + 0 455263852 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvsi2_test.zig 743 + 0 455263850 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvdi2_test.zig 744 + 0 455263854 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvti2_test.zig 745 + 0 455264080 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvsi2_test.zig 746 + 0 455264079 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvdi2_test.zig 747 + 0 455264081 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvti2_test.zig 748 + 0 455263861 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addosi4_test.zig 749 + 0 455263860 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addodi4_test.zig 750 + 0 455263862 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addoti4_test.zig 751 + 0 455264109 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/subosi4_test.zig 752 + 0 455264108 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/subodi4_test.zig 753 + 0 455264110 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/suboti4_test.zig 754 + 0 455264061 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulosi4_test.zig 755 + 0 455264060 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulodi4_test.zig 756 + 0 455264062 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/muloti4_test.zig 757 + 0 455263928 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/extendf_test.zig 758 + 0 455264122 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/truncf_test.zig 759 + 0 455264039 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/int_from_float_test.zig 760 + 0 455263983 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/float_from_int_test.zig 761 + 0 455263897 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/comparesf2_test.zig 762 + 0 455263895 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/comparedf2_test.zig 763 + 0 455263857 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addf3_test.zig 764 + 0 455264056 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulf3_test.zig 765 + 0 455263913 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divsf3_test.zig 766 + 0 455263907 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divdf3_test.zig 767 + 0 455263921 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divxf3_test.zig 768 + 0 455263916 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divtf3_test.zig 769 + 0 455264093 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/powiXf2_test.zig 770 + 11743 455264117 1760154801000000000 20b5273f511a6677b3f49f750fcaf786 1 compiler_rt/trig.zig 771 + 6045 455264094 1760154801000000000 18b634df64d66eb7c240db46b32eea60 1 compiler_rt/rem_pio2.zig 772 + 2247 455264096 1760154801000000000 2337e183931c970621500018ffe636df 1 compiler_rt/rem_pio2f.zig 773 + 0 455264029 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/fmodq_test.zig 774 + 0 455264030 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/fmodx_test.zig 775 + 0 455264139 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/udivmodti4_test.zig 776 + 13531 455282564 1760154801000000000 479ed8dfe695d0a2eea06b674b3ed0da 1 std/compress/flate/Token.zig 777 + 20508 455282559 1760154801000000000 453a65b5b55858b073099208c4e07ca8 1 std/compress/flate/BlockWriter.zig 778 + 3588 455282563 1760154801000000000 5a3d7acaca811bf6b6e62a58645eddae 1 std/compress/flate/Lookup.zig 779 + 5945 455282568 1760154801000000000 937d6b84c08ac71922db69ef4603ee39 1 std/compress/lzma/decode/lzbuffer.zig 780 + 4994 455282569 1760154801000000000 159872c0de3e30f43567e5ed7666125d 1 std/compress/lzma/decode/rangecoder.zig 781 + 12650 455282645 1760154801000000000 56befc361ef070a7bd0a2d3c1dc46994 1 std/crypto/pcurves/common.zig 782 + 67958 455282648 1760154801000000000 0f2daafefad01026d6796eec68d65d2e 1 std/crypto/pcurves/p256/p256_64.zig 783 + 76136 455282649 1760154801000000000 8ec5f177ef28f7a2a0ec8d103665db00 1 std/crypto/pcurves/p256/p256_scalar_64.zig 784 + 134511 455282654 1760154801000000000 2e0dda7c40794e981dd2d2471c4776a5 1 std/crypto/pcurves/p384/p384_64.zig 785 + 137291 455282655 1760154801000000000 81eb087d46e6c49907ae0c02d3230828 1 std/crypto/pcurves/p384/p384_scalar_64.zig 786 + 73280 455282661 1760154801000000000 c871f98dad15c7a8c29be9ccefa4b181 1 std/crypto/pcurves/secp256k1/secp256k1_64.zig 787 + 75859 455282662 1760154801000000000 e29275bdb0eb931fc383e7f2f5ded944 1 std/crypto/pcurves/secp256k1/secp256k1_scalar_64.zig 788 + 1807 455282626 1760154801000000000 f47429307ac0920ff18758ce86074549 1 std/crypto/codecs/asn1/der.zig 789 + 7178 455282618 1760154801000000000 6d4dab023a981a670d308b0b120c9077 1 std/crypto/codecs/asn1/Oid.zig 790 + 0 455282627 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/crypto/codecs/asn1/test.zig 791 + 3892 455282596 1760154801000000000 b6e0d691e62b1e9830666c4f8c67fdf4 1 std/crypto/Certificate/Bundle/macos.zig 792 + 3081 455282714 1760154801000000000 2aeda0b8b6036bb4d980778abb5a928a 1 std/fmt/parse_float/common.zig 793 + 3073 455282713 1760154801000000000 3950e4fa1fdd11d50db0b4abfc254022 1 std/fmt/parse_float/FloatStream.zig 794 + 6036 455282712 1760154801000000000 68169ffe43d55f0eb5e26b984ef98670 1 std/fmt/parse_float/FloatInfo.zig 795 + 29140 455282719 1760154801000000000 04115d79320f402803a56bd43cc34cf9 1 std/fmt/parse_float/decimal.zig 796 + 2726 455282810 1760154801000000000 7f318d60fafbfa10754d5644fd131ffe 1 std/math/complex/ldexp.zig 797 + 0 455282794 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/math/big/int_test.zig 798 + 4082 455282871 1760154801000000000 11a08913a0ec64b8325b0d29601479a7 1 std/os/linux/bpf/btf.zig 799 + 1543 455282874 1760154801000000000 95995c37b42f8d7a12578170850af6ee 1 std/os/linux/bpf/kern.zig 800 + 2001 455282920 1760154801000000000 539322409dfd2d684638b127038a6e33 1 std/os/uefi/protocol/service_binding.zig 801 + 1743 455282916 1760154801000000000 e4e18b6e0741218763e2f0eefe57c63c 1 std/os/uefi/protocol/loaded_image.zig 802 + 4860 455282908 1760154801000000000 db6a8b32ce1366281968b6a3dbffb173 1 std/os/uefi/protocol/device_path.zig 803 + 3924 455282918 1760154801000000000 636ee102096b7ee8d15380af87b55c99 1 std/os/uefi/protocol/rng.zig 804 + 544 455282921 1760154801000000000 a0f63cfe62d021c13659600cea4aaa1a 1 std/os/uefi/protocol/shell_parameters.zig 805 + 1524 455282922 1760154801000000000 7748a7cf094118fb46a4fa8cb0e326fb 1 std/os/uefi/protocol/simple_file_system.zig 806 + 13432 455282910 1760154801000000000 995882ac23c2af4019a5dd716a5f09f3 1 std/os/uefi/protocol/file.zig 807 + 5171 455282907 1760154801000000000 9136b751bd537d37181af6f96f23bc0d 1 std/os/uefi/protocol/block_io.zig 808 + 1827 455282925 1760154801000000000 dc816c9ebf174e0f2191f721ebf627fd 1 std/os/uefi/protocol/simple_text_input.zig 809 + 5002 455282926 1760154801000000000 33197652ebd5358fbd566ba1598a738f 1 std/os/uefi/protocol/simple_text_input_ex.zig 810 + 9857 455282927 1760154801000000000 ac75efaf87e83f490e1b05ca64f3d221 1 std/os/uefi/protocol/simple_text_output.zig 811 + 2028 455282924 1760154801000000000 2b300415efacd2dec40e6f1d67488799 1 std/os/uefi/protocol/simple_pointer.zig 812 + 2398 455282906 1760154801000000000 2c87d630cff25fb47ddfd2241990d8f4 1 std/os/uefi/protocol/absolute_pointer.zig 813 + 4876 455282919 1760154801000000000 1955a5a309db3628c52bf415af05b0f8 1 std/os/uefi/protocol/serial_io.zig 814 + 4296 455282911 1760154801000000000 702a798c1a856afdd0ade5a1ee67b3cd 1 std/os/uefi/protocol/graphics_output.zig 815 + 2479 455282909 1760154801000000000 0fab22ebe8c02b50099313679d4e2eb5 1 std/os/uefi/protocol/edid.zig 816 + 15978 455282923 1760154801000000000 95a49124c8237f8d2ab01672bf2a69b1 1 std/os/uefi/protocol/simple_network.zig 817 + 9851 455282917 1760154801000000000 fc89ee17ffacbefb54626ee378473525 1 std/os/uefi/protocol/managed_network.zig 818 + 13201 455282914 1760154801000000000 427b83b08791055f001b217a1bd39a8b 1 std/os/uefi/protocol/ip6.zig 819 + 5373 455282915 1760154801000000000 911ecc11b1404b1bef6afcda6cd7868e 1 std/os/uefi/protocol/ip6_config.zig 820 + 8567 455282928 1760154801000000000 47adbb9c98a53124032c9ef80ce5889f 1 std/os/uefi/protocol/udp6.zig 821 + 4199 455282912 1760154801000000000 b821152f4c9abddf1c1fb114333c66dd 1 std/os/uefi/protocol/hii_database.zig 822 + 1712 455282913 1760154801000000000 1a882e3749f4ef9b5c5827cbb346f6a3 1 std/os/uefi/protocol/hii_popup.zig 823 + 47589 455282932 1760154801000000000 da7566eb78da06f1636e8eb3a693eb3e 1 std/os/uefi/tables/boot_services.zig 824 + 18947 455282934 1760154801000000000 cb1eb30776a43459956ea4c0675dee88 1 std/os/uefi/tables/runtime_services.zig 825 + 2796 455282933 1760154801000000000 f0a08fa361dffa5eadb351a471801946 1 std/os/uefi/tables/configuration_table.zig 826 + 2295 455282935 1760154801000000000 25bf31dd5f33af51b4b9da897fa1e3d5 1 std/os/uefi/tables/system_table.zig 827 + 214 455282936 1760154801000000000 cdb95d6c52cd4654ef26be0bd9f114d4 1 std/os/uefi/tables/table_header.zig 828 + 0 455283021 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/zig/parser_test.zig 829 + 15091 455283027 1760154801000000000 e1ff2fae360a9d1df9777ae4f90bda6a 1 std/zig/system/arm.zig 830 + 16495 455283029 1760154801000000000 753462fa54f971ae23b566336ad73030 1 std/zig/system/darwin/macos.zig 831 + 50924 455283018 1760154801000000000 5c60970433f1092302f7ef4ff90d3f62 1 std/zig/llvm/ir.zig 832 + 20581 455264095 1760154801000000000 e8eaf68a4ffa3364b8f352326a575189 1 compiler_rt/rem_pio2_large.zig 833 + 5806 455282621 1760154801000000000 92f1dd53520d8191f93c177825b7845c 1 std/crypto/codecs/asn1/der/Decoder.zig 834 + 5861 455282622 1760154801000000000 650695830257d32d9ea72d767d918703 1 std/crypto/codecs/asn1/der/Encoder.zig 835 + 419 455282872 1760154801000000000 ed7dfc04a5d0c4f0853edb5414ce981e 1 std/os/linux/bpf/btf_ext.zig 836 + 24293 455282873 1760154801000000000 0c7d3ee9ea8e698a843ee6039fd161c4 1 std/os/linux/bpf/helpers.zig 837 + 3221 455282620 1760154801000000000 fda67b74062c7f535bb0a6d0f1fe74fb 1 std/crypto/codecs/asn1/der/ArrayListReverse.zig 838 + 17082 477692678 1769067834682476150 d4070cb99abe67d7c8fac4848d40c8a5 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/resp.zig 839 + 13418 477682760 1769067249913800911 11d111781fb8c01a459c0fdedbb056ef 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/client.zig 840 + 11541 477683127 1769067286363693644 bac173560cec08746b4bedf2f8170385 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/strings.zig 841 + 11967 477691988 1769067802020496286 5869a6e792d8afdd5549fe854e74842e 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/keys.zig 842 + 11689 477683586 1769067359455564650 bec100c6b0086f968df6de13196e26a7 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/hashes.zig 843 + 14152 477692691 1769067835075778535 4047463f4ff9fae9fff7d67f7fd9efc1 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/lists.zig 844 + 13107 477684761 1769067442204067587 acec341e9a7a3f5c33288d4f6f275294 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/sets.zig 845 + 17625 477685285 1769067504701452622 09570d3abcfad3305087d7b6fd7e11bf 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/sorted_sets.zig 846 + 23673 477685753 1769067585846700063 a241f586338f0f06bf23af4f57db1a7e 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/src/commands/streams.zig
+838
.zig-cache/h/37f29d83a8c4847fc37e6be45cb7f8a4.txt
··· 1 + 0 2 + 66312 455263815 1760154801000000000 14fae37210c02c5e37e12220a8d796e3 1 compiler/build_runner.zig 3 + 1315 477686484 1769067631172027297 5890f4267658409a1c99240fe6c525c1 0 build.zig 4 + 103 477689571 1769067773630933603 35b10ba982858800c98ffbaad5536a86 2 o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig 5 + 22376 455283044 1760154801000000000 2d968f90418b6afe5ba91eaa2e18ba71 1 ubsan_rt.zig 6 + 7957 455282973 1760154801000000000 0ebbb46b337b65e85e7d177cfc93d2ca 1 std/std.zig 7 + 2525 455282429 1760154801000000000 71e0dabdb301ba10f8ca420941767e70 1 std/BitStack.zig 8 + 100909 455282461 1760154801000000000 13a2e2104f4f0987e695d4e96ddf1e3d 1 std/Build.zig 9 + 4266 455282541 1760154801000000000 16fdba428de22eb1305e855dec42f9a9 1 std/buf_map.zig 10 + 4526 455282542 1760154801000000000 8e63f8aad9b21f2cac5dcdcafd975d93 1 std/buf_set.zig 11 + 8139 455282462 1760154801000000000 b344fa05d00dd94ca9bb8e95cc23b3fc 1 std/DoublyLinkedList.zig 12 + 25874 455282706 1760154801000000000 84e0fbf3feb0ac8196cb74e389a3ccb0 1 std/dynamic_library.zig 13 + 35271 455282475 1760154801000000000 0d7d03be6dc0cb75afa123aa4eb4d818 1 std/Io.zig 14 + 43556 455282858 1760154801000000000 5bfaba216d6a1896e7f4b43e7ee7fe1a 1 std/multi_array_list.zig 15 + 21416 455282961 1760154801000000000 4328abc876b82840e689434566876bc7 1 std/priority_queue.zig 16 + 33889 455282960 1760154801000000000 431c78ed77c39d0be4be43c7634c12d0 1 std/priority_dequeue.zig 17 + 60600 455282476 1760154801000000000 518fc21273ed20754da5c332f4c01208 1 std/Progress.zig 18 + 17628 455282490 1760154801000000000 697e28034ef9cf05bb04d3be028a9653 1 std/Random.zig 19 + 20351 455282965 1760154801000000000 41f61f133b5c7661bc5f90889fd39045 1 std/segmented_list.zig 20 + 10911 455282491 1760154801000000000 72379f2cc10c10e56c76ebebd42ca14c 1 std/SemanticVersion.zig 21 + 5252 455282492 1760154801000000000 b2d7e2ffcc15cc25fbc30a3e3799cfba 1 std/SinglyLinkedList.zig 22 + 107284 455282521 1760154801000000000 f6122a744524ffe9ac4ca0b30e195789 1 std/Target.zig 23 + 60783 455282533 1760154801000000000 c6b7ffdf4ef9d1a067c790209a989cbb 1 std/Thread.zig 24 + 24524 455282984 1760154801000000000 1694ad0602c4425ddf33879d415f4ab1 1 std/treap.zig 25 + 31490 455282534 1760154801000000000 7cd075d309fe4bb3e810216b10d3f0c8 1 std/Uri.zig 26 + 95685 455282536 1760154801000000000 a68eb5aa7a6d2c07cb820b6b5ffa0604 1 std/array_list.zig 27 + 119750 455282535 1760154801000000000 a483a92911be1b36d25671285d410963 1 std/array_hash_map.zig 28 + 19425 455282538 1760154801000000000 09d08e5d80b113466699bf4262b53875 1 std/atomic.zig 29 + 24490 455282539 1760154801000000000 db10a569a8a9a16313103b691a443b4a 1 std/base64.zig 30 + 69019 455282540 1760154801000000000 a44de477fecc990a1381fe54649a934b 1 std/bit_set.zig 31 + 39860 455282545 1760154801000000000 bab8724be90660375455f96475ebd26f 1 std/builtin.zig 32 + 362358 455282555 1760154801000000000 5960e7594dae4d71cff9606967779bee 1 std/c.zig 33 + 51742 455282556 1760154801000000000 a9384cc5046eaeedcb1b30e646b423dc 1 std/coff.zig 34 + 372 455282584 1760154801000000000 b867983786f01e8333e32b633eb10410 1 std/compress.zig 35 + 17640 455282972 1760154801000000000 bd79322afba3cc08000a99c21bfd26d7 1 std/static_string_map.zig 36 + 13676 455282681 1760154801000000000 56a50f35f9d4227c9754ad2bad741de1 1 std/crypto.zig 37 + 69506 455282696 1760154801000000000 91241872064e64c681a13b7de815e984 1 std/debug.zig 38 + 4894 455282705 1760154801000000000 61fff94fe737bda88edd8ca624c0a93c 1 std/dwarf.zig 39 + 65720 455282707 1760154801000000000 bbe1ed25b53adc620fcc2bcd89a2a536 1 std/elf.zig 40 + 57857 455282708 1760154801000000000 e8bdba1d4814ce140abed00d8ac27c66 1 std/enums.zig 41 + 58752 455282722 1760154801000000000 94d08677478fb7c8fd9ecad13a05a7f6 1 std/fmt.zig 42 + 34417 455282731 1760154801000000000 2d9a528a5756bb811d20d393011711e8 1 std/fs.zig 43 + 4919 455282732 1760154801000000000 9c3f0431c1637a1fc64fa91b0520d1b3 1 std/gpu.zig 44 + 4120 455282747 1760154801000000000 287776a366bc2fa9071678dd14432afc 1 std/hash.zig 45 + 80684 455282748 1760154801000000000 5d2dba5503b8646ccb51c7481cec177d 1 std/hash_map.zig 46 + 35783 455282759 1760154801000000000 291afdd8c7934ab8495ad0cb24e3272b 1 std/heap.zig 47 + 39240 455282767 1760154801000000000 948901b44d7c0b5b43749fa91ebd4552 1 std/http.zig 48 + 5465 455282780 1760154801000000000 050dd347d737c8ab1673d3762b02a7e0 1 std/json.zig 49 + 18649 455282781 1760154801000000000 f1185edfabdd268969ce0577870e98a2 1 std/leb128.zig 50 + 8342 455282782 1760154801000000000 7a79e5053bcf4725fcf9ca5e03c43252 1 std/log.zig 51 + 70826 455282783 1760154801000000000 6a8358e9e839fb48052b1b0c7aa87559 1 std/macho.zig 52 + 74776 455282851 1760154801000000000 d4a0c6126fce11a0cafaea7b313668ac 1 std/math.zig 53 + 185101 455282854 1760154801000000000 bc292b07814f9e246c209f5298245036 1 std/mem.zig 54 + 39789 455282857 1760154801000000000 05e33fd489986e7ef7a2114c8f3040d0 1 std/meta.zig 55 + 88647 455282861 1760154801000000000 caa891873da45c5d032ca6c5c2da3039 1 std/net.zig 56 + 10310 455282954 1760154801000000000 2384f794189b66c622279a439a06e7a5 1 std/os.zig 57 + 2016 455282862 1760154801000000000 b634eff517218815e970c18230425d31 1 std/once.zig 58 + 13947 455282955 1760154801000000000 4e879b4dee70c859bd0938a160593e4c 1 std/pdb.zig 59 + 11147 455282956 1760154801000000000 4c4ae9402f913845c31e3b4781231385 1 std/pie.zig 60 + 290949 455282959 1760154801000000000 f9612ff2c4a8842713d76f25e5978004 1 std/posix.zig 61 + 79140 455282964 1760154801000000000 dd30dcce55de4d9018a7fbd907898b9c 1 std/process.zig 62 + 39596 455282970 1760154801000000000 338f2628729e859f51865caf708004bc 1 std/sort.zig 63 + 23280 455282966 1760154801000000000 8de2dfb1368f1051037084ba56ea4a97 1 std/simd.zig 64 + 16059 455282537 1760154801000000000 7d6ee226b3aea4e399efa02748582a57 1 std/ascii.zig 65 + 42826 455282977 1760154801000000000 55143931b33969e1e759f8623049586c 1 std/tar.zig 66 + 50117 455282980 1760154801000000000 88b236605010f41cfbb7049ca826a88e 1 std/testing.zig 67 + 11575 455282983 1760154801000000000 04290176ff236793a2846b7afe763a99 1 std/time.zig 68 + 11173 455282985 1760154801000000000 a51ee0838574fdd01999198cbeff620f 1 std/tz.zig 69 + 85999 455282988 1760154801000000000 a384b975bb355f986219464058d80145 1 std/unicode.zig 70 + 12292 455282993 1760154801000000000 8757ba546e520503fcc6a58d9b0d0083 1 std/valgrind.zig 71 + 17661 455282994 1760154801000000000 a8988138c7ee50f868cd1db24ab3d1d6 1 std/wasm.zig 72 + 37103 455283037 1760154801000000000 954dfee598538ddb98e9fc105c2e0a39 1 std/zig.zig 73 + 26592 455283038 1760154801000000000 2d4666d88f0c60307ae5724c74a78854 1 std/zip.zig 74 + 1242 455283043 1760154801000000000 c5e5cebc2cfc9353dc65aa5193442b60 1 std/zon.zig 75 + 28071 455282971 1760154801000000000 76d2b688d1d45fbb74ca560efdaac238 1 std/start.zig 76 + 5929 455282677 1760154801000000000 a75e2588e1a73369810b6ba7657e4bfd 1 std/crypto/tlcsprng.zig 77 + 59803 455282435 1760154801000000000 b6406a99c6bcfa6765bfb08eafcbff0d 1 std/Build/Cache.zig 78 + 38694 455282455 1760154801000000000 4bafc6be1344a4b0b4bfce1abc099568 1 std/Build/Step.zig 79 + 26376 455282437 1760154801000000000 bb934510edbc055949ffff1646e5e1e6 1 std/Build/Module.zig 80 + 43006 455282458 1760154801000000000 01457aac972ac3a8e51fa2185c19c1be 1 std/Build/Watch.zig 81 + 17168 455282436 1760154801000000000 907b4dad04e8cdc9fb34a46e35e44fb3 1 std/Build/Fuzz.zig 82 + 30754 455282459 1760154801000000000 9a7faf2066913f9911ffcf2596f0704c 1 std/Build/WebServer.zig 83 + 10407 455282460 1760154801000000000 219f7675797b83c184e56753dff6542a 1 std/Build/abi.zig 84 + 68505 455282469 1760154801000000000 136aa2b3a9c2358af2e6a17cfb4b5311 1 std/Io/Reader.zig 85 + 107573 455282470 1760154801000000000 3f1536dfea295ac1f88cc2d9509e9014 1 std/Io/Writer.zig 86 + 11083 455264147 1760154801000000000 3c8016eb348fede9a19b94ec4869d8a6 1 compiler_rt.zig 87 + 14469 455282464 1760154801000000000 50460af6b2b24665a01f2798a19968d6 1 std/Io/DeprecatedReader.zig 88 + 3660 455282465 1760154801000000000 667198a0bb922d33d2c2fb81a9a25d30 1 std/Io/DeprecatedWriter.zig 89 + 6043 455282472 1760154801000000000 8a44e6b03e4a42b09a4077448a7c41db 1 std/Io/fixed_buffer_stream.zig 90 + 1227 455282471 1760154801000000000 8e42c53c443deeb5a1d9cd2b1a3dbee7 1 std/Io/counting_reader.zig 91 + 5692 455282474 1760154801000000000 1ef2fac09b5b843536005bd1350d920d 1 std/Io/tty.zig 92 + 0 455282473 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Io/test.zig 93 + 1811 455282478 1760154801000000000 4f975bd4c885c2b17936c7c15e2a1fa0 1 std/Random/Ascon.zig 94 + 2685 455282479 1760154801000000000 5244bfd5edd68ad074bfdf866029fa86 1 std/Random/ChaCha.zig 95 + 6100 455282480 1760154801000000000 14fb5367ee7128106466c91abe89d828 1 std/Random/Isaac64.zig 96 + 2727 455282481 1760154801000000000 98b129620d81fc551cc2747eb5e93a2d 1 std/Random/Pcg.zig 97 + 3242 455282485 1760154801000000000 13e05c7b4ba6bd757c30dbc6e1520198 1 std/Random/Xoroshiro128.zig 98 + 3177 455282486 1760154801000000000 ece4176296c0d5a4735a0e13195d3e89 1 std/Random/Xoshiro256.zig 99 + 3158 455282483 1760154801000000000 e0b128479f8a117718ec288761f83ac0 1 std/Random/Sfc64.zig 100 + 3699 455282482 1760154801000000000 f562dad96707be48e6745a1f57cbf27c 1 std/Random/RomuTrio.zig 101 + 530 455282484 1760154801000000000 6862d091fadcbbb652464ab10689bd23 1 std/Random/SplitMix64.zig 102 + 4526 455282489 1760154801000000000 8ac3cfca93be2f623ce661fc9fb27686 1 std/Random/ziggurat.zig 103 + 0 455282488 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Random/test.zig 104 + 29955 455282494 1760154801000000000 7abef445358bc9111ee7720810ab2dfe 1 std/Target/Query.zig 105 + 106498 455282495 1760154801000000000 4e1faa0e06f720a8513cc19957f2cd52 1 std/Target/aarch64.zig 106 + 104612 455282496 1760154801000000000 06339133610c2f04ff7073b54ed9f610 1 std/Target/amdgcn.zig 107 + 1274 455282497 1760154801000000000 c251325fefba8d6614a0692c5ceb2eea 1 std/Target/arc.zig 108 + 79071 455282498 1760154801000000000 c8ffd174d8ea40cc06efcf87bf4b657a 1 std/Target/arm.zig 109 + 71492 455282499 1760154801000000000 8dcc898c0cae23c1a6c85b1acad47ada 1 std/Target/avr.zig 110 + 2425 455282500 1760154801000000000 3376bf5f146580e9b3ce5e329a604817 1 std/Target/bpf.zig 111 + 77604 455282501 1760154801000000000 be007dfe415760a79fc1d9d7dc89a548 1 std/Target/csky.zig 112 + 18058 455282503 1760154801000000000 8ccf22d3bcff20d7636d8251948f4618 1 std/Target/hexagon.zig 113 + 665 455282502 1760154801000000000 1dec26e22b22006cd47d45b427f8a00c 1 std/Target/generic.zig 114 + 1207 455282504 1760154801000000000 2119135642c6ce06557e5005da5d27d3 1 std/Target/lanai.zig 115 + 6753 455282505 1760154801000000000 da13f92a1b8d03cc797a3beeaa2922d6 1 std/Target/loongarch.zig 116 + 7140 455282506 1760154801000000000 85a640161b5e75f1b0e44aafa7b2ac12 1 std/Target/m68k.zig 117 + 16348 455282507 1760154801000000000 12a09875d65985836758c030c651b686 1 std/Target/mips.zig 118 + 2227 455282508 1760154801000000000 f424aba074f946c774143fd6a0cc9b02 1 std/Target/msp430.zig 119 + 16613 455282509 1760154801000000000 166964aa1c4340f0f5e8c2079fbe6806 1 std/Target/nvptx.zig 120 + 36467 455282510 1760154801000000000 aba041f244b5c814708cec688ed2ab9b 1 std/Target/powerpc.zig 121 + 1396 455282511 1760154801000000000 11966b944c6a6f5eb378759087686f44 1 std/Target/propeller.zig 122 + 90023 455282512 1760154801000000000 f9c2faa81a8573bbbf95b94084ffd3be 1 std/Target/riscv.zig 123 + 30256 455282513 1760154801000000000 a3772db647d2b9a091f142be3fe81a5a 1 std/Target/s390x.zig 124 + 21324 455282514 1760154801000000000 dff9a38ced436d7efc5afea4972eb822 1 std/Target/sparc.zig 125 + 5037 455282515 1760154801000000000 7a802abba56de166296a02820267f278 1 std/Target/spirv.zig 126 + 1276 455282516 1760154801000000000 320e5694ddc1e4347015e29952472e47 1 std/Target/ve.zig 127 + 6517 455282517 1760154801000000000 1babc8b342fb599193f79f08f76e9463 1 std/Target/wasm.zig 128 + 139090 455282518 1760154801000000000 6c63cbfe59447c9f4755d8b977fd0e4d 1 std/Target/x86.zig 129 + 1234 455282519 1760154801000000000 9977314bd28dc12c6017784ed96cc578 1 std/Target/xcore.zig 130 + 1274 455282520 1760154801000000000 b20b4af52a8974acb1c9cf688822a23c 1 std/Target/xtensa.zig 131 + 42124 455282524 1760154801000000000 a3d49f74bb65b5f4d7a02d5cac8c7afe 1 std/Thread/Futex.zig 132 + 9112 455282529 1760154801000000000 fe6a25bfea2dcf9533b026b4e0846b98 1 std/Thread/ResetEvent.zig 133 + 10156 455282527 1760154801000000000 f3390bd4b6bae3fe12192885ee63130d 1 std/Thread/Mutex.zig 134 + 2650 455282531 1760154801000000000 3ea6f138fe347f9c36c6331f8ba278e3 1 std/Thread/Semaphore.zig 135 + 23329 455282523 1760154801000000000 6fcf321e05d855b3995cb3a50125c3f8 1 std/Thread/Condition.zig 136 + 11411 455282530 1760154801000000000 215e3b4416494f856a25895960f5a4ca 1 std/Thread/RwLock.zig 137 + 9540 455282528 1760154801000000000 628f9bee010911810b3c9193792c6f53 1 std/Thread/Pool.zig 138 + 1988 455282532 1760154801000000000 6793266710d780758ac32c2edcc166a9 1 std/Thread/WaitGroup.zig 139 + 59140 455282544 1760154801000000000 92182faee34134d52a9ad2d0a5a5fb2f 1 std/builtin/assembly.zig 140 + 50235 455282547 1760154801000000000 9708ebe35d8d2550494584ceeba81209 1 std/c/darwin.zig 141 + 11274 455282549 1760154801000000000 09bec7c3f40f6de5099b6d1914d351cf 1 std/c/freebsd.zig 142 + 9878 455282554 1760154801000000000 ab1e53cee5c67832574a9055e0108e66 1 std/c/solaris.zig 143 + 6617 455282551 1760154801000000000 d16786c18fabd57be5a8635a6ef08bb1 1 std/c/netbsd.zig 144 + 3875 455282548 1760154801000000000 907c436f260d11e9f80420d838051111 1 std/c/dragonfly.zig 145 + 15535 455282550 1760154801000000000 43ebba145dd0318d69788910b66220e7 1 std/c/haiku.zig 146 + 13681 455282552 1760154801000000000 06689937d111c195fd6baae889fc720b 1 std/c/openbsd.zig 147 + 3099 455282553 1760154801000000000 6a897bb99820db129b41bc2b5d6046bb 1 std/c/serenity.zig 148 + 6341 455282565 1760154801000000000 33490794e8bee84517ccfebe261d4eae 1 std/compress/flate.zig 149 + 3010 455282573 1760154801000000000 e6aae4a5afa281030d98b006a53807e0 1 std/compress/lzma.zig 150 + 894 455282576 1760154801000000000 0112dea02a7ad758670754ecb2e3ff09 1 std/compress/lzma2.zig 151 + 5317 455282580 1760154801000000000 23792685eae819b737bc8922607d4ba7 1 std/compress/xz.zig 152 + 6605 455282583 1760154801000000000 295f3b5136806a9f26e893c51e33025d 1 std/compress/zstd.zig 153 + 10441 455282676 1760154801000000000 b922de5f94704738f619903775fecb17 1 std/crypto/timing_safe.zig 154 + 47614 455282600 1760154801000000000 a03a980a4a1a9a95bf94441f8c307101 1 std/crypto/aegis.zig 155 + 6851 455282606 1760154801000000000 ea7fad6fda828c72abcc0148e4659e9c 1 std/crypto/aes_gcm.zig 156 + 15331 455282607 1760154801000000000 250e8a7b0eaeef0184fd38096c7a562a 1 std/crypto/aes_ocb.zig 157 + 51909 455282614 1760154801000000000 451cb3546d86929665419cd05bea0293 1 std/crypto/chacha20.zig 158 + 6309 455282638 1760154801000000000 1318dc8b9450bda7d30b2f2bd66ef98f 1 std/crypto/isap.zig 159 + 27260 455282670 1760154801000000000 b95f25fd28a65f6f71761d12efaee503 1 std/crypto/salsa20.zig 160 + 3626 455282637 1760154801000000000 7d28bd5a64f521b7f7322612e4d5f562 1 std/crypto/hmac.zig 161 + 18629 455282674 1760154801000000000 0ee80c1bcfed0bfc7fe20c0fd3c04d22 1 std/crypto/siphash.zig 162 + 6226 455282615 1760154801000000000 4270e1555211de4aca948cd086fc7129 1 std/crypto/cmac.zig 163 + 8993 455282605 1760154801000000000 1565baef5de85c1722fc1f3661e7418c 1 std/crypto/aes.zig 164 + 15303 455282639 1760154801000000000 ac2b7ab43674f07a4208ffa738f420c5 1 std/crypto/keccak_p.zig 165 + 9666 455282609 1760154801000000000 bfcf52448d42cda00bcaa777deca80cf 1 std/crypto/ascon.zig 166 + 2303 455282642 1760154801000000000 64e2696fd33ff024c44aee16a197afac 1 std/crypto/modes.zig 167 + 8666 455282593 1760154801000000000 3f63b88b98e1cb4a076af7d105c52b5f 1 std/crypto/25519/x25519.zig 168 + 65291 455282641 1760154801000000000 d602189df4b86e3751c21259bc485f24 1 std/crypto/ml_kem.zig 169 + 8492 455282587 1760154801000000000 1ad8b856fa664e2584776361ba03bdc0 1 std/crypto/25519/curve25519.zig 170 + 25932 455282589 1760154801000000000 a2d994ac2ed36751f95ac92b85a4931d 1 std/crypto/25519/edwards25519.zig 171 + 16174 455282651 1760154801000000000 1624d5389942bffd6016dc87453db0b7 1 std/crypto/pcurves/p256.zig 172 + 16370 455282657 1760154801000000000 c7fb645fa9fd8e26db3c4252856cdc9d 1 std/crypto/pcurves/p384.zig 173 + 7971 455282591 1760154801000000000 d0d33655dcbd80c50d53283108a54034 1 std/crypto/25519/ristretto255.zig 174 + 20520 455282663 1760154801000000000 e8ead8fcc9affae7d203ecb87a0e8236 1 std/crypto/pcurves/secp256k1.zig 175 + 29319 455282612 1760154801000000000 30d94c7ccda432eb5df2b6e7c68e0c35 1 std/crypto/blake2.zig 176 + 41428 455282613 1760154801000000000 711b0501d46a7c267b6f90ee8be3aacd 1 std/crypto/blake3.zig 177 + 9751 455282640 1760154801000000000 d4911af79a2684c60a4325e9142b1609 1 std/crypto/md5.zig 178 + 9321 455282599 1760154801000000000 15ebe6e9b9de51b93b00e1b463f00cb4 1 std/crypto/Sha1.zig 179 + 36825 455282672 1760154801000000000 bfc45b688f4f79b09cd3fa2ec3ce7a9e 1 std/crypto/sha2.zig 180 + 35726 455282673 1760154801000000000 74ba21545a132750f9a4eef5a37da502 1 std/crypto/sha3.zig 181 + 2756 455282635 1760154801000000000 3f1b15f01d5b6045525b1b5b73081e67 1 std/crypto/hash_composition.zig 182 + 3703 455282636 1760154801000000000 09d36564cbdc5d24ea6fa90e4b7dd6e5 1 std/crypto/hkdf.zig 183 + 20494 455282634 1760154801000000000 c857473fa22ec9e817a3c52e298e2eec 1 std/crypto/ghash_polyval.zig 184 + 7259 455282669 1760154801000000000 1b5aed273103196d0bdc885bc2b6ec2c 1 std/crypto/poly1305.zig 185 + 28906 455282608 1760154801000000000 da61f4b2f151f214129e329fd7af44dc 1 std/crypto/argon2.zig 186 + 37669 455282610 1760154801000000000 147c9e47e9a5a805c79882ce141f1fad 1 std/crypto/bcrypt.zig 187 + 25878 455282671 1760154801000000000 21725e7f671298d416186499754301ea 1 std/crypto/scrypt.zig 188 + 8451 455282643 1760154801000000000 e0bc6ddf2119b9cfe2a19626ded9635a 1 std/crypto/pbkdf2.zig 189 + 13838 455282668 1760154801000000000 7867fa74be498feed958e4107163a822 1 std/crypto/phc_encoding.zig 190 + 31401 455282588 1760154801000000000 727ee4c7eeb22bc4a90a96437f332593 1 std/crypto/25519/ed25519.zig 191 + 395201 455282631 1760154801000000000 4f4d382c531f90a2b4550ea4207a4d70 1 std/crypto/ecdsa.zig 192 + 38465 455282633 1760154801000000000 5ec16eac7226fcb11dbfeba8f371ee79 1 std/crypto/ff.zig 193 + 165 455282630 1760154801000000000 0ab9a19cc7544d7896d8555b38c3292a 1 std/crypto/codecs.zig 194 + 1715 455282632 1760154801000000000 f0b8832dd923baeda761e9855ed9d1ab 1 std/crypto/errors.zig 195 + 25575 455282680 1760154801000000000 05de4a472e23ccd4ece1a15329fc0dcb 1 std/crypto/tls.zig 196 + 50895 455282598 1760154801000000000 37739975874d2d5867dbd6043614417c 1 std/crypto/Certificate.zig 197 + 4783 455282691 1760154801000000000 bcebc8664d30ed61fbe6f4f52df7e6c8 1 std/debug/MemoryAccessor.zig 198 + 2664 455282689 1760154801000000000 d18c45d7c3943d59326b6215041f7b9b 1 std/debug/FixedBufferReader.zig 199 + 95718 455282688 1760154801000000000 031ee6c2142eb78ee4d751fdef4e8aee 1 std/debug/Dwarf.zig 200 + 22200 455282692 1760154801000000000 cadc751a24d7fe6cd0045c67d91fccc4 1 std/debug/Pdb.zig 201 + 90918 455282693 1760154801000000000 1af6e89bf60261270c63c0b89b93dbe4 1 std/debug/SelfInfo.zig 202 + 2274 455282690 1760154801000000000 a1cbdaf27c5043ba4157f3a1bfcd68fd 1 std/debug/Info.zig 203 + 8486 455282683 1760154801000000000 2ff9c5b27e3411a59088d247231e9d0f 1 std/debug/Coverage.zig 204 + 3221 455282695 1760154801000000000 ff7b6d80307d98046c1a6b71ce9736cb 1 std/debug/simple_panic.zig 205 + 2349 455282694 1760154801000000000 58f6d8954e49f4e277db7b9bad6e1f3c 1 std/debug/no_panic.zig 206 + 3939 455282704 1760154801000000000 5ee5df976eaaf300e36cd234fc3f2f43 1 std/dwarf/TAG.zig 207 + 7632 455282698 1760154801000000000 101aeaf3e9df594bf04093c15135dc96 1 std/dwarf/AT.zig 208 + 5693 455282703 1760154801000000000 01d731f8d28ba8382ff3c5885d5e0c75 1 std/dwarf/OP.zig 209 + 1963 455282702 1760154801000000000 055280c08a34f56d3d4ea7d69cf3fca3 1 std/dwarf/LANG.zig 210 + 1399 455282701 1760154801000000000 40a7d4ac60d12c6e9ca294acaed35474 1 std/dwarf/FORM.zig 211 + 1479 455282699 1760154801000000000 8bd901aaa561652b86f99819d0da7a57 1 std/dwarf/ATE.zig 212 + 643 455282700 1760154801000000000 6f6a9e4e1602df062ad02179710971c4 1 std/dwarf/EH.zig 213 + 94944 455282710 1760154801000000000 f351cb76a2427938af1d074abce787ce 1 std/fmt/float.zig 214 + 13189 455282721 1760154801000000000 8fcd1365fb1fe2c743d223fc34880b6a 1 std/fmt/parse_float.zig 215 + 2845 455282724 1760154801000000000 4f058fd80be3876870bc26a123c9de42 1 std/fs/AtomicFile.zig 216 + 115037 455282725 1760154801000000000 ad15ff549e0ce2f53861a15a248cb609 1 std/fs/Dir.zig 217 + 85774 455282726 1760154801000000000 506ab4301360b02d7f84b4e4e163ff28 1 std/fs/File.zig 218 + 78108 455282728 1760154801000000000 be1cf725a1de08084d5bf813f6758d74 1 std/fs/path.zig 219 + 1888 455282730 1760154801000000000 2c143a188f1f9a5e0b6cf6eb3a2a3825 1 std/fs/wasi.zig 220 + 2665 455282727 1760154801000000000 a74f4aed0521f238f302bbce59933ebd 1 std/fs/get_app_data_dir.zig 221 + 0 455282729 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/fs/test.zig 222 + 2797 455282734 1760154801000000000 e2d2903d78455f002bdf1543be5bd9b3 1 std/hash/Adler32.zig 223 + 14624 455282735 1760154801000000000 5d40bb3c14d452873d2170a0dc501e12 1 std/hash/auto_hash.zig 224 + 19972 455282741 1760154801000000000 c36dede4b91e35db37ea45c66dbe6fe9 1 std/hash/crc.zig 225 + 1890 455282742 1760154801000000000 8022a7844b1545ef9cc7889a3a71944a 1 std/hash/fnv.zig 226 + 9977 455282743 1760154801000000000 26add2cb2571b835338f163c8ca63459 1 std/hash/murmur.zig 227 + 12412 455282737 1760154801000000000 cd681dc3507b42839b769eae04b1dc3b 1 std/hash/cityhash.zig 228 + 8367 455282745 1760154801000000000 4744eb583f951c0ddcee1cf3bdde33fb 1 std/hash/wyhash.zig 229 + 41799 455282746 1760154801000000000 ee3e90d0630039df9f6254b022ce80e1 1 std/hash/xxhash.zig 230 + 13560 455282755 1760154801000000000 12f037849d64048bd40c550289bf0826 1 std/heap/arena_allocator.zig 231 + 7465 455282752 1760154801000000000 c45d8aa65e37758c03dbedc65850dbf5 1 std/heap/SmpAllocator.zig 232 + 7575 455282750 1760154801000000000 b8819311409154f2ecf659e0c1e915b6 1 std/heap/FixedBufferAllocator.zig 233 + 8217 455282751 1760154801000000000 fb438f5e75bc8857d9d1a5b0e9421e85 1 std/heap/PageAllocator.zig 234 + 7469 455282758 1760154801000000000 d0066bdd4d2784177387f85d9c416259 1 std/heap/sbrk_allocator.zig 235 + 1681 455282753 1760154801000000000 720fc81adedeb4b35463081496f20d4a 1 std/heap/ThreadSafeAllocator.zig 236 + 10472 455282754 1760154801000000000 21ee044c07f5991f129755da06deea5a 1 std/heap/WasmAllocator.zig 237 + 59918 455282756 1760154801000000000 552ab3f08dc9b1a495663dc5b84ab562 1 std/heap/debug_allocator.zig 238 + 8049 455282757 1760154801000000000 cd6c38f86fa0a1bd7ddaa85a0e7f94f7 1 std/heap/memory_pool.zig 239 + 70726 455282762 1760154801000000000 aa5ce17d76ef4eee632f9862adf3aa9f 1 std/http/Client.zig 240 + 31360 455282765 1760154801000000000 abd6ae4080522f73e4745e5efce346dc 1 std/http/Server.zig 241 + 13015 455282763 1760154801000000000 4c7e2ad894ad12f141066550c9bb326a 1 std/http/HeadParser.zig 242 + 3791 455282761 1760154801000000000 61420280e3c9986a74a687031fdcf831 1 std/http/ChunkParser.zig 243 + 3108 455282764 1760154801000000000 149ac2b5413f4e7bdf793b3740a63558 1 std/http/HeaderIterator.zig 244 + 0 455282766 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/http/test.zig 245 + 7996 455282772 1760154801000000000 8b3aa35651f2969c3a859a3fab94f443 1 std/json/dynamic.zig 246 + 3272 455282774 1760154801000000000 39fdbe23f321a0cb11a35e428810a09e 1 std/json/hashmap.zig 247 + 72868 455282770 1760154801000000000 ae7b2e59c7744ce34ba98c07df5ef06b 1 std/json/Scanner.zig 248 + 33944 455282777 1760154801000000000 1ce81c644431a9617acab806f3e0fa7a 1 std/json/static.zig 249 + 37319 455282771 1760154801000000000 48c6d66b659b03b4e105add369592eda 1 std/json/Stringify.zig 250 + 0 455282779 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/test.zig 251 + 0 455282769 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/JSONTestSuite_test.zig 252 + 12048 455282824 1760154801000000000 423025cbe9a3339e236aaf0fc007496c 1 std/math/float.zig 253 + 1681 455282832 1760154801000000000 23aba00e34aa5a807ee8d4bddf2738c5 1 std/math/isnan.zig 254 + 7877 455282825 1760154801000000000 21099ae36d31e459824cfc3757a834f2 1 std/math/frexp.zig 255 + 4458 455282842 1760154801000000000 78dbab36632b04ee9c8bc0e72a713100 1 std/math/modf.zig 256 + 1136 455282820 1760154801000000000 9f0946a16071ec7d7cb9f45c227c22f1 1 std/math/copysign.zig 257 + 1083 455282830 1760154801000000000 eb357e7577b828d5fc2ce3b4118459f2 1 std/math/isfinite.zig 258 + 1775 455282831 1760154801000000000 44fb86a5536455ca3877bb415347c6ac 1 std/math/isinf.zig 259 + 1456 455282834 1760154801000000000 a37461dca6f9345d8f8a2729c13b9ff6 1 std/math/iszero.zig 260 + 1837 455282833 1760154801000000000 cb4e66e7b3adbf190150294715c788b0 1 std/math/isnormal.zig 261 + 19209 455282843 1760154801000000000 000ec81e9c79a332fb482883ab800777 1 std/math/nextafter.zig 262 + 1557 455282847 1760154801000000000 3157574850d20851e8580a398e6895a9 1 std/math/signbit.zig 263 + 503 455282846 1760154801000000000 66d1263715127908b281862dba5dc24b 1 std/math/scalbn.zig 264 + 6839 455282836 1760154801000000000 65cf74d2abee4d99cea2993060dc9cc0 1 std/math/ldexp.zig 265 + 9113 455282844 1760154801000000000 2a24fb6143c914862a5d74c95a9f8b13 1 std/math/pow.zig 266 + 7647 455282845 1760154801000000000 0973f1b6b3c7b008fe03e68add8caaab 1 std/math/powi.zig 267 + 2837 455282849 1760154801000000000 50e9a695059ca6bb04cd979304e4c09b 1 std/math/sqrt.zig 268 + 4812 455282796 1760154801000000000 6f62d1f1ae7bff93c034f6f664aeaa12 1 std/math/cbrt.zig 269 + 5378 455282785 1760154801000000000 25b4039f6f32ddc437baa4061a3f8c3d 1 std/math/acos.zig 270 + 5337 455282787 1760154801000000000 eb35acdb17b747cc2f790e4ff8666d54 1 std/math/asin.zig 271 + 7275 455282789 1760154801000000000 5d8af88aea5f35ce7e37d0f0af8a4baf 1 std/math/atan.zig 272 + 10553 455282790 1760154801000000000 0cafcb907ba579b6b64631165a647329 1 std/math/atan2.zig 273 + 4748 455282828 1760154801000000000 910e3c3ba1e7626618c73be7f12f9319 1 std/math/hypot.zig 274 + 11499 455282822 1760154801000000000 1ddb2b66fbdf7acb2a4ad484203ae340 1 std/math/expm1.zig 275 + 5519 455282829 1760154801000000000 eacf48263508740f77738f675caef7a6 1 std/math/ilogb.zig 276 + 2531 455282837 1760154801000000000 b3b40fd4682f372913e09bc18ca3fcd6 1 std/math/log.zig 277 + 1919 455282840 1760154801000000000 a350e2bd40b9fc740607c3d658668abb 1 std/math/log2.zig 278 + 5553 455282838 1760154801000000000 e10fe90c6d01abfe27b7f2ee6e929a68 1 std/math/log10.zig 279 + 4219 455282841 1760154801000000000 88ffa0f96518ccc1715935c0618e543e 1 std/math/log_int.zig 280 + 8872 455282839 1760154801000000000 754de08c8dc06a6115beb96e5a991ad7 1 std/math/log1p.zig 281 + 4299 455282788 1760154801000000000 9d6c681faf8421823919e5bf347bf740 1 std/math/asinh.zig 282 + 2756 455282786 1760154801000000000 349667a0bb1e62bdc0383bce5747190c 1 std/math/acosh.zig 283 + 3399 455282791 1760154801000000000 7b22337c4a4df112f2c4be431b076007 1 std/math/atanh.zig 284 + 4294 455282848 1760154801000000000 42ef534228feb279b81e6fa2a5d79333 1 std/math/sinh.zig 285 + 4157 455282821 1760154801000000000 1dcc281bf0ca8a9782e5ae845f7b1fa5 1 std/math/cosh.zig 286 + 4581 455282850 1760154801000000000 2b64632014a58c73e7052420b356fcaa 1 std/math/tanh.zig 287 + 2024 455282827 1760154801000000000 28fd0ee50d92f0c08fd6aab95d6f15ee 1 std/math/gcd.zig 288 + 1194 455282835 1760154801000000000 40b3836f0a2277cb76754547dd483869 1 std/math/lcm.zig 289 + 11487 455282826 1760154801000000000 c0bf0098a075fd684bcbeff41e5abbc4 1 std/math/gamma.zig 290 + 6563 455282819 1760154801000000000 dccdf309b3630a59978e204ea0cbde99 1 std/math/complex.zig 291 + 746 455282795 1760154801000000000 cd57ee7b96c9ee1b66a3e7fc3ef16da9 1 std/math/big.zig 292 + 17806 455282853 1760154801000000000 83d7eca4345a674e2c9b3eb780fe9bd9 1 std/mem/Allocator.zig 293 + 6027 455282856 1760154801000000000 a9b245c6e260e2a4606e53d2d51f65c6 1 std/meta/trailer_flags.zig 294 + 0 455282860 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/net/test.zig 295 + 284102 455282897 1760154801000000000 3b47cf9538b4e1fc4671c5ae183d1d05 1 std/os/linux.zig 296 + 10460 455282900 1760154801000000000 488b62d22bbe9301ab373d2949f7d23b 1 std/os/plan9.zig 297 + 7746 455282938 1760154801000000000 931017d063b5a98aee21c888aac3dc3d 1 std/os/uefi.zig 298 + 16108 455282939 1760154801000000000 3cfe5b8a9735273d6782d1c456b08f15 1 std/os/wasi.zig 299 + 34093 455282864 1760154801000000000 d0e8187f608f5706844bd3662b1ea1ad 1 std/os/emscripten.zig 300 + 207257 455282953 1760154801000000000 773327deeb78ed0db89c9fa256583be1 1 std/os/windows.zig 301 + 2097 455282865 1760154801000000000 6b77b7f42ffec7eedf37dfecdfdd7014 1 std/os/freebsd.zig 302 + 0 455282958 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/posix/test.zig 303 + 72495 455282963 1760154801000000000 1abeeac93914da7ad3620fbfad5f1f43 1 std/process/Child.zig 304 + 51714 455282968 1760154801000000000 eb8790d984ce4a6ddd6376d877c85ff1 1 std/sort/block.zig 305 + 12404 455282969 1760154801000000000 4aec5577b3c4edbe484599906af3ae5d 1 std/sort/pdq.zig 306 + 17117 455282975 1760154801000000000 5e6a75c2975430f5d46623d1537855a5 1 std/tar/Writer.zig 307 + 0 455282976 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/tar/test.zig 308 + 5694 455282979 1760154801000000000 cd71b2d90772c02d65444191f9fd7d5d 1 std/testing/FailingAllocator.zig 309 + 6764 455282982 1760154801000000000 c674a37722ac57c1bfc929140e058755 1 std/time/epoch.zig 310 + 7574 455282992 1760154801000000000 d017fea857f95f2c01199efab8dbf965 1 std/valgrind/memcheck.zig 311 + 2493 455282991 1760154801000000000 30a771b8491dd283a50c6166babded38 1 std/valgrind/callgrind.zig 312 + 1249 455282990 1760154801000000000 6781a2e56089a14f4f2a391169bf7c05 1 std/valgrind/cachegrind.zig 313 + 62827 455283036 1760154801000000000 d1f5a0dbf135b754ed6a703e23df50e6 1 std/zig/tokenizer.zig 314 + 32614 455283003 1760154801000000000 198542319824c4a3f109c64260324d68 1 std/zig/ErrorBundle.zig 315 + 7166 455283007 1760154801000000000 860d7dc4b9813278374fb24397bb0a4d 1 std/zig/Server.zig 316 + 1605 455283002 1760154801000000000 7cfa1ea3449449667ebf6c5201f6dbaf 1 std/zig/Client.zig 317 + 14323 455283024 1760154801000000000 7e26c1a770304af7ccd5f605ada0a2e5 1 std/zig/string_literal.zig 318 + 6720 455283020 1760154801000000000 07baee4aa2d7c097b1307a2cdec422cf 1 std/zig/number_literal.zig 319 + 1666 455283023 1760154801000000000 87e0eb501395d68ddce525f8555f960c 1 std/zig/primitives.zig 320 + 148759 455282998 1760154801000000000 5f6f4c60784f8ab4107f3383e980dfca 1 std/zig/Ast.zig 321 + 568292 455282999 1760154801000000000 cd6d40183f2ae21282fd3d5fbbfc8238 1 std/zig/AstGen.zig 322 + 204779 455283009 1760154801000000000 4104285d49190afffd58ec1c3544ed4a 1 std/zig/Zir.zig 323 + 9166 455283010 1760154801000000000 6e1c16d90de3a0ffaeaf1d478014a072 1 std/zig/Zoir.zig 324 + 36096 455283011 1760154801000000000 a625edc6603167137dcd761c6dc77e82 1 std/zig/ZonGen.zig 325 + 58192 455283034 1760154801000000000 5bdfb45767fdafcc0df8cbf9812e246f 1 std/zig/system.zig 326 + 21416 455283001 1760154801000000000 d1b3749b34a2551f94643e698928aae0 1 std/zig/BuiltinFn.zig 327 + 41574 455283000 1760154801000000000 a042f3e8774e8bd3822b35117bbc3d78 1 std/zig/AstRlAnnotate.zig 328 + 36100 455283005 1760154801000000000 62fa4ce130060129db4288d3749f2488 1 std/zig/LibCInstallation.zig 329 + 45848 455283008 1760154801000000000 e70747937d94d1333d148947c57547da 1 std/zig/WindowsSdk.zig 330 + 9786 455283004 1760154801000000000 280d2bdf0f1a8f96ecaa4af86ba0a60e 1 std/zig/LibCDirs.zig 331 + 25071 455283035 1760154801000000000 959e2ad518bd8b10bbd16a31cfe2cf7a 1 std/zig/target.zig 332 + 247 455283019 1760154801000000000 4fee6920e55c663811dd32d69b7f2937 1 std/zig/llvm.zig 333 + 8713 455283012 1760154801000000000 53cfae8a8276d7204622550f50243f6b 1 std/zig/c_builtins.zig 334 + 28363 455283013 1760154801000000000 e2c60f43c6ae6eb4e168dc7fabd2138a 1 std/zig/c_translation.zig 335 + 117417 455283041 1760154801000000000 44bbbfd954ceece2effe8772c11d2f24 1 std/zon/parse.zig 336 + 46916 455283042 1760154801000000000 7bf4408cdd1c84975a793e5daefb12a8 1 std/zon/stringify.zig 337 + 32288 455283040 1760154801000000000 5eeb9845ed3d086fe03083e2f7b9e446 1 std/zon/Serializer.zig 338 + 2159 455282950 1760154801000000000 e912d0164349d3c86eb8b1226a86388f 1 std/os/windows/tls.zig 339 + 10957 455263894 1760154801000000000 86adef0c76818174cbce959185f8aa9c 1 compiler_rt/common.zig 340 + 7394 455263899 1760154801000000000 4d63e8360c0ca220253582124186fb27 1 compiler_rt/count0bits.zig 341 + 1385 455264084 1760154801000000000 929736d7c0636ec88ef908c0b4c15a65 1 compiler_rt/parity.zig 342 + 1916 455264088 1760154801000000000 9e893175f43f5d42fd541260ca5386e7 1 compiler_rt/popcount.zig 343 + 2762 455263872 1760154801000000000 972f20e5339815a5e21e7b0bc6202353 1 compiler_rt/bitreverse.zig 344 + 3260 455263876 1760154801000000000 0ec938dfe8c0a2d466838df303eef58d 1 compiler_rt/bswap.zig 345 + 1971 455263885 1760154801000000000 f4b500a005ae4486ff3df7110a9e2523 1 compiler_rt/cmp.zig 346 + 4845 455264098 1760154801000000000 8761326b4fa02822928e9a2bf1845ea7 1 compiler_rt/shift.zig 347 + 1171 455264070 1760154801000000000 b64a4252e2958ab85e11cf3e72046c01 1 compiler_rt/negXi2.zig 348 + 27737 455264037 1760154801000000000 0dc9529debd21eeb1908af208d1f2e9e 1 compiler_rt/int.zig 349 + 3064 455264049 1760154801000000000 c4a4e1485c87b5438551c701951d1b90 1 compiler_rt/mulXi3.zig 350 + 1113 455263917 1760154801000000000 8a9686a30bb60ded94cfbc7b0c188192 1 compiler_rt/divti3.zig 351 + 770 455264140 1760154801000000000 6c53a5d81aa4786ec59e8bd320265f7d 1 compiler_rt/udivti3.zig 352 + 1380 455264047 1760154801000000000 e03900eae21e2b320a2e62fc03e5074f 1 compiler_rt/modti3.zig 353 + 846 455264141 1760154801000000000 afc9b4b801628d3040423cf318155f2f 1 compiler_rt/umodti3.zig 354 + 671 455263848 1760154801000000000 a6cfe83f9d8eb6e22dee6dc0ccee3367 1 compiler_rt/absv.zig 355 + 311 455263851 1760154801000000000 9a044dbb5695c2eea3bda231bfeda676 1 compiler_rt/absvsi2.zig 356 + 311 455263849 1760154801000000000 0c0607d153f93dee28f63beeb116cbc1 1 compiler_rt/absvdi2.zig 357 + 314 455263853 1760154801000000000 d826815938d3df68320935b9968c29db 1 compiler_rt/absvti2.zig 358 + 1303 455264078 1760154801000000000 50df1f7234ac1a8d4f2093362c90b93e 1 compiler_rt/negv.zig 359 + 874 455263865 1760154801000000000 02f065d511a9d47115363632c4dbdeda 1 compiler_rt/addvsi3.zig 360 + 860 455264114 1760154801000000000 28391dec7d271786c0a340a5d698d3ba 1 compiler_rt/subvsi3.zig 361 + 932 455264113 1760154801000000000 c20c4bc9d2bbfbdf0b900e7d7218879e 1 compiler_rt/subvdi3.zig 362 + 902 455264067 1760154801000000000 45f09fd05e65513dfd810114991820f4 1 compiler_rt/mulvsi3.zig 363 + 1752 455263859 1760154801000000000 1e067dd191e3750e2eebc9a9891bfe8d 1 compiler_rt/addo.zig 364 + 1742 455264107 1760154801000000000 a6e4dadcd9f88d3c47b48642ea0242d5 1 compiler_rt/subo.zig 365 + 2643 455264059 1760154801000000000 7437cfee5e2a6d47f221d2f163a92242 1 compiler_rt/mulo.zig 366 + 6009 455263927 1760154801000000000 013ab2758ced7bbc2fc6988565eeb6c7 1 compiler_rt/extendf.zig 367 + 920 455263930 1760154801000000000 f422913a85e1e91ef2039ab58547c0fc 1 compiler_rt/extendhfsf2.zig 368 + 373 455263929 1760154801000000000 ed651ccba735e247ddf2016832e06f1c 1 compiler_rt/extendhfdf2.zig 369 + 376 455263931 1760154801000000000 0c74a49a05b638424700546195a373ee 1 compiler_rt/extendhftf2.zig 370 + 373 455263932 1760154801000000000 23b1c51db225608b57400e8118ffa9ec 1 compiler_rt/extendhfxf2.zig 371 + 644 455263933 1760154801000000000 5bd066e81499f866ae53e4e86d5e5c07 1 compiler_rt/extendsfdf2.zig 372 + 781 455263934 1760154801000000000 e52fbda9a494609786f8fcb77d847604 1 compiler_rt/extendsftf2.zig 373 + 360 455263935 1760154801000000000 e942ea8b9c6b17baaeea42c96e99effa 1 compiler_rt/extendsfxf2.zig 374 + 781 455263925 1760154801000000000 87ecde8777ad8ff8ed4dbc9c650f0270 1 compiler_rt/extenddftf2.zig 375 + 364 455263926 1760154801000000000 9f715eab9e2e310deef980aead0e7500 1 compiler_rt/extenddfxf2.zig 376 + 1604 455263936 1760154801000000000 c4862b4d4cfcee360ed2c56a114cbf4a 1 compiler_rt/extendxftf2.zig 377 + 8121 455264121 1760154801000000000 20afe15564559323e44421df48412060 1 compiler_rt/truncf.zig 378 + 881 455264123 1760154801000000000 47d13f34934c26c69eb88e81670d8f85 1 compiler_rt/truncsfhf2.zig 379 + 616 455264119 1760154801000000000 0641d56997ae4f4b5207adc68dc72f3b 1 compiler_rt/truncdfhf2.zig 380 + 600 455264120 1760154801000000000 02da0cc6b32c97637c74cbb10ccb54db 1 compiler_rt/truncdfsf2.zig 381 + 356 455264129 1760154801000000000 3bf820f222640094f3a72a66ffe8198e 1 compiler_rt/truncxfhf2.zig 382 + 333 455264130 1760154801000000000 66119941d376ee0a437b06bd3072d524 1 compiler_rt/truncxfsf2.zig 383 + 333 455264128 1760154801000000000 c13541abc36c28230d412dc5252b693e 1 compiler_rt/truncxfdf2.zig 384 + 359 455264125 1760154801000000000 d8f660a94187293e5a911454282b4029 1 compiler_rt/trunctfhf2.zig 385 + 731 455264126 1760154801000000000 13584c74605e851e6d831a9e0fce9886 1 compiler_rt/trunctfsf2.zig 386 + 731 455264124 1760154801000000000 457c0f6c909aa10450fd884ff88287f9 1 compiler_rt/trunctfdf2.zig 387 + 2852 455264127 1760154801000000000 d8494bd8878af1312bf45635b710a4b1 1 compiler_rt/trunctfxf2.zig 388 + 4079 455264038 1760154801000000000 5a505058b770b465ce081eb6a57e7a43 1 compiler_rt/int_from_float.zig 389 + 341 455263947 1760154801000000000 287cd5239eed800fcc228dfe9a2734d4 1 compiler_rt/fixhfsi.zig 390 + 341 455263945 1760154801000000000 8acd6b1ce769a390c40385d65d7fad51 1 compiler_rt/fixhfdi.zig 391 + 713 455263948 1760154801000000000 f02a5506718df6aec134d680607bf58f 1 compiler_rt/fixhfti.zig 392 + 564 455263946 1760154801000000000 9ae4ea7e25821706c5468c7c2c445448 1 compiler_rt/fixhfei.zig 393 + 616 455263952 1760154801000000000 703dfbffebdc9fddd06b6c8d668e5e6a 1 compiler_rt/fixsfsi.zig 394 + 701 455263950 1760154801000000000 88e7049e069292d16c1ff8720dff21c5 1 compiler_rt/fixsfdi.zig 395 + 713 455263953 1760154801000000000 27665f157ae97b6a905d2c3b3d14b55c 1 compiler_rt/fixsfti.zig 396 + 564 455263951 1760154801000000000 9296a734389623faf0ccbbce95248896 1 compiler_rt/fixsfei.zig 397 + 616 455263943 1760154801000000000 d6c6cfff39408568470a4ce56f20701b 1 compiler_rt/fixdfsi.zig 398 + 701 455263941 1760154801000000000 d37fe214a882924d291912211617b7e0 1 compiler_rt/fixdfdi.zig 399 + 713 455263944 1760154801000000000 acf45affbae83f950121a0e78d1d9d43 1 compiler_rt/fixdfti.zig 400 + 564 455263942 1760154801000000000 475c0ed3637871aa4bdba39fb7ac07c7 1 compiler_rt/fixdfei.zig 401 + 736 455263956 1760154801000000000 9e04b0c9b7e24d0a417e6418967a82bf 1 compiler_rt/fixtfsi.zig 402 + 736 455263954 1760154801000000000 54e8e270c03030539e0b628265ebe138 1 compiler_rt/fixtfdi.zig 403 + 867 455263957 1760154801000000000 159fff04699a850f0877d0d860fc5c23 1 compiler_rt/fixtfti.zig 404 + 565 455263955 1760154801000000000 f3202275d298913c25f0f8dfd3242be8 1 compiler_rt/fixtfei.zig 405 + 341 455263980 1760154801000000000 c5d9b1d68c225613e28b45cb4cec11bc 1 compiler_rt/fixxfsi.zig 406 + 341 455263978 1760154801000000000 87e625ba575a65977f04b534e5fc766d 1 compiler_rt/fixxfdi.zig 407 + 713 455263981 1760154801000000000 66c8929d08870c9d48875898ac51d464 1 compiler_rt/fixxfti.zig 408 + 564 455263979 1760154801000000000 4e4a4e4ac45142bc6c99b298914cc0e4 1 compiler_rt/fixxfei.zig 409 + 350 455263964 1760154801000000000 ba04537148169a4eda9cc74755e9d2b2 1 compiler_rt/fixunshfsi.zig 410 + 350 455263962 1760154801000000000 3f19d12e7ff9198e211b2298b6bd5efc 1 compiler_rt/fixunshfdi.zig 411 + 731 455263965 1760154801000000000 3dc5d5bb0159c254a4dc44defc534d08 1 compiler_rt/fixunshfti.zig 412 + 575 455263963 1760154801000000000 7747207f7d598d23ace14265322b94f9 1 compiler_rt/fixunshfei.zig 413 + 628 455263968 1760154801000000000 57232664ed8c180d0347c1a5b7fb707c 1 compiler_rt/fixunssfsi.zig 414 + 713 455263966 1760154801000000000 7ccb1263e66738a414ca7a9521baf546 1 compiler_rt/fixunssfdi.zig 415 + 731 455263969 1760154801000000000 46aa3b64c89e9e65d2ce377e2fda821b 1 compiler_rt/fixunssfti.zig 416 + 575 455263967 1760154801000000000 38283592b0bac48f035456b4aa28b777 1 compiler_rt/fixunssfei.zig 417 + 628 455263960 1760154801000000000 18ae349f0a3aee101c1024994601c18b 1 compiler_rt/fixunsdfsi.zig 418 + 713 455263958 1760154801000000000 15697c6d14ff144c8a8fbbbfc25b56ac 1 compiler_rt/fixunsdfdi.zig 419 + 731 455263961 1760154801000000000 ccb4ab408cf9f6b931333d2e2281d138 1 compiler_rt/fixunsdfti.zig 420 + 575 455263959 1760154801000000000 0a1cb46013571dde4b1bb4448121ba85 1 compiler_rt/fixunsdfei.zig 421 + 754 455263972 1760154801000000000 717dbc2cecb0b7f0417ed241602b0235 1 compiler_rt/fixunstfsi.zig 422 + 754 455263970 1760154801000000000 e0117ad5626119b0e5de39f22424c41d 1 compiler_rt/fixunstfdi.zig 423 + 891 455263973 1760154801000000000 c4d7fd8a337264713824559441d264bf 1 compiler_rt/fixunstfti.zig 424 + 576 455263971 1760154801000000000 cf926c64f6225389c139b32f9fce285b 1 compiler_rt/fixunstfei.zig 425 + 350 455263976 1760154801000000000 08e70a885b4a61a0e97871cbe7781a36 1 compiler_rt/fixunsxfsi.zig 426 + 350 455263974 1760154801000000000 9df747511c3f54bb2bb63cfce791b071 1 compiler_rt/fixunsxfdi.zig 427 + 731 455263977 1760154801000000000 89cbbf3a56b9124c65e08a4c565b4754 1 compiler_rt/fixunsxfti.zig 428 + 575 455263975 1760154801000000000 9834bffa03e61a47b5f6368b93c2b278 1 compiler_rt/fixunsxfei.zig 429 + 4111 455263982 1760154801000000000 0731ddef2609f045793d30b988a64339 1 compiler_rt/float_from_int.zig 430 + 347 455263995 1760154801000000000 46437c47ae3550f8dfea8ffe706e5cd5 1 compiler_rt/floatsihf.zig 431 + 619 455263996 1760154801000000000 d0709844134d344f649fe5de487e8d43 1 compiler_rt/floatsisf.zig 432 + 619 455263994 1760154801000000000 eb5e4bb9bdf0af3d17044dbab1c19f6a 1 compiler_rt/floatsidf.zig 433 + 748 455263997 1760154801000000000 6acf05da538e6fe3f7a19cdbf9326f26 1 compiler_rt/floatsitf.zig 434 + 347 455263998 1760154801000000000 f364c5d870c6ecf44a5a38ec49aaabe6 1 compiler_rt/floatsixf.zig 435 + 347 455263985 1760154801000000000 2b30fc40286f695404a52daa3020e46d 1 compiler_rt/floatdihf.zig 436 + 704 455263986 1760154801000000000 be61dfcf3ef7f7cb87fdb442491846aa 1 compiler_rt/floatdisf.zig 437 + 704 455263984 1760154801000000000 cf1600427d0617517935eed129801a82 1 compiler_rt/floatdidf.zig 438 + 748 455263987 1760154801000000000 8811790f2053d4000e252e7019110198 1 compiler_rt/floatditf.zig 439 + 347 455263988 1760154801000000000 eb71124e4f62f32423d28d002b3dc4fa 1 compiler_rt/floatdixf.zig 440 + 712 455264000 1760154801000000000 b0cac521d295bf19d575119ed72c24e5 1 compiler_rt/floattihf.zig 441 + 712 455264001 1760154801000000000 72a9275278530696bb432b1a92758b42 1 compiler_rt/floattisf.zig 442 + 712 455263999 1760154801000000000 5dde3f565fe32da11fe052594ee197ee 1 compiler_rt/floattidf.zig 443 + 872 455264002 1760154801000000000 1ae512923174c3e6fa1ba8d65abf6c4f 1 compiler_rt/floattitf.zig 444 + 712 455264003 1760154801000000000 e7550374f92dcebdb11cdef092ffb719 1 compiler_rt/floattixf.zig 445 + 569 455263990 1760154801000000000 6cacec7f1baf3962451f632af2333d15 1 compiler_rt/floateihf.zig 446 + 569 455263991 1760154801000000000 00ff12ec132a6de0ddba566b32f0ce56 1 compiler_rt/floateisf.zig 447 + 569 455263989 1760154801000000000 39f48db5b22c07b8e1ede4f6ad7dfeab 1 compiler_rt/floateidf.zig 448 + 571 455263992 1760154801000000000 558b7faae150629fc02a56c6f795823a 1 compiler_rt/floateitf.zig 449 + 569 455263993 1760154801000000000 3219adecb483c360d12a9f49677362a1 1 compiler_rt/floateixf.zig 450 + 357 455264015 1760154801000000000 00a0cc52e80a5d8768c00c875a2c38fb 1 compiler_rt/floatunsihf.zig 451 + 628 455264016 1760154801000000000 7758994bb35f2593765f89bd87e8f055 1 compiler_rt/floatunsisf.zig 452 + 628 455264014 1760154801000000000 20cada91ea193709f7cdb30fc7e305ed 1 compiler_rt/floatunsidf.zig 453 + 761 455264017 1760154801000000000 c3fa8cad530a016146e93e31095198f1 1 compiler_rt/floatunsitf.zig 454 + 353 455264018 1760154801000000000 182b577da08432924ceb5ee9bd0f2d88 1 compiler_rt/floatunsixf.zig 455 + 353 455264005 1760154801000000000 0e605deb96515a6775375e7e47db3215 1 compiler_rt/floatundihf.zig 456 + 713 455264006 1760154801000000000 e063c2d245ac649a28457da928aa6736 1 compiler_rt/floatundisf.zig 457 + 713 455264004 1760154801000000000 904d6181c4aecb7405c8e4edc325cc82 1 compiler_rt/floatundidf.zig 458 + 761 455264007 1760154801000000000 3e7630bf1c35c7de0a6c3ffd69b2673d 1 compiler_rt/floatunditf.zig 459 + 353 455264008 1760154801000000000 1799170b2737a9e2a28a9808dd0e051a 1 compiler_rt/floatundixf.zig 460 + 724 455264020 1760154801000000000 2df4b1f0edb48dd79ccda95408b91311 1 compiler_rt/floatuntihf.zig 461 + 724 455264021 1760154801000000000 b990cd4c97634e1f3f4261191531b301 1 compiler_rt/floatuntisf.zig 462 + 724 455264019 1760154801000000000 f7a4d0e5f29f41cadf67ddd6f68c29df 1 compiler_rt/floatuntidf.zig 463 + 888 455264022 1760154801000000000 db22f0e3984446069375f2cae2a9aca7 1 compiler_rt/floatuntitf.zig 464 + 724 455264023 1760154801000000000 bc561095bbe802fe90354de9e376c896 1 compiler_rt/floatuntixf.zig 465 + 577 455264010 1760154801000000000 588ff37c9a79b9efee8d8ab27866c544 1 compiler_rt/floatuneihf.zig 466 + 577 455264011 1760154801000000000 83c4fadef25daa676e2b17560f7b5b9f 1 compiler_rt/floatuneisf.zig 467 + 577 455264009 1760154801000000000 9ab7e41efc150cfc29183a68faa98145 1 compiler_rt/floatuneidf.zig 468 + 579 455264012 1760154801000000000 c63445cffc5e5f137b97a50c2bb9ef88 1 compiler_rt/floatuneitf.zig 469 + 577 455264013 1760154801000000000 36f8e586a4b887c1b1b1537a5a28ae74 1 compiler_rt/floatuneixf.zig 470 + 4582 455263896 1760154801000000000 e5686ffdd46c3d4d1c4485eb9eef4475 1 compiler_rt/comparef.zig 471 + 2267 455263888 1760154801000000000 f21670514136306b5c179b4ee414d001 1 compiler_rt/cmphf2.zig 472 + 3161 455263889 1760154801000000000 2bb653afb77db3d5045cbb9a02ba3d6f 1 compiler_rt/cmpsf2.zig 473 + 3161 455263886 1760154801000000000 5ff781811d3f999df43ff5a63d8e0b2f 1 compiler_rt/cmpdf2.zig 474 + 4739 455263891 1760154801000000000 13d86b526247d5092d8aacf0b67bdcf1 1 compiler_rt/cmptf2.zig 475 + 2248 455263893 1760154801000000000 c47b1b506563f516dd85df37da1ca80d 1 compiler_rt/cmpxf2.zig 476 + 341 455264143 1760154801000000000 2ed4e26e2ea3869e810a2840aa44890c 1 compiler_rt/unordhf2.zig 477 + 634 455264144 1760154801000000000 ab97f41ff7e85578831672d29873bb7c 1 compiler_rt/unordsf2.zig 478 + 634 455264142 1760154801000000000 8fcd7331877db9156a9489d458816d1a 1 compiler_rt/unorddf2.zig 479 + 341 455264146 1760154801000000000 c6765ab1f830c13ccdf800de46e1d4c3 1 compiler_rt/unordxf2.zig 480 + 656 455264145 1760154801000000000 2a6c721c57e5b4fc4d03f1414d3bfa0c 1 compiler_rt/unordtf2.zig 481 + 960 455264032 1760154801000000000 44f070ee85c4299b7b861a8753e20983 1 compiler_rt/gehf2.zig 482 + 1567 455264033 1760154801000000000 d83ee65d70e22642ca348d28af9e8b1d 1 compiler_rt/gesf2.zig 483 + 1567 455264031 1760154801000000000 f7babfa2824209ae274b4f7f048979ff 1 compiler_rt/gedf2.zig 484 + 531 455264035 1760154801000000000 825137d9239fe8820abd067fa358ff6c 1 compiler_rt/gexf2.zig 485 + 1375 455264034 1760154801000000000 baf5038daac3654c38c49861c12af8f8 1 compiler_rt/getf2.zig 486 + 6348 455263856 1760154801000000000 9d6fb22665d5ae546ff48bce14f4265e 1 compiler_rt/addf3.zig 487 + 319 455263858 1760154801000000000 522a47928eb441889cd2d8293ee58f93 1 compiler_rt/addhf3.zig 488 + 594 455263863 1760154801000000000 98c81cd3c52b093c912ead4cc50ee463 1 compiler_rt/addsf3.zig 489 + 594 455263855 1760154801000000000 2fd1f70cd54ab97c68acda6ccd8698ca 1 compiler_rt/adddf3.zig 490 + 725 455263864 1760154801000000000 37b20d2aff3bdc9e0e864c4dd0285ce2 1 compiler_rt/addtf3.zig 491 + 323 455263866 1760154801000000000 3de55ee7141ae65ffda2d57872f49058 1 compiler_rt/addxf3.zig 492 + 406 455264106 1760154801000000000 974a08d8b377c7154ee50e645c4aa5f1 1 compiler_rt/subhf3.zig 493 + 735 455264111 1760154801000000000 c6bad960b48197993e5154abc0dad73e 1 compiler_rt/subsf3.zig 494 + 735 455264105 1760154801000000000 932c462bb7a1ebd827a8601a1a673d8f 1 compiler_rt/subdf3.zig 495 + 884 455264112 1760154801000000000 68c91ec93f437c6420395ef3a23d922a 1 compiler_rt/subtf3.zig 496 + 399 455264115 1760154801000000000 78f78d004278fcfad7128556fb169afb 1 compiler_rt/subxf3.zig 497 + 8398 455264055 1760154801000000000 2e26880d97fb35e9bd4cc1993465b0cb 1 compiler_rt/mulf3.zig 498 + 323 455264058 1760154801000000000 da7bee33a5dc12783e6265082c6339c5 1 compiler_rt/mulhf3.zig 499 + 598 455264064 1760154801000000000 fee4abf27cb742c17acbc579ce4181c9 1 compiler_rt/mulsf3.zig 500 + 598 455264054 1760154801000000000 a3c5a4d1d76996c6a8862bc7edee60e9 1 compiler_rt/muldf3.zig 501 + 737 455264066 1760154801000000000 05e662af04b7c0553caed681261620bc 1 compiler_rt/multf3.zig 502 + 323 455264069 1760154801000000000 20b9631d337fdb552805ef976ffdc51e 1 compiler_rt/mulxf3.zig 503 + 344 455263909 1760154801000000000 c658197861ba0fe65f6c4da66921da72 1 compiler_rt/divhf3.zig 504 + 8574 455263912 1760154801000000000 57deaddafd7a8db15df6bbeca7d2d850 1 compiler_rt/divsf3.zig 505 + 9366 455263906 1760154801000000000 3f0a4a77ece42e5c0a92b591f8219814 1 compiler_rt/divdf3.zig 506 + 8669 455263920 1760154801000000000 9c07b341767fa995dedd55167cc3e222 1 compiler_rt/divxf3.zig 507 + 9925 455263915 1760154801000000000 28531f064bbb7a862fb99a6dd7127380 1 compiler_rt/divtf3.zig 508 + 265 455264073 1760154801000000000 ff779eb9e3281d0f8136f5b61b8e6515 1 compiler_rt/neghf2.zig 509 + 530 455264074 1760154801000000000 e570a93d326095aad9dfa0af89f5e12d 1 compiler_rt/negsf2.zig 510 + 530 455264071 1760154801000000000 239867284b810ba2b4b7139ff96a22c0 1 compiler_rt/negdf2.zig 511 + 409 455264076 1760154801000000000 68cda8c4538ebcdadbb16771ebed9613 1 compiler_rt/negtf2.zig 512 + 265 455264082 1760154801000000000 e6f608fbc42d09928e6d353d3e4ae05e 1 compiler_rt/negxf2.zig 513 + 2072 455264092 1760154801000000000 73e4d664a217ad2fe999244a64307073 1 compiler_rt/powiXf2.zig 514 + 2275 455264051 1760154801000000000 31c049fe940585ddd225b0c4f49de0ab 1 compiler_rt/mulc3.zig 515 + 425 455264057 1760154801000000000 9057d1c7c2b8e98f5c09215baab464e3 1 compiler_rt/mulhc3.zig 516 + 425 455264063 1760154801000000000 46a186b40dbf8b1a78fd7664e825477d 1 compiler_rt/mulsc3.zig 517 + 425 455264053 1760154801000000000 ae9761607983803a875dc03e2bcf93b2 1 compiler_rt/muldc3.zig 518 + 425 455264068 1760154801000000000 241de1bd5170ea794fe6a65e3ca1c4b6 1 compiler_rt/mulxc3.zig 519 + 581 455264065 1760154801000000000 8ff2e7539ccf94a8ea6a7d0fb870f8ac 1 compiler_rt/multc3.zig 520 + 2280 455263903 1760154801000000000 9e6aaeda713b6cd43eca1180606dc9f8 1 compiler_rt/divc3.zig 521 + 434 455263908 1760154801000000000 99234ee0594362f25d0034479872a24d 1 compiler_rt/divhc3.zig 522 + 434 455263911 1760154801000000000 19324ba1cf08e607b54db47c52783c60 1 compiler_rt/divsc3.zig 523 + 434 455263905 1760154801000000000 a5c0557ad47ea2daea69c331226b6bb8 1 compiler_rt/divdc3.zig 524 + 434 455263919 1760154801000000000 0ba3ba63c22ba9609413264f8e142986 1 compiler_rt/divxc3.zig 525 + 590 455263914 1760154801000000000 b09a8555aa3985adc8de9d9dbbaeaab0 1 compiler_rt/divtc3.zig 526 + 5139 455263880 1760154801000000000 3377d5bdbc89549229fcc2bdded00385 1 compiler_rt/ceil.zig 527 + 5691 455263898 1760154801000000000 4e53be9b20a311a96eb63bafe37225d8 1 compiler_rt/cos.zig 528 + 11677 455263923 1760154801000000000 c4da63d897aa5d3cef3988faddf0733e 1 compiler_rt/exp.zig 529 + 20924 455263924 1760154801000000000 8444963967b3c617eebec50d6b319393 1 compiler_rt/exp2.zig 530 + 1913 455263937 1760154801000000000 d639f3899db4d8abd8eb6de3c9db692b 1 compiler_rt/fabs.zig 531 + 6290 455264024 1760154801000000000 f78026c2945813b1868334b3f8d6b1ea 1 compiler_rt/floor.zig 532 + 11575 455264025 1760154801000000000 acbf337ea57443d50122200a70477bd3 1 compiler_rt/fma.zig 533 + 2867 455264026 1760154801000000000 53832890224a36ee564f78656fad8acb 1 compiler_rt/fmax.zig 534 + 2869 455264027 1760154801000000000 16d3b98ffc9e7622d085e6ec340bef8b 1 compiler_rt/fmin.zig 535 + 12218 455264028 1760154801000000000 6096cb43202506289c56b29536a3c88b 1 compiler_rt/fmod.zig 536 + 8304 455264040 1760154801000000000 4a2ae209edc8dde5555884addb0c3270 1 compiler_rt/log.zig 537 + 9499 455264041 1760154801000000000 192e6cb083dc2203281a462a1129dc3e 1 compiler_rt/log10.zig 538 + 8927 455264042 1760154801000000000 788bd8e755b980f4765163024433bbef 1 compiler_rt/log2.zig 539 + 5307 455264097 1760154801000000000 64efbcc2e1df4cd325e1f4f05a9b43b6 1 compiler_rt/round.zig 540 + 6783 455264100 1760154801000000000 46b58824ce56ea0819341b2de4e4ce88 1 compiler_rt/sin.zig 541 + 8779 455264101 1760154801000000000 3372bf45f142a4244845a7d576e8a739 1 compiler_rt/sincos.zig 542 + 8445 455264102 1760154801000000000 834a20db0b154a40177782adbf1d021c 1 compiler_rt/sqrt.zig 543 + 6175 455264116 1760154801000000000 38bdd1e5397ae3ef6734324ee90f2cd8 1 compiler_rt/tan.zig 544 + 4509 455264118 1760154801000000000 452e79786bcf746a89464e0b468a1772 1 compiler_rt/trunc.zig 545 + 2047 455263910 1760154801000000000 1b5ba254fdfc08708a375c730450065e 1 compiler_rt/divmodei4.zig 546 + 5345 455264136 1760154801000000000 ce988d5b59fa957acec0cc0f5514f027 1 compiler_rt/udivmodei4.zig 547 + 886 455264138 1760154801000000000 3884d7d5d17d10b6c390591f14760c21 1 compiler_rt/udivmodti4.zig 548 + 2988 455264083 1760154801000000000 727f94ca1d77099453ad061b28f9f45b 1 compiler_rt/os_version_check.zig 549 + 12571 455263922 1760154801000000000 f2228bdf0cb635f1b1b962a3db633e85 1 compiler_rt/emutls.zig 550 + 11159 455263867 1760154801000000000 ef54630cfc4305fe4ecb7743de685276 1 compiler_rt/arm.zig 551 + 2563 455263869 1760154801000000000 667b1a412a0d66f8b44b2a8e8e4e16e2 1 compiler_rt/aulldiv.zig 552 + 2618 455263870 1760154801000000000 420aa19734f8e183daf736d09d96e8e9 1 compiler_rt/aullrem.zig 553 + 7746 455263881 1760154801000000000 65f560b740acc191d870c5c89599c99a 1 compiler_rt/clear_cache.zig 554 + 45809 455264036 1760154801000000000 8aceb9f3653d891b582dbd9b55b0d02a 1 compiler_rt/hexagon.zig 555 + 26388 455263868 1760154801000000000 2dbf62f073b314f8249867dbbbfb5589 1 compiler_rt/atomics.zig 556 + 9539 455264104 1760154801000000000 1d35c260060522cd892607322c1b0e17 1 compiler_rt/stack_probe.zig 557 + 79084 455263847 1760154801000000000 bda0e04701fa77ae568c29186ee9ccfb 1 compiler_rt/aarch64_outline_atomics.zig 558 + 6452 455264044 1760154801000000000 4cf074ce1df0bab8aba60356cc8ab857 1 compiler_rt/memcpy.zig 559 + 876 455264046 1760154801000000000 13a474bc83ea39da1548064a0ec84fe6 1 compiler_rt/memset.zig 560 + 7246 455264045 1760154801000000000 ab21f482b4ceecf867dcaf6370424fd5 1 compiler_rt/memmove.zig 561 + 931 455264043 1760154801000000000 ab9203076a9f7358651a1ac57a2238e6 1 compiler_rt/memcmp.zig 562 + 874 455263871 1760154801000000000 964d18da8969575344227310559069cf 1 compiler_rt/bcmp.zig 563 + 4524 455264103 1760154801000000000 3e80fe1b407f6f691b38a2b042fb4b64 1 compiler_rt/ssp.zig 564 + 8052 455282434 1760154801000000000 bbc3cbd53ca9eaab481a4b2874506c59 1 std/Build/Cache/Path.zig 565 + 2142 455282433 1760154801000000000 fe57a392618de045bf46b476d4e9b36f 1 std/Build/Cache/Directory.zig 566 + 37958 455282432 1760154801000000000 09f6c6d5c5a3e85759082f1ad46ebffa 1 std/Build/Cache/DepTokenizer.zig 567 + 2901 455282439 1760154801000000000 d277c72d570fa923fd437605bbd83e30 1 std/Build/Step/CheckFile.zig 568 + 117426 455282440 1760154801000000000 f327f9fe4a8649cc483e714c56bdafff 1 std/Build/Step/CheckObject.zig 569 + 41853 455282442 1760154801000000000 b089407ebc9e35a98f96dcfafbea622a 1 std/Build/Step/ConfigHeader.zig 570 + 831 455282443 1760154801000000000 0f223ee68995072c4beb7fd3ae600b02 1 std/Build/Step/Fail.zig 571 + 2711 455282444 1760154801000000000 72715636b21818d37288de283148c101 1 std/Build/Step/Fmt.zig 572 + 7843 455282445 1760154801000000000 b720790bf6e89535660d8996075ceed1 1 std/Build/Step/InstallArtifact.zig 573 + 4431 455282446 1760154801000000000 d1f0707c6afc3c9202b9d6dd0c114338 1 std/Build/Step/InstallDir.zig 574 + 1460 455282447 1760154801000000000 0040eb5b0836e8fa2056b8e33d66b4dd 1 std/Build/Step/InstallFile.zig 575 + 8154 455282448 1760154801000000000 fdd933a4e6d14f259812199ba337c9f2 1 std/Build/Step/ObjCopy.zig 576 + 87950 455282441 1760154801000000000 0bd85692649c85718b6ee8e4a977c7c8 1 std/Build/Step/Compile.zig 577 + 23856 455282449 1760154801000000000 04314b9ec6c4719520c8922f20479b10 1 std/Build/Step/Options.zig 578 + 1443 455282450 1760154801000000000 ad5ec7793142fc110b85e04588c7be90 1 std/Build/Step/RemoveDir.zig 579 + 73144 455282451 1760154801000000000 defa27d5c5918845503abf3bee647924 1 std/Build/Step/Run.zig 580 + 7560 455282452 1760154801000000000 9797ebcb743e2fc012570da797df3407 1 std/Build/Step/TranslateC.zig 581 + 13184 455282454 1760154801000000000 d3b8a19eb1eb2d1fa857b99bfea07950 1 std/Build/Step/WriteFile.zig 582 + 4247 455282453 1760154801000000000 78c06c4c05a1846f4e7d6ff9c0da4068 1 std/Build/Step/UpdateSourceFiles.zig 583 + 22825 455282457 1760154801000000000 e4bcf69644dd1afc10772570851bf6db 1 std/Build/Watch/FsEvents.zig 584 + 3139 455282467 1760154801000000000 9cdab6e064cbd6eed941e14fce46bc3f 1 std/Io/Reader/Limited.zig 585 + 0 455282468 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/Io/Reader/test.zig 586 + 2533 455282526 1760154801000000000 e0af5510611c7c2688093972c6ace145 1 std/Thread/Mutex/Recursive.zig 587 + 11928 455282560 1760154801000000000 7a1e10e0d0e9210d2757e410d8473def 1 std/compress/flate/Compress.zig 588 + 47768 455282561 1760154801000000000 d87a77c2d3a950f7fb4503b2e91beb66 1 std/compress/flate/Decompress.zig 589 + 18914 455282562 1760154801000000000 c9cb33e59ca13018183045e0a1d980a9 1 std/compress/flate/HuffmanEncoder.zig 590 + 11871 455282570 1760154801000000000 1a80b6a0f5b379bcaa6324ad497a62d9 1 std/compress/lzma/decode.zig 591 + 0 455282571 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/compress/lzma/test.zig 592 + 3774 455282572 1760154801000000000 ba9dc0a0f8124583244e2f0c677410fc 1 std/compress/lzma/vec2d.zig 593 + 4704 455282575 1760154801000000000 34dab553e7d44c4c18351939467c745c 1 std/compress/lzma2/decode.zig 594 + 7157 455282578 1760154801000000000 a0e5aefb8ceae6798c4b2fe9540cefee 1 std/compress/xz/block.zig 595 + 0 455282579 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/compress/xz/test.zig 596 + 78531 455282582 1760154801000000000 d44d8434a6ff685d9cec10bd257151c5 1 std/compress/zstd/Decompress.zig 597 + 0 455282675 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/crypto/test.zig 598 + 22223 455282602 1760154801000000000 7e23bb5bcd64c4725f7c071dd3496b74 1 std/crypto/aes/aesni.zig 599 + 22711 455282603 1760154801000000000 8e77a640bfd456ac5363ff36bd93c4ba 1 std/crypto/aes/armcrypto.zig 600 + 33347 455282604 1760154801000000000 7de9cecbcab3c869e16f2fbaf7076a48 1 std/crypto/aes/soft.zig 601 + 14574 455282590 1760154801000000000 b552b509d9ec611014aa027c881ac91c 1 std/crypto/25519/field.zig 602 + 33703 455282592 1760154801000000000 d4b52682012c0195eb1aa7312d067798 1 std/crypto/25519/scalar.zig 603 + 338 455282647 1760154801000000000 433b788abb384ec7e4c3641754e6dde9 1 std/crypto/pcurves/p256/field.zig 604 + 7421 455282650 1760154801000000000 00494b8811c2d7df07fff5d27198954c 1 std/crypto/pcurves/p256/scalar.zig 605 + 5656 455282665 1760154801000000000 05c95744a349b07172e4c400b1e28cc1 1 std/crypto/pcurves/tests/p256.zig 606 + 376 455282653 1760154801000000000 69a49ff5f537dcd2044702ac14b6891c 1 std/crypto/pcurves/p384/field.zig 607 + 6669 455282656 1760154801000000000 7aee4435d80a972d5bcff185b164ee8e 1 std/crypto/pcurves/p384/scalar.zig 608 + 6707 455282666 1760154801000000000 3f1e1e56980e64672ccd1fba3a631951 1 std/crypto/pcurves/tests/p384.zig 609 + 343 455282659 1760154801000000000 738b22249e1d3a4c001765286bc82756 1 std/crypto/pcurves/secp256k1/field.zig 610 + 7426 455282660 1760154801000000000 1b99358655e3f9a938c25cb631d52e50 1 std/crypto/pcurves/secp256k1/scalar.zig 611 + 6029 455282667 1760154801000000000 4a9ce792ab6709c6ebf9e7dbf5e30590 1 std/crypto/pcurves/tests/secp256k1.zig 612 + 11649 455282628 1760154801000000000 884bf9edd77ebad5200670e26c236280 1 std/crypto/codecs/asn1.zig 613 + 17997 455282629 1760154801000000000 7ea1a954927b43ca5ab7f95c3becd401 1 std/crypto/codecs/base64_hex_ct.zig 614 + 81614 455282679 1760154801000000000 470f907682a83e0bd6639a9c16ae79c2 1 std/crypto/tls/Client.zig 615 + 12470 455282597 1760154801000000000 9c92810e5147e8de0f25e1658fa23a75 1 std/crypto/Certificate/Bundle.zig 616 + 71838 455282687 1760154801000000000 5c3513456ba79222f02ca36a90963776 1 std/debug/Dwarf/expression.zig 617 + 17609 455282685 1760154801000000000 f39611d52911878891dbef3fba794ac1 1 std/debug/Dwarf/abi.zig 618 + 10007 455282686 1760154801000000000 46471a00c4eea2acab55cc6337899adc 1 std/debug/Dwarf/call_frame.zig 619 + 9426 455282720 1760154801000000000 19fe74e26814be7f5083c3d8b5a0983e 1 std/fmt/parse_float/parse.zig 620 + 2950 455282717 1760154801000000000 e2f6cedde735fdaf086b7e0efdb66505 1 std/fmt/parse_float/convert_hex.zig 621 + 5401 455282716 1760154801000000000 cbeba905313f9b6c917fb231993989fe 1 std/fmt/parse_float/convert_fast.zig 622 + 48543 455282715 1760154801000000000 82c419f8469193cf67852d0ac4c65f55 1 std/fmt/parse_float/convert_eisel_lemire.zig 623 + 4586 455282718 1760154801000000000 2562e4c50c6403023d508a0c7e1f15f0 1 std/fmt/parse_float/convert_slow.zig 624 + 3506 455282739 1760154801000000000 9428b7df45d5b928d9c004b955588fe0 1 std/hash/crc/impl.zig 625 + 0 455282740 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/hash/crc/test.zig 626 + 2075 455282744 1760154801000000000 5910881f138d791cfa09dd89cc12fc40 1 std/hash/verify.zig 627 + 237477 455282947 1760154801000000000 67644436e9162e79563b60f574b36f99 1 std/os/windows/ntstatus.zig 628 + 0 455282773 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/dynamic_test.zig 629 + 0 455282775 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/hashmap_test.zig 630 + 0 455282776 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/scanner_test.zig 631 + 0 455282778 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/json/static_test.zig 632 + 995 455282823 1760154801000000000 59077bc2784a5df334de08609b4c2a55 1 std/math/expo2.zig 633 + 452 455282798 1760154801000000000 ce633e6b665f3caba98995a3f146d7c7 1 std/math/complex/abs.zig 634 + 678 455282800 1760154801000000000 9dd2ece0bd4c6366c4a3cb5bf7b3db17 1 std/math/complex/acosh.zig 635 + 608 455282799 1760154801000000000 e3a7d70f219edead2e32e66a9476a469 1 std/math/complex/acos.zig 636 + 458 455282801 1760154801000000000 2fea305ef49ff29fdd688d2f7342051d 1 std/math/complex/arg.zig 637 + 641 455282803 1760154801000000000 59bed4da0e5763cbf2a3e08ec4bc9c6c 1 std/math/complex/asinh.zig 638 + 750 455282802 1760154801000000000 26f02f5afc54b9ec7673ddd6d0fcc3a9 1 std/math/complex/asin.zig 639 + 645 455282805 1760154801000000000 adf7751d27453fed0d4977a2dc50e85e 1 std/math/complex/atanh.zig 640 + 2527 455282804 1760154801000000000 2a909954adb7520e1eb158124c280ca2 1 std/math/complex/atan.zig 641 + 484 455282806 1760154801000000000 a9e61e0f7280deab3d077856af6ca8d9 1 std/math/complex/conj.zig 642 + 5818 455282808 1760154801000000000 3b53a3d1a1285447f00cc90f422cb7b1 1 std/math/complex/cosh.zig 643 + 577 455282807 1760154801000000000 26877517b7d9d620e841272fd8ea3661 1 std/math/complex/cos.zig 644 + 4899 455282809 1760154801000000000 4f31c5e9d921097840da690cc0324595 1 std/math/complex/exp.zig 645 + 620 455282811 1760154801000000000 4e4bb03cdbb57072938d447952587286 1 std/math/complex/log.zig 646 + 608 455282812 1760154801000000000 1258f2af84237de74fd033b6776798f2 1 std/math/complex/pow.zig 647 + 628 455282813 1760154801000000000 b5f2e65410101f915fb75fa5712c2fd4 1 std/math/complex/proj.zig 648 + 5363 455282815 1760154801000000000 89568cfbf7f8196aafffbd55ea670070 1 std/math/complex/sinh.zig 649 + 620 455282814 1760154801000000000 4aade0cdfc8ac82b062412f5566aec6c 1 std/math/complex/sin.zig 650 + 4249 455282816 1760154801000000000 0aeb21db75d92940ddcb1491d2f0445e 1 std/math/complex/sqrt.zig 651 + 3847 455282818 1760154801000000000 98009ed972f9f5fcb177d10a345456e1 1 std/math/complex/tanh.zig 652 + 626 455282817 1760154801000000000 ac4f4ba1ea51c6a8f2101a7bdf3b0d7c 1 std/math/complex/tan.zig 653 + 175949 455282793 1760154801000000000 0a5bbf25108279be2f993ad7617db7b4 1 std/math/big/int.zig 654 + 3762 455282894 1760154801000000000 2fd0c246f4a8e9ba6ccef5ff7cf0ccfe 1 std/os/linux/vdso.zig 655 + 0 455282891 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/os/linux/test.zig 656 + 13117 455282895 1760154801000000000 71b9a59db11f287d3253e001a21a4028 1 std/os/linux/x86.zig 657 + 13489 455282896 1760154801000000000 958bec870d653d2a62890b93b463512b 1 std/os/linux/x86_64.zig 658 + 6720 455282868 1760154801000000000 186c59f27378f16795ba8c8611b5ed95 1 std/os/linux/aarch64.zig 659 + 7970 455282869 1760154801000000000 0f4c26b73e6698859b53f9b715f3d611 1 std/os/linux/arm.zig 660 + 6097 455282876 1760154801000000000 a5e8b96435a27d99de81726a3b93e16d 1 std/os/linux/hexagon.zig 661 + 6540 455282885 1760154801000000000 9b9c64b903ecbb48c7b6c661455ef036 1 std/os/linux/riscv32.zig 662 + 6541 455282886 1760154801000000000 b833f96b582cdd1676bf2bda0ac01e90 1 std/os/linux/riscv64.zig 663 + 10847 455282889 1760154801000000000 0c589fb5ebf73b4b5662a31d45d76c75 1 std/os/linux/sparc64.zig 664 + 7941 455282879 1760154801000000000 7e1c50fd483adea99b19665fe38b2f72 1 std/os/linux/loongarch64.zig 665 + 6634 455282880 1760154801000000000 ad9a26a1c9c2d04c67203fdcf578c9f1 1 std/os/linux/m68k.zig 666 + 11254 455282881 1760154801000000000 69fd31ffc9e830951f1293a9ee9cfb72 1 std/os/linux/mips.zig 667 + 10635 455282882 1760154801000000000 ff911a8bf83253a4b85221f8a5f72189 1 std/os/linux/mips64.zig 668 + 11375 455282883 1760154801000000000 c689805d51c081e34daf6fbc5a98b5ed 1 std/os/linux/powerpc.zig 669 + 11367 455282884 1760154801000000000 9859b17cc2c3e96bf4a8b8f5b254c760 1 std/os/linux/powerpc64.zig 670 + 7186 455282887 1760154801000000000 29692c77734256a2fc877fcec567d9a0 1 std/os/linux/s390x.zig 671 + 4390 455282892 1760154801000000000 9e872767168dbe4e563e8ca82d35d42e 1 std/os/linux/thumb.zig 672 + 18676 455282893 1760154801000000000 79cbf225d0993e9837e569f3e09e0314 1 std/os/linux/tls.zig 673 + 46056 455282875 1760154801000000000 9fe341cf598b87b036f8a411741658f9 1 std/os/linux/bpf.zig 674 + 1297 455282878 1760154801000000000 daac8c407161fbb4bb996238aee46635 1 std/os/linux/ioctl.zig 675 + 8427 455282888 1760154801000000000 b845f84a2ea6f5532d8ffc78297dafed 1 std/os/linux/seccomp.zig 676 + 183126 455282890 1760154801000000000 fd2ae47bc58a4f876d2cb8205d4888ea 1 std/os/linux/syscalls.zig 677 + 19909 455282877 1760154801000000000 a1611786e4dda806effaf2301a5cf0ae 1 std/os/linux/io_uring_sqe.zig 678 + 173427 455282867 1760154801000000000 46b12a066a5e37b8a275732fa67d5529 1 std/os/linux/IoUring.zig 679 + 2126 455282899 1760154801000000000 d6f497f7c3ede56b9dd8eb2cae54c566 1 std/os/plan9/x86_64.zig 680 + 2368 455282929 1760154801000000000 ef3b4d934ff0fc89d4b9c013f363e19f 1 std/os/uefi/protocol.zig 681 + 37311 455282902 1760154801000000000 a67c5d40f56e40984ce32fba49cfa0bc 1 std/os/uefi/device_path.zig 682 + 2078 455282903 1760154801000000000 13b23e26af6b210b16c77d73b956e867 1 std/os/uefi/hii.zig 683 + 10107 455282930 1760154801000000000 e4c1fe82be2b68376749dbb625002706 1 std/os/uefi/status.zig 684 + 10741 455282937 1760154801000000000 3ec6d3df7b26921a90d6a5400e0d4eb3 1 std/os/uefi/tables.zig 685 + 3906 455282904 1760154801000000000 5c4587a7b4f3370e256119bdab607b4a 1 std/os/uefi/pool_allocator.zig 686 + 0 455282949 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/os/windows/test.zig 687 + 2144 455282941 1760154801000000000 25e202ff708858513ae7203c6f1043cf 1 std/os/windows/advapi32.zig 688 + 19302 455282943 1760154801000000000 4166d597fb4bd529b9418c145598c4d4 1 std/os/windows/kernel32.zig 689 + 12119 455282946 1760154801000000000 90384510a1298bc4a80542f39d2cc399 1 std/os/windows/ntdll.zig 690 + 77480 455282952 1760154801000000000 d85c6950ac08847c1673726e62f4953f 1 std/os/windows/ws2_32.zig 691 + 850 455282942 1760154801000000000 058a13f92bf4ee16e52beb60bf057dc9 1 std/os/windows/crypt32.zig 692 + 20117 455282945 1760154801000000000 696b67a75a9a665eb00672233edffbb2 1 std/os/windows/nls.zig 693 + 130227 455282951 1760154801000000000 a0ee928ca20f189c11667764ca96b243 1 std/os/windows/win32error.zig 694 + 3697 455282944 1760154801000000000 f5f54b1cf522ff663148d3c96268d459 1 std/os/windows/lang.zig 695 + 8449 455282948 1760154801000000000 3c42a760ba486f9b9455bd95d20d2e0b 1 std/os/windows/sublang.zig 696 + 135650 455283006 1760154801000000000 a31eb8d48506c25579555c4efd1a9faf 1 std/zig/Parse.zig 697 + 142067 455282997 1760154801000000000 c11d0a46b8fb10db9e0b6b86306a47a4 1 std/zig/Ast/Render.zig 698 + 8409 455283026 1760154801000000000 05fc398cc2e6071c55b8a2a2fbc73720 1 std/zig/system/NativePaths.zig 699 + 12217 455283032 1760154801000000000 431d341ca0da87ee822118293b8def7c 1 std/zig/system/windows.zig 700 + 2441 455283030 1760154801000000000 35ecedf1e23a5fca314cc4de0bb8b2f9 1 std/zig/system/darwin.zig 701 + 15180 455283031 1760154801000000000 33621c7cb8fc88d890376af63807d420 1 std/zig/system/linux.zig 702 + 26641 455283033 1760154801000000000 1653caac0003b8e8b9474f11b36c5a76 1 std/zig/system/x86.zig 703 + 19941 455283015 1760154801000000000 43431a1cd764230b64c7ea49ae836f33 1 std/zig/llvm/BitcodeReader.zig 704 + 17956 455283017 1760154801000000000 fc195102d6af02ed5678e5f0aa8b8390 1 std/zig/llvm/bitcode_writer.zig 705 + 592181 455283016 1760154801000000000 eb4547393bea04ef1cf32079beef364a 1 std/zig/llvm/Builder.zig 706 + 0 455263883 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzsi2_test.zig 707 + 0 455263882 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzdi2_test.zig 708 + 0 455263884 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/clzti2_test.zig 709 + 0 455263901 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzsi2_test.zig 710 + 0 455263900 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzdi2_test.zig 711 + 0 455263902 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ctzti2_test.zig 712 + 0 455263939 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffssi2_test.zig 713 + 0 455263938 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffsdi2_test.zig 714 + 0 455263940 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ffsti2_test.zig 715 + 0 455264086 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/paritysi2_test.zig 716 + 0 455264085 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/paritydi2_test.zig 717 + 0 455264087 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/parityti2_test.zig 718 + 0 455264090 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountsi2_test.zig 719 + 0 455264089 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountdi2_test.zig 720 + 0 455264091 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/popcountti2_test.zig 721 + 0 455263874 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreversesi2_test.zig 722 + 0 455263873 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreversedi2_test.zig 723 + 0 455263875 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bitreverseti2_test.zig 724 + 0 455263878 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapsi2_test.zig 725 + 0 455263877 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapdi2_test.zig 726 + 0 455263879 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/bswapti2_test.zig 727 + 0 455263890 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpsi2_test.zig 728 + 0 455263887 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpdi2_test.zig 729 + 0 455263892 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/cmpti2_test.zig 730 + 0 455264132 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpsi2_test.zig 731 + 0 455264131 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpdi2_test.zig 732 + 0 455264133 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/ucmpti2_test.zig 733 + 0 455264099 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/shift_test.zig 734 + 0 455264075 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negsi2_test.zig 735 + 0 455264072 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negdi2_test.zig 736 + 0 455264077 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negti2_test.zig 737 + 4285 455264134 1760154801000000000 3a706e00becb790763e2c63d183e345f 1 compiler_rt/udivmod.zig 738 + 0 455264135 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/udivmoddi4_test.zig 739 + 0 455264050 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulXi3_test.zig 740 + 0 455263918 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divti3_test.zig 741 + 0 455264048 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/modti3_test.zig 742 + 0 455263852 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvsi2_test.zig 743 + 0 455263850 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvdi2_test.zig 744 + 0 455263854 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/absvti2_test.zig 745 + 0 455264080 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvsi2_test.zig 746 + 0 455264079 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvdi2_test.zig 747 + 0 455264081 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/negvti2_test.zig 748 + 0 455263861 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addosi4_test.zig 749 + 0 455263860 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addodi4_test.zig 750 + 0 455263862 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addoti4_test.zig 751 + 0 455264109 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/subosi4_test.zig 752 + 0 455264108 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/subodi4_test.zig 753 + 0 455264110 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/suboti4_test.zig 754 + 0 455264061 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulosi4_test.zig 755 + 0 455264060 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulodi4_test.zig 756 + 0 455264062 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/muloti4_test.zig 757 + 0 455263928 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/extendf_test.zig 758 + 0 455264122 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/truncf_test.zig 759 + 0 455264039 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/int_from_float_test.zig 760 + 0 455263983 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/float_from_int_test.zig 761 + 0 455263897 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/comparesf2_test.zig 762 + 0 455263895 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/comparedf2_test.zig 763 + 0 455263857 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/addf3_test.zig 764 + 0 455264056 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/mulf3_test.zig 765 + 0 455263913 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divsf3_test.zig 766 + 0 455263907 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divdf3_test.zig 767 + 0 455263921 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divxf3_test.zig 768 + 0 455263916 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/divtf3_test.zig 769 + 0 455264093 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/powiXf2_test.zig 770 + 11743 455264117 1760154801000000000 20b5273f511a6677b3f49f750fcaf786 1 compiler_rt/trig.zig 771 + 6045 455264094 1760154801000000000 18b634df64d66eb7c240db46b32eea60 1 compiler_rt/rem_pio2.zig 772 + 2247 455264096 1760154801000000000 2337e183931c970621500018ffe636df 1 compiler_rt/rem_pio2f.zig 773 + 0 455264029 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/fmodq_test.zig 774 + 0 455264030 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/fmodx_test.zig 775 + 0 455264139 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 compiler_rt/udivmodti4_test.zig 776 + 13531 455282564 1760154801000000000 479ed8dfe695d0a2eea06b674b3ed0da 1 std/compress/flate/Token.zig 777 + 20508 455282559 1760154801000000000 453a65b5b55858b073099208c4e07ca8 1 std/compress/flate/BlockWriter.zig 778 + 3588 455282563 1760154801000000000 5a3d7acaca811bf6b6e62a58645eddae 1 std/compress/flate/Lookup.zig 779 + 5945 455282568 1760154801000000000 937d6b84c08ac71922db69ef4603ee39 1 std/compress/lzma/decode/lzbuffer.zig 780 + 4994 455282569 1760154801000000000 159872c0de3e30f43567e5ed7666125d 1 std/compress/lzma/decode/rangecoder.zig 781 + 12650 455282645 1760154801000000000 56befc361ef070a7bd0a2d3c1dc46994 1 std/crypto/pcurves/common.zig 782 + 67958 455282648 1760154801000000000 0f2daafefad01026d6796eec68d65d2e 1 std/crypto/pcurves/p256/p256_64.zig 783 + 76136 455282649 1760154801000000000 8ec5f177ef28f7a2a0ec8d103665db00 1 std/crypto/pcurves/p256/p256_scalar_64.zig 784 + 134511 455282654 1760154801000000000 2e0dda7c40794e981dd2d2471c4776a5 1 std/crypto/pcurves/p384/p384_64.zig 785 + 137291 455282655 1760154801000000000 81eb087d46e6c49907ae0c02d3230828 1 std/crypto/pcurves/p384/p384_scalar_64.zig 786 + 73280 455282661 1760154801000000000 c871f98dad15c7a8c29be9ccefa4b181 1 std/crypto/pcurves/secp256k1/secp256k1_64.zig 787 + 75859 455282662 1760154801000000000 e29275bdb0eb931fc383e7f2f5ded944 1 std/crypto/pcurves/secp256k1/secp256k1_scalar_64.zig 788 + 1807 455282626 1760154801000000000 f47429307ac0920ff18758ce86074549 1 std/crypto/codecs/asn1/der.zig 789 + 7178 455282618 1760154801000000000 6d4dab023a981a670d308b0b120c9077 1 std/crypto/codecs/asn1/Oid.zig 790 + 0 455282627 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/crypto/codecs/asn1/test.zig 791 + 3892 455282596 1760154801000000000 b6e0d691e62b1e9830666c4f8c67fdf4 1 std/crypto/Certificate/Bundle/macos.zig 792 + 3081 455282714 1760154801000000000 2aeda0b8b6036bb4d980778abb5a928a 1 std/fmt/parse_float/common.zig 793 + 3073 455282713 1760154801000000000 3950e4fa1fdd11d50db0b4abfc254022 1 std/fmt/parse_float/FloatStream.zig 794 + 6036 455282712 1760154801000000000 68169ffe43d55f0eb5e26b984ef98670 1 std/fmt/parse_float/FloatInfo.zig 795 + 29140 455282719 1760154801000000000 04115d79320f402803a56bd43cc34cf9 1 std/fmt/parse_float/decimal.zig 796 + 2726 455282810 1760154801000000000 7f318d60fafbfa10754d5644fd131ffe 1 std/math/complex/ldexp.zig 797 + 0 455282794 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/math/big/int_test.zig 798 + 4082 455282871 1760154801000000000 11a08913a0ec64b8325b0d29601479a7 1 std/os/linux/bpf/btf.zig 799 + 1543 455282874 1760154801000000000 95995c37b42f8d7a12578170850af6ee 1 std/os/linux/bpf/kern.zig 800 + 2001 455282920 1760154801000000000 539322409dfd2d684638b127038a6e33 1 std/os/uefi/protocol/service_binding.zig 801 + 1743 455282916 1760154801000000000 e4e18b6e0741218763e2f0eefe57c63c 1 std/os/uefi/protocol/loaded_image.zig 802 + 4860 455282908 1760154801000000000 db6a8b32ce1366281968b6a3dbffb173 1 std/os/uefi/protocol/device_path.zig 803 + 3924 455282918 1760154801000000000 636ee102096b7ee8d15380af87b55c99 1 std/os/uefi/protocol/rng.zig 804 + 544 455282921 1760154801000000000 a0f63cfe62d021c13659600cea4aaa1a 1 std/os/uefi/protocol/shell_parameters.zig 805 + 1524 455282922 1760154801000000000 7748a7cf094118fb46a4fa8cb0e326fb 1 std/os/uefi/protocol/simple_file_system.zig 806 + 13432 455282910 1760154801000000000 995882ac23c2af4019a5dd716a5f09f3 1 std/os/uefi/protocol/file.zig 807 + 5171 455282907 1760154801000000000 9136b751bd537d37181af6f96f23bc0d 1 std/os/uefi/protocol/block_io.zig 808 + 1827 455282925 1760154801000000000 dc816c9ebf174e0f2191f721ebf627fd 1 std/os/uefi/protocol/simple_text_input.zig 809 + 5002 455282926 1760154801000000000 33197652ebd5358fbd566ba1598a738f 1 std/os/uefi/protocol/simple_text_input_ex.zig 810 + 9857 455282927 1760154801000000000 ac75efaf87e83f490e1b05ca64f3d221 1 std/os/uefi/protocol/simple_text_output.zig 811 + 2028 455282924 1760154801000000000 2b300415efacd2dec40e6f1d67488799 1 std/os/uefi/protocol/simple_pointer.zig 812 + 2398 455282906 1760154801000000000 2c87d630cff25fb47ddfd2241990d8f4 1 std/os/uefi/protocol/absolute_pointer.zig 813 + 4876 455282919 1760154801000000000 1955a5a309db3628c52bf415af05b0f8 1 std/os/uefi/protocol/serial_io.zig 814 + 4296 455282911 1760154801000000000 702a798c1a856afdd0ade5a1ee67b3cd 1 std/os/uefi/protocol/graphics_output.zig 815 + 2479 455282909 1760154801000000000 0fab22ebe8c02b50099313679d4e2eb5 1 std/os/uefi/protocol/edid.zig 816 + 15978 455282923 1760154801000000000 95a49124c8237f8d2ab01672bf2a69b1 1 std/os/uefi/protocol/simple_network.zig 817 + 9851 455282917 1760154801000000000 fc89ee17ffacbefb54626ee378473525 1 std/os/uefi/protocol/managed_network.zig 818 + 13201 455282914 1760154801000000000 427b83b08791055f001b217a1bd39a8b 1 std/os/uefi/protocol/ip6.zig 819 + 5373 455282915 1760154801000000000 911ecc11b1404b1bef6afcda6cd7868e 1 std/os/uefi/protocol/ip6_config.zig 820 + 8567 455282928 1760154801000000000 47adbb9c98a53124032c9ef80ce5889f 1 std/os/uefi/protocol/udp6.zig 821 + 4199 455282912 1760154801000000000 b821152f4c9abddf1c1fb114333c66dd 1 std/os/uefi/protocol/hii_database.zig 822 + 1712 455282913 1760154801000000000 1a882e3749f4ef9b5c5827cbb346f6a3 1 std/os/uefi/protocol/hii_popup.zig 823 + 47589 455282932 1760154801000000000 da7566eb78da06f1636e8eb3a693eb3e 1 std/os/uefi/tables/boot_services.zig 824 + 18947 455282934 1760154801000000000 cb1eb30776a43459956ea4c0675dee88 1 std/os/uefi/tables/runtime_services.zig 825 + 2796 455282933 1760154801000000000 f0a08fa361dffa5eadb351a471801946 1 std/os/uefi/tables/configuration_table.zig 826 + 2295 455282935 1760154801000000000 25bf31dd5f33af51b4b9da897fa1e3d5 1 std/os/uefi/tables/system_table.zig 827 + 214 455282936 1760154801000000000 cdb95d6c52cd4654ef26be0bd9f114d4 1 std/os/uefi/tables/table_header.zig 828 + 0 455283021 1760154801000000000 82547a8dd7f3efb3f077622e34876868 1 std/zig/parser_test.zig 829 + 15091 455283027 1760154801000000000 e1ff2fae360a9d1df9777ae4f90bda6a 1 std/zig/system/arm.zig 830 + 16495 455283029 1760154801000000000 753462fa54f971ae23b566336ad73030 1 std/zig/system/darwin/macos.zig 831 + 50924 455283018 1760154801000000000 5c60970433f1092302f7ef4ff90d3f62 1 std/zig/llvm/ir.zig 832 + 20581 455264095 1760154801000000000 e8eaf68a4ffa3364b8f352326a575189 1 compiler_rt/rem_pio2_large.zig 833 + 5806 455282621 1760154801000000000 92f1dd53520d8191f93c177825b7845c 1 std/crypto/codecs/asn1/der/Decoder.zig 834 + 5861 455282622 1760154801000000000 650695830257d32d9ea72d767d918703 1 std/crypto/codecs/asn1/der/Encoder.zig 835 + 419 455282872 1760154801000000000 ed7dfc04a5d0c4f0853edb5414ce981e 1 std/os/linux/bpf/btf_ext.zig 836 + 24293 455282873 1760154801000000000 0c7d3ee9ea8e698a843ee6039fd161c4 1 std/os/linux/bpf/helpers.zig 837 + 3221 455282620 1760154801000000000 fda67b74062c7f535bb0a6d0f1fe74fb 1 std/crypto/codecs/asn1/der/ArrayListReverse.zig 838 + 1315 477686484 1769067631172027297 5890f4267658409a1c99240fe6c525c1 0 /Users/nate/tangled.sh/@zzstoatzz.io/redis/build.zig
+2
.zig-cache/h/dc692d74630e910e8b1bf1d4464c17c4.txt
··· 1 + 0 2 + 1558808 477692802 1769067841169629401 2099d7323495ad620594ee27e1dfbd19 1 .zig-cache/o/e5a00f69a2c2586a4c54235d7c82712b/test
.zig-cache/h/timestamp

This is a binary file and will not be displayed.

.zig-cache/o/0c88abfedbfb15791c06d0c084e368a4/build

This is a binary file and will not be displayed.

.zig-cache/o/0c88abfedbfb15791c06d0c084e368a4/build_zcu.o

This is a binary file and will not be displayed.

.zig-cache/o/e5a00f69a2c2586a4c54235d7c82712b/test

This is a binary file and will not be displayed.

.zig-cache/o/e5a00f69a2c2586a4c54235d7c82712b/test_zcu.o

This is a binary file and will not be displayed.

+2
.zig-cache/o/f1ea4330472a4c6ebcbfed6922919020/dependencies.zig
··· 1 + pub const packages = struct {}; 2 + pub const root_deps: []const struct { []const u8, []const u8 } = &.{};
.zig-cache/z/0de2bc7b8ecf843738d5e3b13139ce2e

This is a binary file and will not be displayed.

.zig-cache/z/37e1163945101cfb6e71866831d2be54

This is a binary file and will not be displayed.

.zig-cache/z/59039415c5db8ececa9ef26ad23ba0b7

This is a binary file and will not be displayed.

.zig-cache/z/5ad65cdbc833d1d21c314cf6de95c35d

This is a binary file and will not be displayed.

.zig-cache/z/8c987ff944a62557ab53ee408b7e9f59

This is a binary file and will not be displayed.

.zig-cache/z/9f2cf3724f3146307195ed403dfad674

This is a binary file and will not be displayed.

.zig-cache/z/be2dd05e03c6a2cd93fb6403c4022e40

This is a binary file and will not be displayed.

.zig-cache/z/cf7db1e857caed5cdc434aa049792eb3

This is a binary file and will not be displayed.

.zig-cache/z/d4f5066f256f58bfedd619eba2b7d581

This is a binary file and will not be displayed.

.zig-cache/z/d53408283fba8e524f3130608712ee6a

This is a binary file and will not be displayed.

.zig-cache/z/d560bf198419f4b81536a9ce9be02983

This is a binary file and will not be displayed.

.zig-cache/z/e6011d929f407e6463978fd6ccf28a38

This is a binary file and will not be displayed.

+110
README.md
··· 1 + # redis 2 + 3 + redis client for zig implementing RESP (REdis Serialization Protocol). 4 + 5 + ## usage 6 + 7 + ```zig 8 + const redis = @import("redis"); 9 + 10 + var client = try redis.Client.connect(allocator, "localhost", 6379); 11 + defer client.close(); 12 + 13 + // strings 14 + var str = client.strings(); 15 + try str.set("key", "value"); 16 + if (try str.get("key")) |val| { ... } 17 + 18 + // hashes 19 + var hash = client.hashes(); 20 + _ = try hash.hset("user:1", &.{ 21 + .{ "name", "alice" }, 22 + .{ "email", "alice@example.com" }, 23 + }); 24 + const all = try hash.hgetAll("user:1"); 25 + 26 + // lists 27 + var list = client.lists(); 28 + _ = try list.rpush("queue", &.{ "a", "b", "c" }); 29 + if (try list.lpop("queue")) |item| { ... } 30 + 31 + // sets 32 + var set = client.sets(); 33 + _ = try set.sadd("tags", &.{ "redis", "fast" }); 34 + const common = try set.sinter(&.{ "set1", "set2" }); 35 + 36 + // sorted sets 37 + var zset = client.sortedSets(); 38 + _ = try zset.zadd("scores", &.{ 39 + .{ .score = 100, .member = "alice" }, 40 + .{ .score = 85, .member = "bob" }, 41 + }, .{}); 42 + const top = try zset.zrangeWithScores("scores", 0, 2, .{ .rev = true }); 43 + 44 + // streams 45 + var stream = client.streams(); 46 + const id = try stream.xadd("events", .auto, &.{.{ "type", "login" }}); 47 + try stream.xgroupCreate("events", "workers", "0", true); 48 + const entries = try stream.xreadgroup("workers", "worker-1", &.{"events"}, &.{">"}, .{}); 49 + ``` 50 + 51 + ## data types 52 + 53 + ### strings 54 + `get`, `set`, `setNx`, `setEx`, `incr`, `incrBy`, `decr`, `decrBy`, `mget`, `mset`, `append`, `strlen` 55 + 56 + ### hashes 57 + `hset`, `hget`, `hmget`, `hdel`, `hexists`, `hlen`, `hincrBy`, `hgetAll`, `hkeys`, `hvals`, `hscan` 58 + 59 + ### lists 60 + `lpush`, `rpush`, `lpop`, `rpop`, `llen`, `lrange`, `lindex`, `lset`, `lrem`, `ltrim`, `blpop`, `brpop`, `lmove`, `blmove` 61 + 62 + ### sets 63 + `sadd`, `srem`, `sismember`, `smismember`, `smembers`, `scard`, `spop`, `srandmember`, `sunion`, `sunionstore`, `sinter`, `sinterstore`, `sintercard`, `sdiff`, `sdiffstore`, `smove`, `sscan` 64 + 65 + ### sorted sets 66 + `zadd`, `zrem`, `zscore`, `zrank`, `zrevrank`, `zcard`, `zcount`, `zincrBy`, `zrange`, `zrangeWithScores`, `zpopmin`, `zpopmax`, `bzpopmin`, `bzpopmax`, `zscan` 67 + 68 + ### streams 69 + `xadd`, `xlen`, `xrange`, `xrevrange`, `xread`, `xgroupCreate`, `xgroupDestroy`, `xgroupCreateConsumer`, `xgroupDelConsumer`, `xreadgroup`, `xack`, `xpending`, `xpendingRange`, `xautoclaim`, `xclaim`, `xtrim`, `xdel`, `xinfo` 70 + 71 + ### keys 72 + `del`, `unlink`, `exists`, `expire`, `expireAt`, `ttl`, `pttl`, `persist`, `rename`, `renameNx`, `type`, `scan`, `keys` 73 + 74 + ## design 75 + 76 + - **tagged unions**: `Value = union(enum)` for all RESP types 77 + - **distinct errors**: `ConnectionError`, `ProtocolError`, `CommandError` 78 + - **buffer ownership**: client owns read buffer; slices valid until next command 79 + - **modular commands**: each data type in its own file 80 + 81 + ## error handling 82 + 83 + ```zig 84 + const result = client.strings().get("key") catch |err| switch (err) { 85 + error.ConnectionRefused => { ... }, 86 + error.Timeout => { ... }, 87 + error.WrongType => { ... }, 88 + else => return err, 89 + }; 90 + ``` 91 + 92 + ## building 93 + 94 + ```bash 95 + zig build test # run tests 96 + zig build run # run example (requires redis on localhost:6379) 97 + ``` 98 + 99 + ## integration 100 + 101 + ```bash 102 + zig fetch --save https://tangled.sh/@zzstoatzz.io/redis/archive/main 103 + ``` 104 + 105 + then in `build.zig`: 106 + 107 + ```zig 108 + const redis_dep = b.dependency("redis", .{ .target = target, .optimize = optimize }); 109 + exe.root_module.addImport("redis", redis_dep.module("redis")); 110 + ```
+44
build.zig
··· 1 + const std = @import("std"); 2 + 3 + pub fn build(b: *std.Build) void { 4 + const target = b.standardTargetOptions(.{}); 5 + const optimize = b.standardOptimizeOption(.{}); 6 + 7 + // library module 8 + const redis_mod = b.addModule("redis", .{ 9 + .root_source_file = b.path("src/redis.zig"), 10 + .target = target, 11 + .optimize = optimize, 12 + }); 13 + 14 + // unit tests 15 + const unit_tests = b.addTest(.{ 16 + .root_module = b.createModule(.{ 17 + .root_source_file = b.path("src/redis.zig"), 18 + .target = target, 19 + .optimize = optimize, 20 + }), 21 + }); 22 + const run_unit_tests = b.addRunArtifact(unit_tests); 23 + const test_step = b.step("test", "run unit tests"); 24 + test_step.dependOn(&run_unit_tests.step); 25 + 26 + // example executable 27 + const example = b.addExecutable(.{ 28 + .name = "redis-example", 29 + .root_module = b.createModule(.{ 30 + .root_source_file = b.path("src/example.zig"), 31 + .target = target, 32 + .optimize = optimize, 33 + .imports = &.{ 34 + .{ .name = "redis", .module = redis_mod }, 35 + }, 36 + }), 37 + }); 38 + 39 + const run_example = b.addRunArtifact(example); 40 + const run_step = b.step("run", "run the example"); 41 + run_step.dependOn(&run_example.step); 42 + 43 + b.installArtifact(example); 44 + }
+14
build.zig.zon
··· 1 + .{ 2 + .name = .redis, 3 + .version = "0.1.0", 4 + .fingerprint = 0x7b25d017bee86334, 5 + .minimum_zig_version = "0.14.0", 6 + 7 + .dependencies = .{}, 8 + 9 + .paths = .{ 10 + "build.zig", 11 + "build.zig.zon", 12 + "src", 13 + }, 14 + }
+390
src/client.zig
··· 1 + //! Redis client connection and command execution 2 + //! 3 + //! This module provides the core `Client` type which manages: 4 + //! - TCP connection to Redis 5 + //! - Buffer management for reads/writes 6 + //! - RESP protocol serialization/deserialization 7 + //! - Authentication and database selection 8 + //! 9 + //! ## Memory Model 10 + //! 11 + //! The client owns a read buffer. Slices returned from commands reference 12 + //! this buffer and are valid until the next command. This avoids allocation 13 + //! for most use cases. 14 + //! 15 + //! For data that must outlive the next command, copy it: 16 + //! ```zig 17 + //! const ephemeral = try client.get("key"); 18 + //! const owned = try allocator.dupe(u8, ephemeral orelse return); 19 + //! defer allocator.free(owned); 20 + //! ``` 21 + //! 22 + //! ## Thread Safety 23 + //! 24 + //! A single `Client` instance is NOT thread-safe. For concurrent access: 25 + //! - Create one client per thread 26 + //! - Use external synchronization (mutex) 27 + //! - Use a connection pool (not provided here) 28 + 29 + const std = @import("std"); 30 + const net = std.net; 31 + const Allocator = std.mem.Allocator; 32 + 33 + const resp = @import("resp.zig"); 34 + pub const Value = resp.Value; 35 + pub const ConnectionError = resp.ConnectionError; 36 + pub const ProtocolError = resp.ProtocolError; 37 + pub const CommandError = resp.CommandError; 38 + pub const ClientError = resp.ClientError; 39 + 40 + /// Redis client with connection and buffer management. 41 + /// 42 + /// The client is designed for simplicity and efficiency: 43 + /// - Single TCP connection (no pipelining yet) 44 + /// - Owned read buffer (grows as needed) 45 + /// - Stack-allocated command buffer for small commands 46 + pub const Client = struct { 47 + const Self = @This(); 48 + 49 + stream: net.Stream, 50 + allocator: Allocator, 51 + read_buf: []u8, 52 + buf_len: usize = 0, 53 + buf_pos: usize = 0, 54 + 55 + /// Stack buffer for small commands (16KB covers most cases) 56 + cmd_buf: [16384]u8 = undefined, 57 + 58 + /// Heap buffer for large commands (allocated on demand) 59 + heap_cmd_buf: ?[]u8 = null, 60 + 61 + const DEFAULT_READ_BUF_SIZE = 65536; 62 + 63 + // ======================================================================== 64 + // Configuration 65 + // ======================================================================== 66 + 67 + /// Connection configuration 68 + pub const Config = struct { 69 + host: []const u8 = "localhost", 70 + port: u16 = 6379, 71 + username: []const u8 = "default", 72 + password: []const u8 = "", 73 + db: u8 = 0, 74 + /// Read buffer size (default 64KB) 75 + read_buffer_size: usize = DEFAULT_READ_BUF_SIZE, 76 + }; 77 + 78 + // ======================================================================== 79 + // Connection 80 + // ======================================================================== 81 + 82 + /// Connect to Redis with minimal configuration. 83 + /// Use `connectWithConfig` for full control. 84 + pub fn connect(allocator: Allocator, host: []const u8, port: u16) ClientError!Self { 85 + return connectWithConfig(allocator, .{ .host = host, .port = port }); 86 + } 87 + 88 + /// Connect to Redis with full configuration. 89 + pub fn connectWithConfig(allocator: Allocator, config: Config) ClientError!Self { 90 + // Resolve address: try numeric IP first, then DNS 91 + const address = net.Address.parseIp(config.host, config.port) catch blk: { 92 + const list = net.getAddressList(allocator, config.host, config.port) catch { 93 + return ConnectionError.AddressResolutionFailed; 94 + }; 95 + defer list.deinit(); 96 + if (list.addrs.len == 0) return ConnectionError.AddressResolutionFailed; 97 + break :blk list.addrs[0]; 98 + }; 99 + 100 + const tcp_stream = net.tcpConnectToAddress(address) catch { 101 + return ConnectionError.ConnectionRefused; 102 + }; 103 + errdefer tcp_stream.close(); 104 + 105 + const read_buf = try allocator.alloc(u8, config.read_buffer_size); 106 + errdefer allocator.free(read_buf); 107 + 108 + var self = Self{ 109 + .stream = tcp_stream, 110 + .allocator = allocator, 111 + .read_buf = read_buf, 112 + }; 113 + 114 + // Authenticate if password provided 115 + if (config.password.len > 0) { 116 + const result = try self.sendCommand(&.{ "AUTH", config.username, config.password }); 117 + if (result.isError()) return ConnectionError.AuthenticationFailed; 118 + } 119 + 120 + // Select database if non-default 121 + if (config.db != 0) { 122 + var db_buf: [4]u8 = undefined; 123 + const db_str = std.fmt.bufPrint(&db_buf, "{d}", .{config.db}) catch unreachable; 124 + const result = try self.sendCommand(&.{ "SELECT", db_str }); 125 + if (result.isError()) return ConnectionError.InvalidDatabase; 126 + } 127 + 128 + return self; 129 + } 130 + 131 + /// Close the connection and free resources. 132 + pub fn close(self: *Self) void { 133 + if (self.heap_cmd_buf) |buf| { 134 + self.allocator.free(buf); 135 + } 136 + self.allocator.free(self.read_buf); 137 + self.stream.close(); 138 + } 139 + 140 + // ======================================================================== 141 + // Command Execution (Core) 142 + // ======================================================================== 143 + 144 + /// Send a command and receive the response. 145 + /// This is the foundation for all other commands. 146 + /// 147 + /// Arguments must be string slices. For integer arguments, 148 + /// format them to a buffer first: 149 + /// ```zig 150 + /// var buf: [16]u8 = undefined; 151 + /// const n_str = std.fmt.bufPrint(&buf, "{d}", .{n}) catch unreachable; 152 + /// try client.sendCommand(&.{"EXPIRE", key, n_str}); 153 + /// ``` 154 + pub fn sendCommand(self: *Self, args: []const []const u8) ClientError!Value { 155 + // Calculate required buffer size 156 + var total_size: usize = 16; // header overhead 157 + for (args) |arg| { 158 + total_size += 16 + arg.len; // $<len>\r\n<data>\r\n 159 + } 160 + 161 + // Get command buffer (stack or heap) 162 + const cmd_buf = try self.getCommandBuffer(total_size); 163 + 164 + // Build RESP array 165 + var pos: usize = 0; 166 + 167 + // Array header: *<count>\r\n 168 + pos += (std.fmt.bufPrint(cmd_buf[pos..], "*{d}\r\n", .{args.len}) catch { 169 + return ProtocolError.BufferOverflow; 170 + }).len; 171 + 172 + // Each argument as bulk string: $<len>\r\n<data>\r\n 173 + for (args) |arg| { 174 + pos += (std.fmt.bufPrint(cmd_buf[pos..], "${d}\r\n", .{arg.len}) catch { 175 + return ProtocolError.BufferOverflow; 176 + }).len; 177 + 178 + @memcpy(cmd_buf[pos..][0..arg.len], arg); 179 + pos += arg.len; 180 + cmd_buf[pos] = '\r'; 181 + cmd_buf[pos + 1] = '\n'; 182 + pos += 2; 183 + } 184 + 185 + // Send command 186 + _ = try self.stream.write(cmd_buf[0..pos]); 187 + 188 + // Reset buffer state for new response 189 + self.buf_len = 0; 190 + self.buf_pos = 0; 191 + 192 + // Read and parse response 193 + return self.readResponse(); 194 + } 195 + 196 + /// Send a command with a pre-built argument array. 197 + /// Useful when the argument count is dynamic. 198 + pub fn sendCommandDynamic(self: *Self, comptime prefix: []const []const u8, suffix: []const []const u8) ClientError!Value { 199 + const total_len = prefix.len + suffix.len; 200 + var args = try self.allocator.alloc([]const u8, total_len); 201 + defer self.allocator.free(args); 202 + 203 + inline for (prefix, 0..) |p, i| { 204 + args[i] = p; 205 + } 206 + @memcpy(args[prefix.len..], suffix); 207 + 208 + return self.sendCommand(args); 209 + } 210 + 211 + // ======================================================================== 212 + // Buffer Management 213 + // ======================================================================== 214 + 215 + fn getCommandBuffer(self: *Self, required_size: usize) ClientError![]u8 { 216 + if (required_size <= self.cmd_buf.len) { 217 + return &self.cmd_buf; 218 + } 219 + 220 + // Need heap allocation for large command 221 + if (self.heap_cmd_buf) |buf| { 222 + if (buf.len >= required_size) return buf; 223 + self.allocator.free(buf); 224 + } 225 + 226 + self.heap_cmd_buf = try self.allocator.alloc(u8, required_size); 227 + return self.heap_cmd_buf.?; 228 + } 229 + 230 + fn readResponse(self: *Self) ClientError!Value { 231 + // Ensure we have at least one byte 232 + if (self.buf_len == 0) { 233 + const n = try self.stream.read(self.read_buf); 234 + if (n == 0) return ProtocolError.ConnectionClosed; 235 + self.buf_len = n; 236 + } 237 + 238 + return self.parseValue(); 239 + } 240 + 241 + fn parseValue(self: *Self) ClientError!Value { 242 + // Ensure we have data 243 + while (self.buf_pos >= self.buf_len) { 244 + try self.readMore(); 245 + } 246 + 247 + const type_char = self.read_buf[self.buf_pos]; 248 + self.buf_pos += 1; 249 + 250 + return switch (type_char) { 251 + '+' => .{ .string = try self.readLine() }, 252 + '-' => .{ .err = try self.readLine() }, 253 + ':' => .{ .integer = try self.readInt() }, 254 + '$' => try self.readBulk(), 255 + '*' => try self.readArray(), 256 + else => ProtocolError.InvalidResponse, 257 + }; 258 + } 259 + 260 + fn readLine(self: *Self) ClientError![]const u8 { 261 + const start = self.buf_pos; 262 + while (true) { 263 + while (self.buf_pos + 1 < self.buf_len) { 264 + if (self.read_buf[self.buf_pos] == '\r' and self.read_buf[self.buf_pos + 1] == '\n') { 265 + const line = self.read_buf[start..self.buf_pos]; 266 + self.buf_pos += 2; 267 + return line; 268 + } 269 + self.buf_pos += 1; 270 + } 271 + try self.readMore(); 272 + } 273 + } 274 + 275 + fn readInt(self: *Self) ClientError!i64 { 276 + const line = try self.readLine(); 277 + return std.fmt.parseInt(i64, line, 10) catch ProtocolError.InvalidResponse; 278 + } 279 + 280 + fn readBulk(self: *Self) ClientError!Value { 281 + const len = try self.readInt(); 282 + if (len < 0) return .nil; 283 + 284 + const ulen: usize = @intCast(len); 285 + 286 + // Ensure we have all the data 287 + while (self.buf_pos + ulen + 2 > self.buf_len) { 288 + try self.readMore(); 289 + } 290 + 291 + const data = self.read_buf[self.buf_pos..][0..ulen]; 292 + self.buf_pos += ulen + 2; 293 + return .{ .bulk = data }; 294 + } 295 + 296 + fn readArray(self: *Self) ClientError!Value { 297 + const len = try self.readInt(); 298 + if (len < 0) return .nil; 299 + if (len == 0) return .{ .array = &.{} }; 300 + 301 + const ulen: usize = @intCast(len); 302 + const values = try self.allocator.alloc(Value, ulen); 303 + errdefer self.allocator.free(values); 304 + 305 + for (0..ulen) |i| { 306 + values[i] = try self.parseValue(); 307 + } 308 + 309 + return .{ .array = values }; 310 + } 311 + 312 + fn readMore(self: *Self) ClientError!void { 313 + // Grow buffer if needed 314 + if (self.buf_len >= self.read_buf.len) { 315 + const new_buf = try self.allocator.realloc(self.read_buf, self.read_buf.len * 2); 316 + self.read_buf = new_buf; 317 + } 318 + 319 + const n = try self.stream.read(self.read_buf[self.buf_len..]); 320 + if (n == 0) return ProtocolError.ConnectionClosed; 321 + self.buf_len += n; 322 + } 323 + 324 + // ======================================================================== 325 + // Connection Commands 326 + // ======================================================================== 327 + 328 + /// Send PING, returns true if server responds with PONG. 329 + pub fn ping(self: *Self) ClientError!bool { 330 + const result = try self.sendCommand(&.{"PING"}); 331 + return switch (result) { 332 + .string => |s| std.mem.eql(u8, s, "PONG"), 333 + else => false, 334 + }; 335 + } 336 + 337 + /// Send ECHO, returns the message back. 338 + pub fn echo(self: *Self, message: []const u8) ClientError!?[]const u8 { 339 + const result = try self.sendCommand(&.{ "ECHO", message }); 340 + return result.asString(); 341 + } 342 + 343 + /// Get server info. 344 + pub fn info(self: *Self, section: ?[]const u8) ClientError!?[]const u8 { 345 + const result = if (section) |s| 346 + try self.sendCommand(&.{ "INFO", s }) 347 + else 348 + try self.sendCommand(&.{"INFO"}); 349 + return result.asString(); 350 + } 351 + 352 + /// Get number of keys in current database. 353 + pub fn dbsize(self: *Self) ClientError!i64 { 354 + const result = try self.sendCommand(&.{"DBSIZE"}); 355 + return result.asInt() orelse 0; 356 + } 357 + 358 + /// Delete all keys in current database (use with caution!). 359 + pub fn flushDb(self: *Self) ClientError!void { 360 + const result = try self.sendCommand(&.{"FLUSHDB"}); 361 + if (result.isError()) return CommandError.RedisError; 362 + } 363 + 364 + // ======================================================================== 365 + // Value Management 366 + // ======================================================================== 367 + 368 + /// Free a Value that contains allocated memory (arrays). 369 + /// Call this when done with array values to prevent leaks. 370 + pub fn freeValue(self: *Self, value: Value) void { 371 + switch (value) { 372 + .array => |arr| { 373 + for (arr) |v| { 374 + self.freeValue(v); 375 + } 376 + self.allocator.free(arr); 377 + }, 378 + else => {}, 379 + } 380 + } 381 + }; 382 + 383 + // ============================================================================ 384 + // Tests 385 + // ============================================================================ 386 + 387 + test "Client struct size is reasonable" { 388 + // Ensure the client doesn't grow unexpectedly 389 + try std.testing.expect(@sizeOf(Client) < 20000); 390 + }
+304
src/commands/hashes.zig
··· 1 + //! Redis hash commands 2 + //! 3 + //! Hashes are maps of field-value pairs, ideal for representing objects. 4 + //! Each hash can store up to 2^32 - 1 field-value pairs. 5 + //! 6 + //! ## Use Cases 7 + //! 8 + //! - User profiles: `HSET user:1000 name "Alice" email "alice@example.com"` 9 + //! - Session data: `HMSET session:abc user_id 1000 created 1640000000` 10 + //! - Counters per entity: `HINCRBY stats:page:home views 1` 11 + //! 12 + //! ## Memory Efficiency 13 + //! 14 + //! Small hashes (configurable, default <512 fields with values <64 bytes) 15 + //! use ziplist encoding, which is very memory efficient. 16 + //! 17 + //! ## Examples 18 + //! 19 + //! ```zig 20 + //! try client.hashes().hset("user:1", "name", "alice"); 21 + //! try client.hashes().hset("user:1", "email", "alice@example.com"); 22 + //! 23 + //! const name = try client.hashes().hget("user:1", "name"); // "alice" 24 + //! const all = try client.hashes().hgetAll("user:1"); // [name, alice, email, ...] 25 + //! 26 + //! _ = try client.hashes().hincrBy("user:1", "visits", 1); 27 + //! ``` 28 + 29 + const std = @import("std"); 30 + const Client = @import("../client.zig").Client; 31 + const Value = @import("../resp.zig").Value; 32 + const CommandError = @import("../resp.zig").CommandError; 33 + const ClientError = @import("../resp.zig").ClientError; 34 + 35 + /// Hash command implementations. 36 + pub const HashCommands = struct { 37 + client: *Client, 38 + 39 + pub fn init(client: *Client) HashCommands { 40 + return .{ .client = client }; 41 + } 42 + 43 + // ======================================================================== 44 + // Single Field Operations 45 + // ======================================================================== 46 + 47 + /// HSET key field value [field value ...] - set field(s) 48 + /// Returns number of fields added (not updated). 49 + pub fn hset(self: *HashCommands, key: []const u8, field: []const u8, value: []const u8) ClientError!i64 { 50 + const result = try self.client.sendCommand(&.{ "HSET", key, field, value }); 51 + return switch (result) { 52 + .integer => |i| i, 53 + .err => return CommandError.WrongType, 54 + else => 0, 55 + }; 56 + } 57 + 58 + /// HSET with multiple field-value pairs 59 + pub fn hsetMulti(self: *HashCommands, key: []const u8, pairs: []const [2][]const u8) ClientError!i64 { 60 + const arg_count = 2 + pairs.len * 2; 61 + var args = try self.client.allocator.alloc([]const u8, arg_count); 62 + defer self.client.allocator.free(args); 63 + 64 + args[0] = "HSET"; 65 + args[1] = key; 66 + for (pairs, 0..) |pair, i| { 67 + args[2 + i * 2] = pair[0]; 68 + args[2 + i * 2 + 1] = pair[1]; 69 + } 70 + 71 + const result = try self.client.sendCommand(args); 72 + return switch (result) { 73 + .integer => |i| i, 74 + .err => return CommandError.WrongType, 75 + else => 0, 76 + }; 77 + } 78 + 79 + /// HSETNX key field value - set field only if it doesn't exist 80 + /// Returns true if field was set. 81 + pub fn hsetnx(self: *HashCommands, key: []const u8, field: []const u8, value: []const u8) ClientError!bool { 82 + const result = try self.client.sendCommand(&.{ "HSETNX", key, field, value }); 83 + return switch (result) { 84 + .integer => |i| i == 1, 85 + .err => return CommandError.WrongType, 86 + else => false, 87 + }; 88 + } 89 + 90 + /// HGET key field - get field value 91 + pub fn hget(self: *HashCommands, key: []const u8, field: []const u8) ClientError!?[]const u8 { 92 + const result = try self.client.sendCommand(&.{ "HGET", key, field }); 93 + return switch (result) { 94 + .bulk => |b| b, 95 + .nil => null, 96 + .err => return CommandError.WrongType, 97 + else => null, 98 + }; 99 + } 100 + 101 + /// HMGET key field [field ...] - get multiple fields 102 + /// Returns array of values (null for missing fields). 103 + pub fn hmget(self: *HashCommands, key: []const u8, fields: []const []const u8) ClientError![]const Value { 104 + var args = try self.client.allocator.alloc([]const u8, fields.len + 2); 105 + defer self.client.allocator.free(args); 106 + args[0] = "HMGET"; 107 + args[1] = key; 108 + @memcpy(args[2..], fields); 109 + 110 + const result = try self.client.sendCommand(args); 111 + return switch (result) { 112 + .array => |a| a, 113 + else => &.{}, 114 + }; 115 + } 116 + 117 + /// HDEL key field [field ...] - delete fields 118 + /// Returns number of fields deleted. 119 + pub fn hdel(self: *HashCommands, key: []const u8, fields: []const []const u8) ClientError!i64 { 120 + var args = try self.client.allocator.alloc([]const u8, fields.len + 2); 121 + defer self.client.allocator.free(args); 122 + args[0] = "HDEL"; 123 + args[1] = key; 124 + @memcpy(args[2..], fields); 125 + 126 + const result = try self.client.sendCommand(args); 127 + return switch (result) { 128 + .integer => |i| i, 129 + else => 0, 130 + }; 131 + } 132 + 133 + /// HEXISTS key field - check if field exists 134 + pub fn hexists(self: *HashCommands, key: []const u8, field: []const u8) ClientError!bool { 135 + const result = try self.client.sendCommand(&.{ "HEXISTS", key, field }); 136 + return switch (result) { 137 + .integer => |i| i == 1, 138 + else => false, 139 + }; 140 + } 141 + 142 + // ======================================================================== 143 + // Numeric Operations 144 + // ======================================================================== 145 + 146 + /// HINCRBY key field increment - increment integer field 147 + pub fn hincrBy(self: *HashCommands, key: []const u8, field: []const u8, increment: i64) ClientError!i64 { 148 + var buf: [24]u8 = undefined; 149 + const inc_str = std.fmt.bufPrint(&buf, "{d}", .{increment}) catch unreachable; 150 + const result = try self.client.sendCommand(&.{ "HINCRBY", key, field, inc_str }); 151 + return switch (result) { 152 + .integer => |i| i, 153 + .err => return CommandError.WrongType, 154 + else => return CommandError.RedisError, 155 + }; 156 + } 157 + 158 + /// HINCRBYFLOAT key field increment - increment float field 159 + pub fn hincrByFloat(self: *HashCommands, key: []const u8, field: []const u8, increment: f64) ClientError!f64 { 160 + var buf: [32]u8 = undefined; 161 + const inc_str = std.fmt.bufPrint(&buf, "{d}", .{increment}) catch unreachable; 162 + const result = try self.client.sendCommand(&.{ "HINCRBYFLOAT", key, field, inc_str }); 163 + return switch (result) { 164 + .bulk => |b| if (b) |s| std.fmt.parseFloat(f64, s) catch return CommandError.RedisError else return CommandError.RedisError, 165 + .err => return CommandError.WrongType, 166 + else => return CommandError.RedisError, 167 + }; 168 + } 169 + 170 + // ======================================================================== 171 + // Bulk Operations 172 + // ======================================================================== 173 + 174 + /// HGETALL key - get all field-value pairs 175 + /// Returns flat array: [field1, value1, field2, value2, ...] 176 + pub fn hgetAll(self: *HashCommands, key: []const u8) ClientError![]const Value { 177 + const result = try self.client.sendCommand(&.{ "HGETALL", key }); 178 + return switch (result) { 179 + .array => |a| a, 180 + .err => return CommandError.WrongType, 181 + else => &.{}, 182 + }; 183 + } 184 + 185 + /// HKEYS key - get all field names 186 + pub fn hkeys(self: *HashCommands, key: []const u8) ClientError![]const Value { 187 + const result = try self.client.sendCommand(&.{ "HKEYS", key }); 188 + return switch (result) { 189 + .array => |a| a, 190 + else => &.{}, 191 + }; 192 + } 193 + 194 + /// HVALS key - get all values 195 + pub fn hvals(self: *HashCommands, key: []const u8) ClientError![]const Value { 196 + const result = try self.client.sendCommand(&.{ "HVALS", key }); 197 + return switch (result) { 198 + .array => |a| a, 199 + else => &.{}, 200 + }; 201 + } 202 + 203 + /// HLEN key - get number of fields 204 + pub fn hlen(self: *HashCommands, key: []const u8) ClientError!i64 { 205 + const result = try self.client.sendCommand(&.{ "HLEN", key }); 206 + return switch (result) { 207 + .integer => |i| i, 208 + else => 0, 209 + }; 210 + } 211 + 212 + /// HSTRLEN key field - get string length of field value 213 + pub fn hstrlen(self: *HashCommands, key: []const u8, field: []const u8) ClientError!i64 { 214 + const result = try self.client.sendCommand(&.{ "HSTRLEN", key, field }); 215 + return switch (result) { 216 + .integer => |i| i, 217 + else => 0, 218 + }; 219 + } 220 + 221 + // ======================================================================== 222 + // Scanning 223 + // ======================================================================== 224 + 225 + /// Result from HSCAN command 226 + pub const ScanResult = struct { 227 + cursor: []const u8, 228 + /// Flat array: [field1, value1, field2, value2, ...] 229 + pairs: []const Value, 230 + }; 231 + 232 + /// HSCAN key cursor [MATCH pattern] [COUNT count] - iterate fields 233 + pub fn hscan(self: *HashCommands, key: []const u8, cursor: []const u8, pattern: ?[]const u8, count: ?u32) ClientError!ScanResult { 234 + var args_buf: [8][]const u8 = undefined; 235 + var arg_count: usize = 3; 236 + args_buf[0] = "HSCAN"; 237 + args_buf[1] = key; 238 + args_buf[2] = cursor; 239 + 240 + if (pattern) |p| { 241 + args_buf[arg_count] = "MATCH"; 242 + args_buf[arg_count + 1] = p; 243 + arg_count += 2; 244 + } 245 + 246 + var count_buf: [16]u8 = undefined; 247 + if (count) |c| { 248 + args_buf[arg_count] = "COUNT"; 249 + args_buf[arg_count + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 250 + arg_count += 2; 251 + } 252 + 253 + const result = try self.client.sendCommand(args_buf[0..arg_count]); 254 + return switch (result) { 255 + .array => |arr| { 256 + if (arr.len < 2) return ScanResult{ .cursor = "0", .pairs = &.{} }; 257 + return ScanResult{ 258 + .cursor = arr[0].asString() orelse "0", 259 + .pairs = arr[1].asArray() orelse &.{}, 260 + }; 261 + }, 262 + else => ScanResult{ .cursor = "0", .pairs = &.{} }, 263 + }; 264 + } 265 + 266 + // ======================================================================== 267 + // Random Field (Redis 6.2+) 268 + // ======================================================================== 269 + 270 + /// HRANDFIELD key [count] - get random field(s) 271 + pub fn hrandfield(self: *HashCommands, key: []const u8, count: ?i32) ClientError![]const Value { 272 + if (count) |c| { 273 + var buf: [16]u8 = undefined; 274 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{c}) catch unreachable; 275 + const result = try self.client.sendCommand(&.{ "HRANDFIELD", key, count_str }); 276 + return switch (result) { 277 + .array => |a| a, 278 + else => &.{}, 279 + }; 280 + } else { 281 + const result = try self.client.sendCommand(&.{ "HRANDFIELD", key }); 282 + return switch (result) { 283 + .bulk => |b| if (b != null) &.{Value{ .bulk = b }} else &.{}, 284 + else => &.{}, 285 + }; 286 + } 287 + } 288 + 289 + /// HRANDFIELD key count WITHVALUES - get random field-value pairs 290 + pub fn hrandfieldWithValues(self: *HashCommands, key: []const u8, count: i32) ClientError![]const Value { 291 + var buf: [16]u8 = undefined; 292 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 293 + const result = try self.client.sendCommand(&.{ "HRANDFIELD", key, count_str, "WITHVALUES" }); 294 + return switch (result) { 295 + .array => |a| a, 296 + else => &.{}, 297 + }; 298 + } 299 + }; 300 + 301 + /// Extend Client with hash commands. 302 + pub fn hashes(client: *Client) HashCommands { 303 + return HashCommands.init(client); 304 + }
+316
src/commands/keys.zig
··· 1 + //! Redis generic key commands 2 + //! 3 + //! These commands work on keys regardless of their value type. 4 + //! Common uses: 5 + //! - Key existence checks (EXISTS) 6 + //! - Key deletion (DEL, UNLINK) 7 + //! - TTL management (EXPIRE, TTL, PERSIST) 8 + //! - Key scanning (SCAN, KEYS) 9 + //! - Key type inspection (TYPE) 10 + //! 11 + //! ## Examples 12 + //! 13 + //! ```zig 14 + //! const exists = try client.keys().exists(&.{"key1", "key2"}); // count of existing 15 + //! const deleted = try client.keys().del(&.{"key1", "key2"}); // count deleted 16 + //! 17 + //! _ = try client.keys().expire("session", 3600); 18 + //! const ttl = try client.keys().ttl("session"); // seconds remaining 19 + //! ``` 20 + 21 + const std = @import("std"); 22 + const Client = @import("../client.zig").Client; 23 + const Value = @import("../resp.zig").Value; 24 + const CommandError = @import("../resp.zig").CommandError; 25 + const ClientError = @import("../resp.zig").ClientError; 26 + 27 + /// Generic key command implementations. 28 + pub const KeyCommands = struct { 29 + client: *Client, 30 + 31 + pub fn init(client: *Client) KeyCommands { 32 + return .{ .client = client }; 33 + } 34 + 35 + // ======================================================================== 36 + // Key Existence and Deletion 37 + // ======================================================================== 38 + 39 + /// DEL key [key ...] - delete keys 40 + /// Returns count of keys deleted. 41 + pub fn del(self: *KeyCommands, key_list: []const []const u8) ClientError!i64 { 42 + var args = try self.client.allocator.alloc([]const u8, key_list.len + 1); 43 + defer self.client.allocator.free(args); 44 + args[0] = "DEL"; 45 + @memcpy(args[1..], key_list); 46 + 47 + const result = try self.client.sendCommand(args); 48 + return switch (result) { 49 + .integer => |i| i, 50 + else => 0, 51 + }; 52 + } 53 + 54 + /// UNLINK key [key ...] - delete keys asynchronously 55 + /// Like DEL but non-blocking. Returns count of keys unlinked. 56 + pub fn unlink(self: *KeyCommands, key_list: []const []const u8) ClientError!i64 { 57 + var args = try self.client.allocator.alloc([]const u8, key_list.len + 1); 58 + defer self.client.allocator.free(args); 59 + args[0] = "UNLINK"; 60 + @memcpy(args[1..], key_list); 61 + 62 + const result = try self.client.sendCommand(args); 63 + return switch (result) { 64 + .integer => |i| i, 65 + else => 0, 66 + }; 67 + } 68 + 69 + /// EXISTS key [key ...] - check if keys exist 70 + /// Returns count of keys that exist. 71 + pub fn exists(self: *KeyCommands, key_list: []const []const u8) ClientError!i64 { 72 + var args = try self.client.allocator.alloc([]const u8, key_list.len + 1); 73 + defer self.client.allocator.free(args); 74 + args[0] = "EXISTS"; 75 + @memcpy(args[1..], key_list); 76 + 77 + const result = try self.client.sendCommand(args); 78 + return switch (result) { 79 + .integer => |i| i, 80 + else => 0, 81 + }; 82 + } 83 + 84 + /// TYPE key - get key's value type 85 + /// Returns "string", "list", "set", "zset", "hash", "stream", or "none". 86 + pub fn keyType(self: *KeyCommands, key: []const u8) ClientError![]const u8 { 87 + const result = try self.client.sendCommand(&.{ "TYPE", key }); 88 + return switch (result) { 89 + .string => |s| s, 90 + else => "none", 91 + }; 92 + } 93 + 94 + // ======================================================================== 95 + // TTL Management 96 + // ======================================================================== 97 + 98 + /// EXPIRE key seconds - set TTL in seconds 99 + /// Returns true if timeout was set. 100 + pub fn expire(self: *KeyCommands, key: []const u8, seconds: u32) ClientError!bool { 101 + var buf: [16]u8 = undefined; 102 + const sec_str = std.fmt.bufPrint(&buf, "{d}", .{seconds}) catch unreachable; 103 + const result = try self.client.sendCommand(&.{ "EXPIRE", key, sec_str }); 104 + return switch (result) { 105 + .integer => |i| i == 1, 106 + else => false, 107 + }; 108 + } 109 + 110 + /// EXPIREAT key unix-timestamp - set expiration as Unix timestamp 111 + pub fn expireAt(self: *KeyCommands, key: []const u8, timestamp: i64) ClientError!bool { 112 + var buf: [24]u8 = undefined; 113 + const ts_str = std.fmt.bufPrint(&buf, "{d}", .{timestamp}) catch unreachable; 114 + const result = try self.client.sendCommand(&.{ "EXPIREAT", key, ts_str }); 115 + return switch (result) { 116 + .integer => |i| i == 1, 117 + else => false, 118 + }; 119 + } 120 + 121 + /// PEXPIRE key milliseconds - set TTL in milliseconds 122 + pub fn pexpire(self: *KeyCommands, key: []const u8, millis: u64) ClientError!bool { 123 + var buf: [24]u8 = undefined; 124 + const ms_str = std.fmt.bufPrint(&buf, "{d}", .{millis}) catch unreachable; 125 + const result = try self.client.sendCommand(&.{ "PEXPIRE", key, ms_str }); 126 + return switch (result) { 127 + .integer => |i| i == 1, 128 + else => false, 129 + }; 130 + } 131 + 132 + /// TTL key - get remaining TTL in seconds 133 + /// Returns null if key doesn't exist or has no TTL. 134 + pub fn ttl(self: *KeyCommands, key: []const u8) ClientError!?i64 { 135 + const result = try self.client.sendCommand(&.{ "TTL", key }); 136 + return switch (result) { 137 + .integer => |i| if (i < 0) null else i, 138 + else => null, 139 + }; 140 + } 141 + 142 + /// PTTL key - get remaining TTL in milliseconds 143 + pub fn pttl(self: *KeyCommands, key: []const u8) ClientError!?i64 { 144 + const result = try self.client.sendCommand(&.{ "PTTL", key }); 145 + return switch (result) { 146 + .integer => |i| if (i < 0) null else i, 147 + else => null, 148 + }; 149 + } 150 + 151 + /// PERSIST key - remove TTL 152 + /// Returns true if timeout was removed. 153 + pub fn persist(self: *KeyCommands, key: []const u8) ClientError!bool { 154 + const result = try self.client.sendCommand(&.{ "PERSIST", key }); 155 + return switch (result) { 156 + .integer => |i| i == 1, 157 + else => false, 158 + }; 159 + } 160 + 161 + /// EXPIRETIME key - get Unix timestamp when key will expire (Redis 7+) 162 + pub fn expireTime(self: *KeyCommands, key: []const u8) ClientError!?i64 { 163 + const result = try self.client.sendCommand(&.{ "EXPIRETIME", key }); 164 + return switch (result) { 165 + .integer => |i| if (i < 0) null else i, 166 + else => null, 167 + }; 168 + } 169 + 170 + // ======================================================================== 171 + // Key Manipulation 172 + // ======================================================================== 173 + 174 + /// RENAME key newkey - rename a key 175 + pub fn rename(self: *KeyCommands, key: []const u8, new_key: []const u8) ClientError!void { 176 + const result = try self.client.sendCommand(&.{ "RENAME", key, new_key }); 177 + if (result.isError()) return CommandError.KeyNotFound; 178 + } 179 + 180 + /// RENAMENX key newkey - rename only if newkey doesn't exist 181 + /// Returns true if renamed. 182 + pub fn renameNx(self: *KeyCommands, key: []const u8, new_key: []const u8) ClientError!bool { 183 + const result = try self.client.sendCommand(&.{ "RENAMENX", key, new_key }); 184 + return switch (result) { 185 + .integer => |i| i == 1, 186 + else => false, 187 + }; 188 + } 189 + 190 + /// COPY source destination [REPLACE] - copy key to another key (Redis 6.2+) 191 + pub fn copy(self: *KeyCommands, source: []const u8, dest: []const u8, replace: bool) ClientError!bool { 192 + const result = if (replace) 193 + try self.client.sendCommand(&.{ "COPY", source, dest, "REPLACE" }) 194 + else 195 + try self.client.sendCommand(&.{ "COPY", source, dest }); 196 + return switch (result) { 197 + .integer => |i| i == 1, 198 + else => false, 199 + }; 200 + } 201 + 202 + // ======================================================================== 203 + // Key Scanning 204 + // ======================================================================== 205 + 206 + /// Result from SCAN command 207 + pub const ScanResult = struct { 208 + cursor: []const u8, 209 + keys: []const Value, 210 + }; 211 + 212 + /// SCAN cursor [MATCH pattern] [COUNT count] - iterate keys 213 + pub fn scan(self: *KeyCommands, cursor: []const u8, pattern: ?[]const u8, count: ?u32) ClientError!ScanResult { 214 + // Build args dynamically 215 + var args_buf: [7][]const u8 = undefined; 216 + var arg_count: usize = 2; 217 + args_buf[0] = "SCAN"; 218 + args_buf[1] = cursor; 219 + 220 + if (pattern) |p| { 221 + args_buf[arg_count] = "MATCH"; 222 + args_buf[arg_count + 1] = p; 223 + arg_count += 2; 224 + } 225 + 226 + var count_buf: [16]u8 = undefined; 227 + if (count) |c| { 228 + args_buf[arg_count] = "COUNT"; 229 + args_buf[arg_count + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 230 + arg_count += 2; 231 + } 232 + 233 + const result = try self.client.sendCommand(args_buf[0..arg_count]); 234 + return switch (result) { 235 + .array => |arr| { 236 + if (arr.len < 2) return ScanResult{ .cursor = "0", .keys = &.{} }; 237 + return ScanResult{ 238 + .cursor = arr[0].asString() orelse "0", 239 + .keys = arr[1].asArray() orelse &.{}, 240 + }; 241 + }, 242 + else => ScanResult{ .cursor = "0", .keys = &.{} }, 243 + }; 244 + } 245 + 246 + /// KEYS pattern - find keys matching pattern 247 + /// Warning: can be slow on large databases. Prefer SCAN for production. 248 + pub fn keys(self: *KeyCommands, pattern: []const u8) ClientError![]const Value { 249 + const result = try self.client.sendCommand(&.{ "KEYS", pattern }); 250 + return switch (result) { 251 + .array => |a| a, 252 + else => &.{}, 253 + }; 254 + } 255 + 256 + /// RANDOMKEY - return a random key 257 + pub fn randomKey(self: *KeyCommands) ClientError!?[]const u8 { 258 + const result = try self.client.sendCommand(&.{"RANDOMKEY"}); 259 + return switch (result) { 260 + .bulk => |b| b, 261 + else => null, 262 + }; 263 + } 264 + 265 + // ======================================================================== 266 + // Serialization 267 + // ======================================================================== 268 + 269 + /// DUMP key - serialize key's value 270 + /// Returns serialized value or null if key doesn't exist. 271 + pub fn dump(self: *KeyCommands, key: []const u8) ClientError!?[]const u8 { 272 + const result = try self.client.sendCommand(&.{ "DUMP", key }); 273 + return switch (result) { 274 + .bulk => |b| b, 275 + else => null, 276 + }; 277 + } 278 + 279 + /// RESTORE key ttl serialized-value - restore from DUMP 280 + pub fn restore(self: *KeyCommands, key: []const u8, ttl_ms: u64, serialized: []const u8, replace: bool) ClientError!void { 281 + var ttl_buf: [24]u8 = undefined; 282 + const ttl_str = std.fmt.bufPrint(&ttl_buf, "{d}", .{ttl_ms}) catch unreachable; 283 + 284 + const result = if (replace) 285 + try self.client.sendCommand(&.{ "RESTORE", key, ttl_str, serialized, "REPLACE" }) 286 + else 287 + try self.client.sendCommand(&.{ "RESTORE", key, ttl_str, serialized }); 288 + 289 + if (result.isError()) return CommandError.RedisError; 290 + } 291 + 292 + /// OBJECT ENCODING key - get internal encoding of key's value 293 + pub fn objectEncoding(self: *KeyCommands, key: []const u8) ClientError!?[]const u8 { 294 + const result = try self.client.sendCommand(&.{ "OBJECT", "ENCODING", key }); 295 + return result.asString(); 296 + } 297 + 298 + /// TOUCH key [key ...] - alters last access time, returns count touched 299 + pub fn touch(self: *KeyCommands, key_list: []const []const u8) ClientError!i64 { 300 + var args = try self.client.allocator.alloc([]const u8, key_list.len + 1); 301 + defer self.client.allocator.free(args); 302 + args[0] = "TOUCH"; 303 + @memcpy(args[1..], key_list); 304 + 305 + const result = try self.client.sendCommand(args); 306 + return switch (result) { 307 + .integer => |i| i, 308 + else => 0, 309 + }; 310 + } 311 + }; 312 + 313 + /// Extend Client with key commands. 314 + pub fn keyOps(client: *Client) KeyCommands { 315 + return KeyCommands.init(client); 316 + }
+354
src/commands/lists.zig
··· 1 + //! Redis list commands 2 + //! 3 + //! Lists are linked lists of strings, optimized for pushing and popping 4 + //! at both ends. They support blocking operations for queue patterns. 5 + //! 6 + //! ## Use Cases 7 + //! 8 + //! - Message queues: LPUSH + BRPOP 9 + //! - Activity feeds: LPUSH + LRANGE 10 + //! - Bounded collections: LPUSH + LTRIM 11 + //! - Background job queues: RPUSH + BLPOP 12 + //! 13 + //! ## Performance 14 + //! 15 + //! - Push/pop at ends: O(1) 16 + //! - Access by index: O(n) where n is distance from nearest end 17 + //! - Range queries: O(s+n) where s is start offset and n is elements returned 18 + //! 19 + //! ## Examples 20 + //! 21 + //! ```zig 22 + //! // Simple queue 23 + //! _ = try client.lists().rpush("queue", &.{"job1", "job2"}); 24 + //! const job = try client.lists().lpop("queue"); // "job1" 25 + //! 26 + //! // Recent items with bounded size 27 + //! _ = try client.lists().lpush("recent", &.{item}); 28 + //! try client.lists().ltrim("recent", 0, 99); // keep only 100 most recent 29 + //! 30 + //! // Blocking pop (for workers) 31 + //! const item = try client.lists().blpop(&.{"queue"}, 30); // wait up to 30s 32 + //! ``` 33 + 34 + const std = @import("std"); 35 + const Client = @import("../client.zig").Client; 36 + const Value = @import("../resp.zig").Value; 37 + const CommandError = @import("../resp.zig").CommandError; 38 + const ClientError = @import("../resp.zig").ClientError; 39 + 40 + /// List command implementations. 41 + pub const ListCommands = struct { 42 + client: *Client, 43 + 44 + pub fn init(client: *Client) ListCommands { 45 + return .{ .client = client }; 46 + } 47 + 48 + // ======================================================================== 49 + // Push Operations 50 + // ======================================================================== 51 + 52 + /// LPUSH key value [value ...] - prepend to list 53 + /// Returns new list length. 54 + pub fn lpush(self: *ListCommands, key: []const u8, values: []const []const u8) ClientError!i64 { 55 + var args = try self.client.allocator.alloc([]const u8, values.len + 2); 56 + defer self.client.allocator.free(args); 57 + args[0] = "LPUSH"; 58 + args[1] = key; 59 + @memcpy(args[2..], values); 60 + 61 + const result = try self.client.sendCommand(args); 62 + return switch (result) { 63 + .integer => |i| i, 64 + .err => return CommandError.WrongType, 65 + else => 0, 66 + }; 67 + } 68 + 69 + /// RPUSH key value [value ...] - append to list 70 + /// Returns new list length. 71 + pub fn rpush(self: *ListCommands, key: []const u8, values: []const []const u8) ClientError!i64 { 72 + var args = try self.client.allocator.alloc([]const u8, values.len + 2); 73 + defer self.client.allocator.free(args); 74 + args[0] = "RPUSH"; 75 + args[1] = key; 76 + @memcpy(args[2..], values); 77 + 78 + const result = try self.client.sendCommand(args); 79 + return switch (result) { 80 + .integer => |i| i, 81 + .err => return CommandError.WrongType, 82 + else => 0, 83 + }; 84 + } 85 + 86 + /// LPUSHX key value - prepend only if list exists 87 + pub fn lpushx(self: *ListCommands, key: []const u8, value: []const u8) ClientError!i64 { 88 + const result = try self.client.sendCommand(&.{ "LPUSHX", key, value }); 89 + return switch (result) { 90 + .integer => |i| i, 91 + else => 0, 92 + }; 93 + } 94 + 95 + /// RPUSHX key value - append only if list exists 96 + pub fn rpushx(self: *ListCommands, key: []const u8, value: []const u8) ClientError!i64 { 97 + const result = try self.client.sendCommand(&.{ "RPUSHX", key, value }); 98 + return switch (result) { 99 + .integer => |i| i, 100 + else => 0, 101 + }; 102 + } 103 + 104 + // ======================================================================== 105 + // Pop Operations 106 + // ======================================================================== 107 + 108 + /// LPOP key [count] - remove and return first element(s) 109 + pub fn lpop(self: *ListCommands, key: []const u8) ClientError!?[]const u8 { 110 + const result = try self.client.sendCommand(&.{ "LPOP", key }); 111 + return switch (result) { 112 + .bulk => |b| b, 113 + .nil => null, 114 + else => null, 115 + }; 116 + } 117 + 118 + /// LPOP key count - pop multiple elements 119 + pub fn lpopCount(self: *ListCommands, key: []const u8, count: u32) ClientError![]const Value { 120 + var buf: [16]u8 = undefined; 121 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 122 + const result = try self.client.sendCommand(&.{ "LPOP", key, count_str }); 123 + return switch (result) { 124 + .array => |a| a, 125 + .nil => &.{}, 126 + else => &.{}, 127 + }; 128 + } 129 + 130 + /// RPOP key - remove and return last element 131 + pub fn rpop(self: *ListCommands, key: []const u8) ClientError!?[]const u8 { 132 + const result = try self.client.sendCommand(&.{ "RPOP", key }); 133 + return switch (result) { 134 + .bulk => |b| b, 135 + .nil => null, 136 + else => null, 137 + }; 138 + } 139 + 140 + /// RPOP key count - pop multiple elements from end 141 + pub fn rpopCount(self: *ListCommands, key: []const u8, count: u32) ClientError![]const Value { 142 + var buf: [16]u8 = undefined; 143 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 144 + const result = try self.client.sendCommand(&.{ "RPOP", key, count_str }); 145 + return switch (result) { 146 + .array => |a| a, 147 + .nil => &.{}, 148 + else => &.{}, 149 + }; 150 + } 151 + 152 + // ======================================================================== 153 + // Blocking Pop Operations 154 + // ======================================================================== 155 + 156 + /// Result from blocking pop operations 157 + pub const BlockingPopResult = struct { 158 + key: []const u8, 159 + value: []const u8, 160 + }; 161 + 162 + /// BLPOP key [key ...] timeout - blocking left pop 163 + /// Timeout in seconds (0 = block forever). Returns null on timeout. 164 + pub fn blpop(self: *ListCommands, keys: []const []const u8, timeout: f64) ClientError!?BlockingPopResult { 165 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 166 + defer self.client.allocator.free(args); 167 + 168 + args[0] = "BLPOP"; 169 + @memcpy(args[1..][0..keys.len], keys); 170 + 171 + var buf: [32]u8 = undefined; 172 + args[keys.len + 1] = std.fmt.bufPrint(&buf, "{d}", .{timeout}) catch unreachable; 173 + 174 + const result = try self.client.sendCommand(args); 175 + return switch (result) { 176 + .array => |arr| { 177 + if (arr.len < 2) return null; 178 + const k = arr[0].asString() orelse return null; 179 + const v = arr[1].asString() orelse return null; 180 + return BlockingPopResult{ .key = k, .value = v }; 181 + }, 182 + .nil => null, 183 + else => null, 184 + }; 185 + } 186 + 187 + /// BRPOP key [key ...] timeout - blocking right pop 188 + pub fn brpop(self: *ListCommands, keys: []const []const u8, timeout: f64) ClientError!?BlockingPopResult { 189 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 190 + defer self.client.allocator.free(args); 191 + 192 + args[0] = "BRPOP"; 193 + @memcpy(args[1..][0..keys.len], keys); 194 + 195 + var buf: [32]u8 = undefined; 196 + args[keys.len + 1] = std.fmt.bufPrint(&buf, "{d}", .{timeout}) catch unreachable; 197 + 198 + const result = try self.client.sendCommand(args); 199 + return switch (result) { 200 + .array => |arr| { 201 + if (arr.len < 2) return null; 202 + const k = arr[0].asString() orelse return null; 203 + const v = arr[1].asString() orelse return null; 204 + return BlockingPopResult{ .key = k, .value = v }; 205 + }, 206 + .nil => null, 207 + else => null, 208 + }; 209 + } 210 + 211 + /// LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT count] (Redis 7+) 212 + pub fn lmpop(self: *ListCommands, keys: []const []const u8, direction: enum { left, right }, count: ?u32) ClientError!?struct { key: []const u8, values: []const Value } { 213 + const base_args = 3 + keys.len + if (count != null) @as(usize, 2) else @as(usize, 0); 214 + var args = try self.client.allocator.alloc([]const u8, base_args); 215 + defer self.client.allocator.free(args); 216 + 217 + var numkeys_buf: [16]u8 = undefined; 218 + args[0] = "LMPOP"; 219 + args[1] = std.fmt.bufPrint(&numkeys_buf, "{d}", .{keys.len}) catch unreachable; 220 + @memcpy(args[2..][0..keys.len], keys); 221 + args[2 + keys.len] = if (direction == .left) "LEFT" else "RIGHT"; 222 + 223 + const arg_idx = 3 + keys.len; 224 + var count_buf: [16]u8 = undefined; 225 + if (count) |c| { 226 + args[arg_idx] = "COUNT"; 227 + args[arg_idx + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 228 + } 229 + 230 + const result = try self.client.sendCommand(args[0..arg_idx]); 231 + return switch (result) { 232 + .array => |arr| { 233 + if (arr.len < 2) return null; 234 + const key = arr[0].asString() orelse return null; 235 + const values = arr[1].asArray() orelse return null; 236 + return .{ .key = key, .values = values }; 237 + }, 238 + .nil => null, 239 + else => null, 240 + }; 241 + } 242 + 243 + // ======================================================================== 244 + // Access Operations 245 + // ======================================================================== 246 + 247 + /// LINDEX key index - get element by index 248 + pub fn lindex(self: *ListCommands, key: []const u8, index: i64) ClientError!?[]const u8 { 249 + var buf: [24]u8 = undefined; 250 + const idx_str = std.fmt.bufPrint(&buf, "{d}", .{index}) catch unreachable; 251 + const result = try self.client.sendCommand(&.{ "LINDEX", key, idx_str }); 252 + return switch (result) { 253 + .bulk => |b| b, 254 + else => null, 255 + }; 256 + } 257 + 258 + /// LRANGE key start stop - get range of elements 259 + /// Supports negative indices (-1 = last element). 260 + pub fn lrange(self: *ListCommands, key: []const u8, start: i64, stop: i64) ClientError![]const Value { 261 + var start_buf: [24]u8 = undefined; 262 + var stop_buf: [24]u8 = undefined; 263 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 264 + const stop_str = std.fmt.bufPrint(&stop_buf, "{d}", .{stop}) catch unreachable; 265 + 266 + const result = try self.client.sendCommand(&.{ "LRANGE", key, start_str, stop_str }); 267 + return switch (result) { 268 + .array => |a| a, 269 + else => &.{}, 270 + }; 271 + } 272 + 273 + /// LLEN key - get list length 274 + pub fn llen(self: *ListCommands, key: []const u8) ClientError!i64 { 275 + const result = try self.client.sendCommand(&.{ "LLEN", key }); 276 + return switch (result) { 277 + .integer => |i| i, 278 + else => 0, 279 + }; 280 + } 281 + 282 + // ======================================================================== 283 + // Modification Operations 284 + // ======================================================================== 285 + 286 + /// LSET key index value - set element at index 287 + pub fn lset(self: *ListCommands, key: []const u8, index: i64, value: []const u8) ClientError!void { 288 + var buf: [24]u8 = undefined; 289 + const idx_str = std.fmt.bufPrint(&buf, "{d}", .{index}) catch unreachable; 290 + const result = try self.client.sendCommand(&.{ "LSET", key, idx_str, value }); 291 + if (result.isError()) return CommandError.RedisError; 292 + } 293 + 294 + /// LTRIM key start stop - trim list to specified range 295 + pub fn ltrim(self: *ListCommands, key: []const u8, start: i64, stop: i64) ClientError!void { 296 + var start_buf: [24]u8 = undefined; 297 + var stop_buf: [24]u8 = undefined; 298 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 299 + const stop_str = std.fmt.bufPrint(&stop_buf, "{d}", .{stop}) catch unreachable; 300 + 301 + const result = try self.client.sendCommand(&.{ "LTRIM", key, start_str, stop_str }); 302 + if (result.isError()) return CommandError.RedisError; 303 + } 304 + 305 + /// LREM key count value - remove elements 306 + /// count > 0: remove first count matches from head 307 + /// count < 0: remove first |count| matches from tail 308 + /// count = 0: remove all matches 309 + pub fn lrem(self: *ListCommands, key: []const u8, count: i64, value: []const u8) ClientError!i64 { 310 + var buf: [24]u8 = undefined; 311 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 312 + const result = try self.client.sendCommand(&.{ "LREM", key, count_str, value }); 313 + return switch (result) { 314 + .integer => |i| i, 315 + else => 0, 316 + }; 317 + } 318 + 319 + /// LINSERT key BEFORE|AFTER pivot value - insert before/after element 320 + pub fn linsert(self: *ListCommands, key: []const u8, position: enum { before, after }, pivot: []const u8, value: []const u8) ClientError!i64 { 321 + const pos_str = if (position == .before) "BEFORE" else "AFTER"; 322 + const result = try self.client.sendCommand(&.{ "LINSERT", key, pos_str, pivot, value }); 323 + return switch (result) { 324 + .integer => |i| i, 325 + else => -1, 326 + }; 327 + } 328 + 329 + /// LPOS key element [RANK rank] [COUNT count] [MAXLEN len] - find element position (Redis 6.0.6+) 330 + pub fn lpos(self: *ListCommands, key: []const u8, element: []const u8) ClientError!?i64 { 331 + const result = try self.client.sendCommand(&.{ "LPOS", key, element }); 332 + return switch (result) { 333 + .integer => |i| i, 334 + .nil => null, 335 + else => null, 336 + }; 337 + } 338 + 339 + /// LMOVE source destination LEFT|RIGHT LEFT|RIGHT - atomically move element 340 + pub fn lmove(self: *ListCommands, source: []const u8, dest: []const u8, src_dir: enum { left, right }, dst_dir: enum { left, right }) ClientError!?[]const u8 { 341 + const src_str = if (src_dir == .left) "LEFT" else "RIGHT"; 342 + const dst_str = if (dst_dir == .left) "LEFT" else "RIGHT"; 343 + const result = try self.client.sendCommand(&.{ "LMOVE", source, dest, src_str, dst_str }); 344 + return switch (result) { 345 + .bulk => |b| b, 346 + else => null, 347 + }; 348 + } 349 + }; 350 + 351 + /// Extend Client with list commands. 352 + pub fn lists(client: *Client) ListCommands { 353 + return ListCommands.init(client); 354 + }
+352
src/commands/sets.zig
··· 1 + //! Redis set commands 2 + //! 3 + //! Sets are unordered collections of unique strings. Operations on sets 4 + //! are O(1) for add/remove/membership, making them ideal for: 5 + //! 6 + //! ## Use Cases 7 + //! 8 + //! - Tags: `SADD post:1:tags "redis" "database" "nosql"` 9 + //! - Unique visitors: `SADD visitors:2024-01-15 user_id` 10 + //! - Online users: `SADD online user_id` + `SREM online user_id` 11 + //! - Permissions: `SADD user:1:roles "admin" "editor"` 12 + //! - Relationships: `SADD user:1:following user:2` 13 + //! 14 + //! ## Set Operations 15 + //! 16 + //! - SUNION: combine sets 17 + //! - SINTER: find common elements 18 + //! - SDIFF: elements in first set but not others 19 + //! 20 + //! ## Examples 21 + //! 22 + //! ```zig 23 + //! _ = try client.sets().sadd("tags", &.{"redis", "fast", "database"}); 24 + //! const is_tagged = try client.sets().sismember("tags", "redis"); // true 25 + //! const all_tags = try client.sets().smembers("tags"); 26 + //! 27 + //! // Set operations 28 + //! const common = try client.sets().sinter(&.{"set1", "set2"}); 29 + //! const combined = try client.sets().sunion(&.{"set1", "set2", "set3"}); 30 + //! ``` 31 + 32 + const std = @import("std"); 33 + const Client = @import("../client.zig").Client; 34 + const Value = @import("../resp.zig").Value; 35 + const CommandError = @import("../resp.zig").CommandError; 36 + const ClientError = @import("../resp.zig").ClientError; 37 + 38 + /// Set command implementations. 39 + pub const SetCommands = struct { 40 + client: *Client, 41 + 42 + pub fn init(client: *Client) SetCommands { 43 + return .{ .client = client }; 44 + } 45 + 46 + // ======================================================================== 47 + // Basic Operations 48 + // ======================================================================== 49 + 50 + /// SADD key member [member ...] - add members to set 51 + /// Returns number of members added (not already present). 52 + pub fn sadd(self: *SetCommands, key: []const u8, members: []const []const u8) ClientError!i64 { 53 + var args = try self.client.allocator.alloc([]const u8, members.len + 2); 54 + defer self.client.allocator.free(args); 55 + args[0] = "SADD"; 56 + args[1] = key; 57 + @memcpy(args[2..], members); 58 + 59 + const result = try self.client.sendCommand(args); 60 + return switch (result) { 61 + .integer => |i| i, 62 + .err => return CommandError.WrongType, 63 + else => 0, 64 + }; 65 + } 66 + 67 + /// SREM key member [member ...] - remove members from set 68 + /// Returns number of members removed. 69 + pub fn srem(self: *SetCommands, key: []const u8, members: []const []const u8) ClientError!i64 { 70 + var args = try self.client.allocator.alloc([]const u8, members.len + 2); 71 + defer self.client.allocator.free(args); 72 + args[0] = "SREM"; 73 + args[1] = key; 74 + @memcpy(args[2..], members); 75 + 76 + const result = try self.client.sendCommand(args); 77 + return switch (result) { 78 + .integer => |i| i, 79 + else => 0, 80 + }; 81 + } 82 + 83 + /// SISMEMBER key member - check if member exists 84 + pub fn sismember(self: *SetCommands, key: []const u8, member: []const u8) ClientError!bool { 85 + const result = try self.client.sendCommand(&.{ "SISMEMBER", key, member }); 86 + return switch (result) { 87 + .integer => |i| i == 1, 88 + else => false, 89 + }; 90 + } 91 + 92 + /// SMISMEMBER key member [member ...] - check multiple members (Redis 6.2+) 93 + /// Returns array of 0/1 for each member. 94 + pub fn smismember(self: *SetCommands, key: []const u8, members: []const []const u8) ClientError![]const Value { 95 + var args = try self.client.allocator.alloc([]const u8, members.len + 2); 96 + defer self.client.allocator.free(args); 97 + args[0] = "SMISMEMBER"; 98 + args[1] = key; 99 + @memcpy(args[2..], members); 100 + 101 + const result = try self.client.sendCommand(args); 102 + return switch (result) { 103 + .array => |a| a, 104 + else => &.{}, 105 + }; 106 + } 107 + 108 + /// SMEMBERS key - get all members 109 + pub fn smembers(self: *SetCommands, key: []const u8) ClientError![]const Value { 110 + const result = try self.client.sendCommand(&.{ "SMEMBERS", key }); 111 + return switch (result) { 112 + .array => |a| a, 113 + else => &.{}, 114 + }; 115 + } 116 + 117 + /// SCARD key - get set cardinality (size) 118 + pub fn scard(self: *SetCommands, key: []const u8) ClientError!i64 { 119 + const result = try self.client.sendCommand(&.{ "SCARD", key }); 120 + return switch (result) { 121 + .integer => |i| i, 122 + else => 0, 123 + }; 124 + } 125 + 126 + // ======================================================================== 127 + // Pop and Random 128 + // ======================================================================== 129 + 130 + /// SPOP key [count] - remove and return random member(s) 131 + pub fn spop(self: *SetCommands, key: []const u8) ClientError!?[]const u8 { 132 + const result = try self.client.sendCommand(&.{ "SPOP", key }); 133 + return switch (result) { 134 + .bulk => |b| b, 135 + .nil => null, 136 + else => null, 137 + }; 138 + } 139 + 140 + /// SPOP key count - remove and return multiple random members 141 + pub fn spopCount(self: *SetCommands, key: []const u8, count: u32) ClientError![]const Value { 142 + var buf: [16]u8 = undefined; 143 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 144 + const result = try self.client.sendCommand(&.{ "SPOP", key, count_str }); 145 + return switch (result) { 146 + .array => |a| a, 147 + else => &.{}, 148 + }; 149 + } 150 + 151 + /// SRANDMEMBER key [count] - get random member(s) without removing 152 + pub fn srandmember(self: *SetCommands, key: []const u8) ClientError!?[]const u8 { 153 + const result = try self.client.sendCommand(&.{ "SRANDMEMBER", key }); 154 + return switch (result) { 155 + .bulk => |b| b, 156 + else => null, 157 + }; 158 + } 159 + 160 + /// SRANDMEMBER key count - get multiple random members 161 + /// If count is negative, allows duplicates. 162 + pub fn srandmemberCount(self: *SetCommands, key: []const u8, count: i32) ClientError![]const Value { 163 + var buf: [16]u8 = undefined; 164 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{count}) catch unreachable; 165 + const result = try self.client.sendCommand(&.{ "SRANDMEMBER", key, count_str }); 166 + return switch (result) { 167 + .array => |a| a, 168 + else => &.{}, 169 + }; 170 + } 171 + 172 + // ======================================================================== 173 + // Set Operations 174 + // ======================================================================== 175 + 176 + /// SUNION key [key ...] - union of sets 177 + pub fn sunion(self: *SetCommands, keys: []const []const u8) ClientError![]const Value { 178 + var args = try self.client.allocator.alloc([]const u8, keys.len + 1); 179 + defer self.client.allocator.free(args); 180 + args[0] = "SUNION"; 181 + @memcpy(args[1..], keys); 182 + 183 + const result = try self.client.sendCommand(args); 184 + return switch (result) { 185 + .array => |a| a, 186 + else => &.{}, 187 + }; 188 + } 189 + 190 + /// SUNIONSTORE destination key [key ...] - store union in destination 191 + /// Returns size of resulting set. 192 + pub fn sunionstore(self: *SetCommands, dest: []const u8, keys: []const []const u8) ClientError!i64 { 193 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 194 + defer self.client.allocator.free(args); 195 + args[0] = "SUNIONSTORE"; 196 + args[1] = dest; 197 + @memcpy(args[2..], keys); 198 + 199 + const result = try self.client.sendCommand(args); 200 + return switch (result) { 201 + .integer => |i| i, 202 + else => 0, 203 + }; 204 + } 205 + 206 + /// SINTER key [key ...] - intersection of sets 207 + pub fn sinter(self: *SetCommands, keys: []const []const u8) ClientError![]const Value { 208 + var args = try self.client.allocator.alloc([]const u8, keys.len + 1); 209 + defer self.client.allocator.free(args); 210 + args[0] = "SINTER"; 211 + @memcpy(args[1..], keys); 212 + 213 + const result = try self.client.sendCommand(args); 214 + return switch (result) { 215 + .array => |a| a, 216 + else => &.{}, 217 + }; 218 + } 219 + 220 + /// SINTERSTORE destination key [key ...] - store intersection 221 + pub fn sinterstore(self: *SetCommands, dest: []const u8, keys: []const []const u8) ClientError!i64 { 222 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 223 + defer self.client.allocator.free(args); 224 + args[0] = "SINTERSTORE"; 225 + args[1] = dest; 226 + @memcpy(args[2..], keys); 227 + 228 + const result = try self.client.sendCommand(args); 229 + return switch (result) { 230 + .integer => |i| i, 231 + else => 0, 232 + }; 233 + } 234 + 235 + /// SINTERCARD numkeys key [key ...] [LIMIT limit] - cardinality of intersection (Redis 7+) 236 + pub fn sintercard(self: *SetCommands, keys: []const []const u8, limit: ?u32) ClientError!i64 { 237 + const base_len = 2 + keys.len + if (limit != null) @as(usize, 2) else @as(usize, 0); 238 + var args = try self.client.allocator.alloc([]const u8, base_len); 239 + defer self.client.allocator.free(args); 240 + 241 + var numkeys_buf: [16]u8 = undefined; 242 + args[0] = "SINTERCARD"; 243 + args[1] = std.fmt.bufPrint(&numkeys_buf, "{d}", .{keys.len}) catch unreachable; 244 + @memcpy(args[2..][0..keys.len], keys); 245 + 246 + var arg_idx = 2 + keys.len; 247 + var limit_buf: [16]u8 = undefined; 248 + if (limit) |l| { 249 + args[arg_idx] = "LIMIT"; 250 + args[arg_idx + 1] = std.fmt.bufPrint(&limit_buf, "{d}", .{l}) catch unreachable; 251 + arg_idx += 2; 252 + } 253 + 254 + const result = try self.client.sendCommand(args[0..arg_idx]); 255 + return switch (result) { 256 + .integer => |i| i, 257 + else => 0, 258 + }; 259 + } 260 + 261 + /// SDIFF key [key ...] - difference of sets (first minus others) 262 + pub fn sdiff(self: *SetCommands, keys: []const []const u8) ClientError![]const Value { 263 + var args = try self.client.allocator.alloc([]const u8, keys.len + 1); 264 + defer self.client.allocator.free(args); 265 + args[0] = "SDIFF"; 266 + @memcpy(args[1..], keys); 267 + 268 + const result = try self.client.sendCommand(args); 269 + return switch (result) { 270 + .array => |a| a, 271 + else => &.{}, 272 + }; 273 + } 274 + 275 + /// SDIFFSTORE destination key [key ...] - store difference 276 + pub fn sdiffstore(self: *SetCommands, dest: []const u8, keys: []const []const u8) ClientError!i64 { 277 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 278 + defer self.client.allocator.free(args); 279 + args[0] = "SDIFFSTORE"; 280 + args[1] = dest; 281 + @memcpy(args[2..], keys); 282 + 283 + const result = try self.client.sendCommand(args); 284 + return switch (result) { 285 + .integer => |i| i, 286 + else => 0, 287 + }; 288 + } 289 + 290 + // ======================================================================== 291 + // Move 292 + // ======================================================================== 293 + 294 + /// SMOVE source destination member - move member between sets 295 + /// Returns true if moved (member existed in source). 296 + pub fn smove(self: *SetCommands, source: []const u8, dest: []const u8, member: []const u8) ClientError!bool { 297 + const result = try self.client.sendCommand(&.{ "SMOVE", source, dest, member }); 298 + return switch (result) { 299 + .integer => |i| i == 1, 300 + else => false, 301 + }; 302 + } 303 + 304 + // ======================================================================== 305 + // Scanning 306 + // ======================================================================== 307 + 308 + /// Result from SSCAN command 309 + pub const ScanResult = struct { 310 + cursor: []const u8, 311 + members: []const Value, 312 + }; 313 + 314 + /// SSCAN key cursor [MATCH pattern] [COUNT count] - iterate members 315 + pub fn sscan(self: *SetCommands, key: []const u8, cursor: []const u8, pattern: ?[]const u8, count: ?u32) ClientError!ScanResult { 316 + var args_buf: [8][]const u8 = undefined; 317 + var arg_count: usize = 3; 318 + args_buf[0] = "SSCAN"; 319 + args_buf[1] = key; 320 + args_buf[2] = cursor; 321 + 322 + if (pattern) |p| { 323 + args_buf[arg_count] = "MATCH"; 324 + args_buf[arg_count + 1] = p; 325 + arg_count += 2; 326 + } 327 + 328 + var count_buf: [16]u8 = undefined; 329 + if (count) |c| { 330 + args_buf[arg_count] = "COUNT"; 331 + args_buf[arg_count + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 332 + arg_count += 2; 333 + } 334 + 335 + const result = try self.client.sendCommand(args_buf[0..arg_count]); 336 + return switch (result) { 337 + .array => |arr| { 338 + if (arr.len < 2) return ScanResult{ .cursor = "0", .members = &.{} }; 339 + return ScanResult{ 340 + .cursor = arr[0].asString() orelse "0", 341 + .members = arr[1].asArray() orelse &.{}, 342 + }; 343 + }, 344 + else => ScanResult{ .cursor = "0", .members = &.{} }, 345 + }; 346 + } 347 + }; 348 + 349 + /// Extend Client with set commands. 350 + pub fn sets(client: *Client) SetCommands { 351 + return SetCommands.init(client); 352 + }
+447
src/commands/sorted_sets.zig
··· 1 + //! Redis sorted set (zset) commands 2 + //! 3 + //! Sorted sets combine the uniqueness of sets with a score for each member, 4 + //! keeping members sorted by score. This enables efficient range queries, 5 + //! rankings, and priority queues. 6 + //! 7 + //! ## Use Cases 8 + //! 9 + //! - Leaderboards: `ZADD leaderboard score player` 10 + //! - Time series (by timestamp): `ZADD events timestamp event_id` 11 + //! - Priority queues: `ZADD tasks priority task_id` 12 + //! - Rate limiting: `ZADD requests:user timestamp request_id` 13 + //! - Autocomplete: `ZADD suggestions 0 "search term"` 14 + //! 15 + //! ## Complexity 16 + //! 17 + //! - Add/remove/score lookup: O(log n) 18 + //! - Range by rank/score: O(log n + m) where m is elements returned 19 + //! - Cardinality: O(1) 20 + //! 21 + //! ## Examples 22 + //! 23 + //! ```zig 24 + //! // Leaderboard 25 + //! _ = try client.zsets().zadd("leaderboard", 100, "alice"); 26 + //! _ = try client.zsets().zadd("leaderboard", 95, "bob"); 27 + //! _ = try client.zsets().zincrBy("leaderboard", 10, "bob"); // bob now at 105 28 + //! 29 + //! // Get top 10 30 + //! const top = try client.zsets().zrangeWithScores("leaderboard", 0, 9, .rev); 31 + //! 32 + //! // Time-windowed events 33 + //! const now = std.time.timestamp(); 34 + //! _ = try client.zsets().zrangeByScore("events", now - 3600, now); // last hour 35 + //! ``` 36 + 37 + const std = @import("std"); 38 + const Client = @import("../client.zig").Client; 39 + const Value = @import("../resp.zig").Value; 40 + const CommandError = @import("../resp.zig").CommandError; 41 + const ClientError = @import("../resp.zig").ClientError; 42 + 43 + /// Sorted set command implementations. 44 + pub const SortedSetCommands = struct { 45 + client: *Client, 46 + 47 + pub fn init(client: *Client) SortedSetCommands { 48 + return .{ .client = client }; 49 + } 50 + 51 + /// Score-member pair returned from WITHSCORES queries 52 + pub const ScoredMember = struct { 53 + member: []const u8, 54 + score: f64, 55 + }; 56 + 57 + /// Options for ZADD command 58 + pub const AddOptions = struct { 59 + /// NX: only add new members (don't update existing) 60 + nx: bool = false, 61 + /// XX: only update existing members (don't add new) 62 + xx: bool = false, 63 + /// GT: only update if new score > current (Redis 6.2+) 64 + gt: bool = false, 65 + /// LT: only update if new score < current (Redis 6.2+) 66 + lt: bool = false, 67 + /// CH: return count of changed members (added + updated) 68 + ch: bool = false, 69 + }; 70 + 71 + // ======================================================================== 72 + // Basic Operations 73 + // ======================================================================== 74 + 75 + /// ZADD key score member [score member ...] - add member with score 76 + /// Returns number of elements added. 77 + pub fn zadd(self: *SortedSetCommands, key: []const u8, score: f64, member: []const u8) ClientError!i64 { 78 + var buf: [32]u8 = undefined; 79 + const score_str = std.fmt.bufPrint(&buf, "{d}", .{score}) catch unreachable; 80 + const result = try self.client.sendCommand(&.{ "ZADD", key, score_str, member }); 81 + return switch (result) { 82 + .integer => |i| i, 83 + .err => return CommandError.WrongType, 84 + else => 0, 85 + }; 86 + } 87 + 88 + /// ZADD with options and multiple members 89 + pub fn zaddMulti(self: *SortedSetCommands, key: []const u8, options: AddOptions, pairs: []const struct { score: f64, member: []const u8 }) ClientError!i64 { 90 + // Calculate arg count: ZADD key [options] score member [score member ...] 91 + var opt_count: usize = 0; 92 + if (options.nx) opt_count += 1; 93 + if (options.xx) opt_count += 1; 94 + if (options.gt) opt_count += 1; 95 + if (options.lt) opt_count += 1; 96 + if (options.ch) opt_count += 1; 97 + 98 + const arg_count = 2 + opt_count + pairs.len * 2; 99 + var args = try self.client.allocator.alloc([]const u8, arg_count); 100 + defer self.client.allocator.free(args); 101 + 102 + // We need to allocate score strings 103 + var score_bufs = try self.client.allocator.alloc([32]u8, pairs.len); 104 + defer self.client.allocator.free(score_bufs); 105 + 106 + args[0] = "ZADD"; 107 + args[1] = key; 108 + 109 + var idx: usize = 2; 110 + if (options.nx) { 111 + args[idx] = "NX"; 112 + idx += 1; 113 + } 114 + if (options.xx) { 115 + args[idx] = "XX"; 116 + idx += 1; 117 + } 118 + if (options.gt) { 119 + args[idx] = "GT"; 120 + idx += 1; 121 + } 122 + if (options.lt) { 123 + args[idx] = "LT"; 124 + idx += 1; 125 + } 126 + if (options.ch) { 127 + args[idx] = "CH"; 128 + idx += 1; 129 + } 130 + 131 + for (pairs, 0..) |pair, i| { 132 + const score_str = std.fmt.bufPrint(&score_bufs[i], "{d}", .{pair.score}) catch unreachable; 133 + args[idx] = score_str; 134 + args[idx + 1] = pair.member; 135 + idx += 2; 136 + } 137 + 138 + const result = try self.client.sendCommand(args); 139 + return switch (result) { 140 + .integer => |i| i, 141 + .err => return CommandError.WrongType, 142 + else => 0, 143 + }; 144 + } 145 + 146 + /// ZREM key member [member ...] - remove members 147 + pub fn zrem(self: *SortedSetCommands, key: []const u8, members: []const []const u8) ClientError!i64 { 148 + var args = try self.client.allocator.alloc([]const u8, members.len + 2); 149 + defer self.client.allocator.free(args); 150 + args[0] = "ZREM"; 151 + args[1] = key; 152 + @memcpy(args[2..], members); 153 + 154 + const result = try self.client.sendCommand(args); 155 + return switch (result) { 156 + .integer => |i| i, 157 + else => 0, 158 + }; 159 + } 160 + 161 + /// ZSCORE key member - get member's score 162 + pub fn zscore(self: *SortedSetCommands, key: []const u8, member: []const u8) ClientError!?f64 { 163 + const result = try self.client.sendCommand(&.{ "ZSCORE", key, member }); 164 + return switch (result) { 165 + .bulk => |b| if (b) |s| std.fmt.parseFloat(f64, s) catch null else null, 166 + else => null, 167 + }; 168 + } 169 + 170 + /// ZMSCORE key member [member ...] - get multiple scores (Redis 6.2+) 171 + pub fn zmscore(self: *SortedSetCommands, key: []const u8, members: []const []const u8) ClientError![]const Value { 172 + var args = try self.client.allocator.alloc([]const u8, members.len + 2); 173 + defer self.client.allocator.free(args); 174 + args[0] = "ZMSCORE"; 175 + args[1] = key; 176 + @memcpy(args[2..], members); 177 + 178 + const result = try self.client.sendCommand(args); 179 + return switch (result) { 180 + .array => |a| a, 181 + else => &.{}, 182 + }; 183 + } 184 + 185 + /// ZINCRBY key increment member - increment score 186 + pub fn zincrBy(self: *SortedSetCommands, key: []const u8, increment: f64, member: []const u8) ClientError!f64 { 187 + var buf: [32]u8 = undefined; 188 + const inc_str = std.fmt.bufPrint(&buf, "{d}", .{increment}) catch unreachable; 189 + const result = try self.client.sendCommand(&.{ "ZINCRBY", key, inc_str, member }); 190 + return switch (result) { 191 + .bulk => |b| if (b) |s| std.fmt.parseFloat(f64, s) catch return CommandError.RedisError else return CommandError.RedisError, 192 + .err => return CommandError.WrongType, 193 + else => return CommandError.RedisError, 194 + }; 195 + } 196 + 197 + /// ZCARD key - get cardinality 198 + pub fn zcard(self: *SortedSetCommands, key: []const u8) ClientError!i64 { 199 + const result = try self.client.sendCommand(&.{ "ZCARD", key }); 200 + return switch (result) { 201 + .integer => |i| i, 202 + else => 0, 203 + }; 204 + } 205 + 206 + /// ZCOUNT key min max - count members with score in range 207 + pub fn zcount(self: *SortedSetCommands, key: []const u8, min: f64, max: f64) ClientError!i64 { 208 + var min_buf: [32]u8 = undefined; 209 + var max_buf: [32]u8 = undefined; 210 + const min_str = std.fmt.bufPrint(&min_buf, "{d}", .{min}) catch unreachable; 211 + const max_str = std.fmt.bufPrint(&max_buf, "{d}", .{max}) catch unreachable; 212 + const result = try self.client.sendCommand(&.{ "ZCOUNT", key, min_str, max_str }); 213 + return switch (result) { 214 + .integer => |i| i, 215 + else => 0, 216 + }; 217 + } 218 + 219 + // ======================================================================== 220 + // Rank Operations 221 + // ======================================================================== 222 + 223 + /// ZRANK key member - get rank (0-indexed, low to high) 224 + pub fn zrank(self: *SortedSetCommands, key: []const u8, member: []const u8) ClientError!?i64 { 225 + const result = try self.client.sendCommand(&.{ "ZRANK", key, member }); 226 + return switch (result) { 227 + .integer => |i| i, 228 + .nil => null, 229 + else => null, 230 + }; 231 + } 232 + 233 + /// ZREVRANK key member - get reverse rank (0 = highest score) 234 + pub fn zrevrank(self: *SortedSetCommands, key: []const u8, member: []const u8) ClientError!?i64 { 235 + const result = try self.client.sendCommand(&.{ "ZREVRANK", key, member }); 236 + return switch (result) { 237 + .integer => |i| i, 238 + .nil => null, 239 + else => null, 240 + }; 241 + } 242 + 243 + // ======================================================================== 244 + // Range Queries 245 + // ======================================================================== 246 + 247 + /// Sort order for range queries 248 + pub const Order = enum { asc, desc }; 249 + 250 + /// ZRANGE key start stop [REV] - get members by rank 251 + pub fn zrange(self: *SortedSetCommands, key: []const u8, start: i64, stop: i64, order: Order) ClientError![]const Value { 252 + var start_buf: [24]u8 = undefined; 253 + var stop_buf: [24]u8 = undefined; 254 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 255 + const stop_str = std.fmt.bufPrint(&stop_buf, "{d}", .{stop}) catch unreachable; 256 + 257 + const result = if (order == .desc) 258 + try self.client.sendCommand(&.{ "ZRANGE", key, start_str, stop_str, "REV" }) 259 + else 260 + try self.client.sendCommand(&.{ "ZRANGE", key, start_str, stop_str }); 261 + 262 + return switch (result) { 263 + .array => |a| a, 264 + else => &.{}, 265 + }; 266 + } 267 + 268 + /// ZRANGE key start stop WITHSCORES - get members with scores 269 + pub fn zrangeWithScores(self: *SortedSetCommands, key: []const u8, start: i64, stop: i64, order: Order) ClientError![]const Value { 270 + var start_buf: [24]u8 = undefined; 271 + var stop_buf: [24]u8 = undefined; 272 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 273 + const stop_str = std.fmt.bufPrint(&stop_buf, "{d}", .{stop}) catch unreachable; 274 + 275 + const result = if (order == .desc) 276 + try self.client.sendCommand(&.{ "ZRANGE", key, start_str, stop_str, "REV", "WITHSCORES" }) 277 + else 278 + try self.client.sendCommand(&.{ "ZRANGE", key, start_str, stop_str, "WITHSCORES" }); 279 + 280 + return switch (result) { 281 + .array => |a| a, 282 + else => &.{}, 283 + }; 284 + } 285 + 286 + /// ZRANGEBYSCORE key min max - get members by score range 287 + pub fn zrangeByScore(self: *SortedSetCommands, key: []const u8, min: f64, max: f64) ClientError![]const Value { 288 + var min_buf: [32]u8 = undefined; 289 + var max_buf: [32]u8 = undefined; 290 + const min_str = std.fmt.bufPrint(&min_buf, "{d}", .{min}) catch unreachable; 291 + const max_str = std.fmt.bufPrint(&max_buf, "{d}", .{max}) catch unreachable; 292 + 293 + // ZRANGE with BYSCORE (Redis 6.2+) 294 + const result = try self.client.sendCommand(&.{ "ZRANGE", key, min_str, max_str, "BYSCORE" }); 295 + return switch (result) { 296 + .array => |a| a, 297 + else => &.{}, 298 + }; 299 + } 300 + 301 + // ======================================================================== 302 + // Pop Operations 303 + // ======================================================================== 304 + 305 + /// ZPOPMIN key [count] - remove and return lowest scored members 306 + pub fn zpopmin(self: *SortedSetCommands, key: []const u8, count: ?u32) ClientError![]const Value { 307 + if (count) |c| { 308 + var buf: [16]u8 = undefined; 309 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{c}) catch unreachable; 310 + const result = try self.client.sendCommand(&.{ "ZPOPMIN", key, count_str }); 311 + return switch (result) { 312 + .array => |a| a, 313 + else => &.{}, 314 + }; 315 + } else { 316 + const result = try self.client.sendCommand(&.{ "ZPOPMIN", key }); 317 + return switch (result) { 318 + .array => |a| a, 319 + else => &.{}, 320 + }; 321 + } 322 + } 323 + 324 + /// ZPOPMAX key [count] - remove and return highest scored members 325 + pub fn zpopmax(self: *SortedSetCommands, key: []const u8, count: ?u32) ClientError![]const Value { 326 + if (count) |c| { 327 + var buf: [16]u8 = undefined; 328 + const count_str = std.fmt.bufPrint(&buf, "{d}", .{c}) catch unreachable; 329 + const result = try self.client.sendCommand(&.{ "ZPOPMAX", key, count_str }); 330 + return switch (result) { 331 + .array => |a| a, 332 + else => &.{}, 333 + }; 334 + } else { 335 + const result = try self.client.sendCommand(&.{ "ZPOPMAX", key }); 336 + return switch (result) { 337 + .array => |a| a, 338 + else => &.{}, 339 + }; 340 + } 341 + } 342 + 343 + /// BZPOPMIN key [key ...] timeout - blocking pop min 344 + pub fn bzpopmin(self: *SortedSetCommands, keys: []const []const u8, timeout: f64) ClientError!?struct { key: []const u8, member: []const u8, score: f64 } { 345 + var args = try self.client.allocator.alloc([]const u8, keys.len + 2); 346 + defer self.client.allocator.free(args); 347 + 348 + args[0] = "BZPOPMIN"; 349 + @memcpy(args[1..][0..keys.len], keys); 350 + 351 + var buf: [32]u8 = undefined; 352 + args[keys.len + 1] = std.fmt.bufPrint(&buf, "{d}", .{timeout}) catch unreachable; 353 + 354 + const result = try self.client.sendCommand(args); 355 + return switch (result) { 356 + .array => |arr| { 357 + if (arr.len < 3) return null; 358 + const k = arr[0].asString() orelse return null; 359 + const m = arr[1].asString() orelse return null; 360 + const s = if (arr[2].asString()) |str| std.fmt.parseFloat(f64, str) catch return null else return null; 361 + return .{ .key = k, .member = m, .score = s }; 362 + }, 363 + .nil => null, 364 + else => null, 365 + }; 366 + } 367 + 368 + // ======================================================================== 369 + // Removal by Range 370 + // ======================================================================== 371 + 372 + /// ZREMRANGEBYRANK key start stop - remove by rank range 373 + pub fn zremrangeByRank(self: *SortedSetCommands, key: []const u8, start: i64, stop: i64) ClientError!i64 { 374 + var start_buf: [24]u8 = undefined; 375 + var stop_buf: [24]u8 = undefined; 376 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 377 + const stop_str = std.fmt.bufPrint(&stop_buf, "{d}", .{stop}) catch unreachable; 378 + const result = try self.client.sendCommand(&.{ "ZREMRANGEBYRANK", key, start_str, stop_str }); 379 + return switch (result) { 380 + .integer => |i| i, 381 + else => 0, 382 + }; 383 + } 384 + 385 + /// ZREMRANGEBYSCORE key min max - remove by score range 386 + pub fn zremrangeByScore(self: *SortedSetCommands, key: []const u8, min: f64, max: f64) ClientError!i64 { 387 + var min_buf: [32]u8 = undefined; 388 + var max_buf: [32]u8 = undefined; 389 + const min_str = std.fmt.bufPrint(&min_buf, "{d}", .{min}) catch unreachable; 390 + const max_str = std.fmt.bufPrint(&max_buf, "{d}", .{max}) catch unreachable; 391 + const result = try self.client.sendCommand(&.{ "ZREMRANGEBYSCORE", key, min_str, max_str }); 392 + return switch (result) { 393 + .integer => |i| i, 394 + else => 0, 395 + }; 396 + } 397 + 398 + // ======================================================================== 399 + // Scanning 400 + // ======================================================================== 401 + 402 + /// Result from ZSCAN command 403 + pub const ScanResult = struct { 404 + cursor: []const u8, 405 + /// Flat array: [member1, score1, member2, score2, ...] 406 + pairs: []const Value, 407 + }; 408 + 409 + /// ZSCAN key cursor [MATCH pattern] [COUNT count] - iterate members 410 + pub fn zscan(self: *SortedSetCommands, key: []const u8, cursor: []const u8, pattern: ?[]const u8, count: ?u32) ClientError!ScanResult { 411 + var args_buf: [8][]const u8 = undefined; 412 + var arg_count: usize = 3; 413 + args_buf[0] = "ZSCAN"; 414 + args_buf[1] = key; 415 + args_buf[2] = cursor; 416 + 417 + if (pattern) |p| { 418 + args_buf[arg_count] = "MATCH"; 419 + args_buf[arg_count + 1] = p; 420 + arg_count += 2; 421 + } 422 + 423 + var count_buf: [16]u8 = undefined; 424 + if (count) |c| { 425 + args_buf[arg_count] = "COUNT"; 426 + args_buf[arg_count + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 427 + arg_count += 2; 428 + } 429 + 430 + const result = try self.client.sendCommand(args_buf[0..arg_count]); 431 + return switch (result) { 432 + .array => |arr| { 433 + if (arr.len < 2) return ScanResult{ .cursor = "0", .pairs = &.{} }; 434 + return ScanResult{ 435 + .cursor = arr[0].asString() orelse "0", 436 + .pairs = arr[1].asArray() orelse &.{}, 437 + }; 438 + }, 439 + else => ScanResult{ .cursor = "0", .pairs = &.{} }, 440 + }; 441 + } 442 + }; 443 + 444 + /// Extend Client with sorted set commands. 445 + pub fn zsets(client: *Client) SortedSetCommands { 446 + return SortedSetCommands.init(client); 447 + }
+652
src/commands/streams.zig
··· 1 + //! Redis stream commands 2 + //! 3 + //! Streams are append-only log data structures, ideal for: 4 + //! - Event sourcing 5 + //! - Message queues with consumer groups 6 + //! - Activity feeds 7 + //! - Time series data 8 + //! 9 + //! ## Key Concepts 10 + //! 11 + //! - **Entry ID**: Unique identifier like "1234567890123-0" (timestamp-sequence) 12 + //! - **Consumer Group**: Named group of consumers that share message processing 13 + //! - **Consumer**: Individual worker within a group 14 + //! - **Pending Entry List (PEL)**: Messages delivered but not acknowledged 15 + //! 16 + //! ## Fan-Out Pattern 17 + //! 18 + //! Multiple consumer groups on the same stream each receive ALL messages: 19 + //! ``` 20 + //! Stream: events 21 + //! └── Consumer Group: "event-persister" (gets all messages) 22 + //! └── Consumer Group: "ws-broadcaster" (also gets all messages) 23 + //! └── Consumer Group: "analytics" (also gets all messages) 24 + //! ``` 25 + //! 26 + //! ## Examples 27 + //! 28 + //! ```zig 29 + //! // Publish event 30 + //! const id = try client.streams().xadd("events", .auto, &.{ 31 + //! .{"type", "user.login"}, 32 + //! .{"user_id", "1234"}, 33 + //! }); 34 + //! 35 + //! // Create consumer group 36 + //! try client.streams().xgroupCreate("events", "workers", "0"); 37 + //! 38 + //! // Read as consumer (blocks until message or timeout) 39 + //! if (try client.streams().xreadgroup("workers", "worker-1", "events", 1000, 1, ">")) |entry| { 40 + //! // Process entry 41 + //! try client.streams().xack("events", "workers", &.{entry.id}); 42 + //! } 43 + //! 44 + //! // Claim abandoned messages 45 + //! const claimed = try client.streams().xautoclaim("events", "workers", "worker-1", 30000, "0-0", 10); 46 + //! ``` 47 + 48 + const std = @import("std"); 49 + const Client = @import("../client.zig").Client; 50 + const Value = @import("../resp.zig").Value; 51 + const CommandError = @import("../resp.zig").CommandError; 52 + const ClientError = @import("../resp.zig").ClientError; 53 + 54 + /// A field-value pair in a stream entry 55 + pub const StreamField = struct { 56 + field: []const u8, 57 + value: []const u8, 58 + }; 59 + 60 + /// A single entry from a Redis stream 61 + pub const StreamEntry = struct { 62 + /// Stream entry ID (e.g., "1234567890123-0") 63 + id: []const u8, 64 + /// Field-value pairs in this entry 65 + fields: []const StreamField, 66 + 67 + /// Get a field value by name 68 + pub fn get(self: StreamEntry, field: []const u8) ?[]const u8 { 69 + for (self.fields) |f| { 70 + if (std.mem.eql(u8, f.field, field)) return f.value; 71 + } 72 + return null; 73 + } 74 + }; 75 + 76 + /// Result from XAUTOCLAIM command 77 + pub const AutoclaimResult = struct { 78 + /// Next stream ID to use for subsequent XAUTOCLAIM calls 79 + next_id: []const u8, 80 + /// Claimed entries 81 + entries: []const StreamEntry, 82 + /// IDs that no longer exist in the stream (Redis 7+) 83 + deleted_ids: []const []const u8, 84 + }; 85 + 86 + /// Result from XPENDING summary 87 + pub const PendingSummary = struct { 88 + count: i64, 89 + min_id: ?[]const u8, 90 + max_id: ?[]const u8, 91 + consumers: []const struct { name: []const u8, count: i64 }, 92 + }; 93 + 94 + /// Stream ID for XADD 95 + pub const StreamId = union(enum) { 96 + /// Let Redis auto-generate: "*" 97 + auto, 98 + /// Specific ID 99 + explicit: []const u8, 100 + /// Minimum ID greater than all existing: ">" (for new entries only) 101 + new_entries, 102 + 103 + fn toArg(self: StreamId) []const u8 { 104 + return switch (self) { 105 + .auto => "*", 106 + .explicit => |id| id, 107 + .new_entries => ">", 108 + }; 109 + } 110 + }; 111 + 112 + /// Stream command implementations. 113 + pub const StreamCommands = struct { 114 + client: *Client, 115 + 116 + pub fn init(client: *Client) StreamCommands { 117 + return .{ .client = client }; 118 + } 119 + 120 + // ======================================================================== 121 + // Publishing 122 + // ======================================================================== 123 + 124 + /// XADD stream ID field value [field value ...] - append entry to stream 125 + /// Returns the entry ID assigned by Redis. 126 + pub fn xadd(self: *StreamCommands, key: []const u8, id: StreamId, fields: []const [2][]const u8) ClientError![]const u8 { 127 + const arg_count = 3 + fields.len * 2; 128 + var args = try self.client.allocator.alloc([]const u8, arg_count); 129 + defer self.client.allocator.free(args); 130 + 131 + args[0] = "XADD"; 132 + args[1] = key; 133 + args[2] = id.toArg(); 134 + 135 + for (fields, 0..) |field, i| { 136 + args[3 + i * 2] = field[0]; 137 + args[3 + i * 2 + 1] = field[1]; 138 + } 139 + 140 + const result = try self.client.sendCommand(args); 141 + return switch (result) { 142 + .bulk => |b| b orelse return CommandError.RedisError, 143 + .err => return CommandError.RedisError, 144 + else => return CommandError.RedisError, 145 + }; 146 + } 147 + 148 + /// XADD with MAXLEN option for capped streams 149 + pub fn xaddCapped(self: *StreamCommands, key: []const u8, maxlen: usize, approximate: bool, fields: []const [2][]const u8) ClientError![]const u8 { 150 + const arg_count = 5 + fields.len * 2 + @as(usize, if (approximate) 1 else 0); 151 + var args = try self.client.allocator.alloc([]const u8, arg_count); 152 + defer self.client.allocator.free(args); 153 + 154 + var maxlen_buf: [24]u8 = undefined; 155 + 156 + args[0] = "XADD"; 157 + args[1] = key; 158 + args[2] = "MAXLEN"; 159 + 160 + var idx: usize = 3; 161 + if (approximate) { 162 + args[idx] = "~"; 163 + idx += 1; 164 + } 165 + args[idx] = std.fmt.bufPrint(&maxlen_buf, "{d}", .{maxlen}) catch unreachable; 166 + idx += 1; 167 + args[idx] = "*"; 168 + idx += 1; 169 + 170 + for (fields, 0..) |field, i| { 171 + args[idx + i * 2] = field[0]; 172 + args[idx + i * 2 + 1] = field[1]; 173 + } 174 + 175 + const result = try self.client.sendCommand(args[0 .. idx + fields.len * 2]); 176 + return switch (result) { 177 + .bulk => |b| b orelse return CommandError.RedisError, 178 + .err => return CommandError.RedisError, 179 + else => return CommandError.RedisError, 180 + }; 181 + } 182 + 183 + // ======================================================================== 184 + // Consumer Groups 185 + // ======================================================================== 186 + 187 + /// XGROUP CREATE stream group id [MKSTREAM] - create consumer group 188 + /// start_id: "0" to read from beginning, "$" for new messages only 189 + pub fn xgroupCreate(self: *StreamCommands, key: []const u8, group: []const u8, start_id: []const u8) ClientError!void { 190 + const result = try self.client.sendCommand(&.{ "XGROUP", "CREATE", key, group, start_id, "MKSTREAM" }); 191 + if (result.isError()) { 192 + // BUSYGROUP means group already exists - that's fine 193 + if (result.asString()) |msg| { 194 + if (std.mem.indexOf(u8, msg, "BUSYGROUP") != null) return; 195 + } 196 + return CommandError.RedisError; 197 + } 198 + } 199 + 200 + /// XGROUP DESTROY stream group - delete consumer group 201 + pub fn xgroupDestroy(self: *StreamCommands, key: []const u8, group: []const u8) ClientError!bool { 202 + const result = try self.client.sendCommand(&.{ "XGROUP", "DESTROY", key, group }); 203 + return switch (result) { 204 + .integer => |i| i == 1, 205 + .err => { 206 + // NOGROUP means doesn't exist - fine for cleanup 207 + if (result.asString()) |msg| { 208 + if (std.mem.indexOf(u8, msg, "NOGROUP") != null) return false; 209 + } 210 + return CommandError.RedisError; 211 + }, 212 + else => false, 213 + }; 214 + } 215 + 216 + /// XGROUP CREATECONSUMER stream group consumer - create consumer in group 217 + pub fn xgroupCreateConsumer(self: *StreamCommands, key: []const u8, group: []const u8, consumer: []const u8) ClientError!bool { 218 + const result = try self.client.sendCommand(&.{ "XGROUP", "CREATECONSUMER", key, group, consumer }); 219 + return switch (result) { 220 + .integer => |i| i == 1, 221 + else => false, 222 + }; 223 + } 224 + 225 + /// XGROUP DELCONSUMER stream group consumer - delete consumer from group 226 + pub fn xgroupDelConsumer(self: *StreamCommands, key: []const u8, group: []const u8, consumer: []const u8) ClientError!i64 { 227 + const result = try self.client.sendCommand(&.{ "XGROUP", "DELCONSUMER", key, group, consumer }); 228 + return switch (result) { 229 + .integer => |i| i, 230 + else => 0, 231 + }; 232 + } 233 + 234 + /// XGROUP SETID stream group id - set group's last-delivered-id 235 + pub fn xgroupSetId(self: *StreamCommands, key: []const u8, group: []const u8, entry_id: []const u8) ClientError!void { 236 + const result = try self.client.sendCommand(&.{ "XGROUP", "SETID", key, group, entry_id }); 237 + if (result.isError()) return CommandError.RedisError; 238 + } 239 + 240 + // ======================================================================== 241 + // Reading 242 + // ======================================================================== 243 + 244 + /// XREAD [BLOCK ms] [COUNT count] STREAMS key [key ...] id [id ...] 245 + /// Non-consumer-group read. Use "$" for new messages only. 246 + pub fn xread(self: *StreamCommands, key: []const u8, block_ms: ?u32, count: ?u32, start_id: []const u8) ClientError!?StreamEntry { 247 + var args_buf: [12][]const u8 = undefined; 248 + var arg_count: usize = 1; 249 + args_buf[0] = "XREAD"; 250 + 251 + var block_buf: [16]u8 = undefined; 252 + if (block_ms) |ms| { 253 + args_buf[arg_count] = "BLOCK"; 254 + args_buf[arg_count + 1] = std.fmt.bufPrint(&block_buf, "{d}", .{ms}) catch unreachable; 255 + arg_count += 2; 256 + } 257 + 258 + var count_buf: [16]u8 = undefined; 259 + if (count) |c| { 260 + args_buf[arg_count] = "COUNT"; 261 + args_buf[arg_count + 1] = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 262 + arg_count += 2; 263 + } 264 + 265 + args_buf[arg_count] = "STREAMS"; 266 + args_buf[arg_count + 1] = key; 267 + args_buf[arg_count + 2] = start_id; 268 + arg_count += 3; 269 + 270 + const result = try self.client.sendCommand(args_buf[0..arg_count]); 271 + if (result.isNull()) return null; 272 + 273 + return self.parseStreamReadResult(result); 274 + } 275 + 276 + /// XREADGROUP GROUP group consumer [BLOCK ms] [COUNT count] STREAMS key id 277 + /// Use ">" for new messages, "0" to replay pending 278 + pub fn xreadgroup( 279 + self: *StreamCommands, 280 + group: []const u8, 281 + consumer: []const u8, 282 + key: []const u8, 283 + block_ms: u32, 284 + count: u32, 285 + start_id: []const u8, 286 + ) ClientError!?StreamEntry { 287 + var block_buf: [16]u8 = undefined; 288 + var count_buf: [16]u8 = undefined; 289 + const block_str = std.fmt.bufPrint(&block_buf, "{d}", .{block_ms}) catch unreachable; 290 + const count_str = std.fmt.bufPrint(&count_buf, "{d}", .{count}) catch unreachable; 291 + 292 + const result = try self.client.sendCommand(&.{ 293 + "XREADGROUP", "GROUP", group, consumer, 294 + "BLOCK", block_str, "COUNT", count_str, 295 + "STREAMS", key, start_id, 296 + }); 297 + 298 + if (result.isNull()) return null; 299 + return self.parseStreamReadResult(result); 300 + } 301 + 302 + /// XRANGE stream start end [COUNT count] - get entries in ID range 303 + pub fn xrange(self: *StreamCommands, key: []const u8, start: []const u8, end: []const u8, count: ?u32) ClientError![]const StreamEntry { 304 + var count_buf: [16]u8 = undefined; 305 + const result = if (count) |c| blk: { 306 + const count_str = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 307 + break :blk try self.client.sendCommand(&.{ "XRANGE", key, start, end, "COUNT", count_str }); 308 + } else try self.client.sendCommand(&.{ "XRANGE", key, start, end }); 309 + 310 + return self.parseEntryArray(result); 311 + } 312 + 313 + /// XREVRANGE stream end start [COUNT count] - get entries in reverse order 314 + pub fn xrevrange(self: *StreamCommands, key: []const u8, end: []const u8, start: []const u8, count: ?u32) ClientError![]const StreamEntry { 315 + var count_buf: [16]u8 = undefined; 316 + const result = if (count) |c| blk: { 317 + const count_str = std.fmt.bufPrint(&count_buf, "{d}", .{c}) catch unreachable; 318 + break :blk try self.client.sendCommand(&.{ "XREVRANGE", key, end, start, "COUNT", count_str }); 319 + } else try self.client.sendCommand(&.{ "XREVRANGE", key, end, start }); 320 + 321 + return self.parseEntryArray(result); 322 + } 323 + 324 + // ======================================================================== 325 + // Acknowledgment 326 + // ======================================================================== 327 + 328 + /// XACK stream group id [id ...] - acknowledge messages 329 + /// Returns number of messages acknowledged. 330 + pub fn xack(self: *StreamCommands, key: []const u8, group: []const u8, ids: []const []const u8) ClientError!i64 { 331 + var args = try self.client.allocator.alloc([]const u8, ids.len + 3); 332 + defer self.client.allocator.free(args); 333 + args[0] = "XACK"; 334 + args[1] = key; 335 + args[2] = group; 336 + @memcpy(args[3..], ids); 337 + 338 + const result = try self.client.sendCommand(args); 339 + return switch (result) { 340 + .integer => |i| i, 341 + else => 0, 342 + }; 343 + } 344 + 345 + // ======================================================================== 346 + // Claiming / Recovery 347 + // ======================================================================== 348 + 349 + /// XAUTOCLAIM stream group consumer min-idle start [COUNT count] 350 + /// Automatically claim pending messages that have been idle too long. 351 + pub fn xautoclaim( 352 + self: *StreamCommands, 353 + key: []const u8, 354 + group: []const u8, 355 + consumer: []const u8, 356 + min_idle_ms: u32, 357 + start_id: []const u8, 358 + count: u32, 359 + ) ClientError!?AutoclaimResult { 360 + var idle_buf: [16]u8 = undefined; 361 + var count_buf: [16]u8 = undefined; 362 + const idle_str = std.fmt.bufPrint(&idle_buf, "{d}", .{min_idle_ms}) catch unreachable; 363 + const count_str = std.fmt.bufPrint(&count_buf, "{d}", .{count}) catch unreachable; 364 + 365 + const result = try self.client.sendCommand(&.{ 366 + "XAUTOCLAIM", key, group, consumer, 367 + idle_str, start_id, "COUNT", count_str, 368 + }); 369 + 370 + if (result.isError()) return CommandError.RedisError; 371 + return self.parseAutoclaimResult(result); 372 + } 373 + 374 + /// XCLAIM stream group consumer min-idle-time id [id ...] - claim specific messages 375 + pub fn xclaim( 376 + self: *StreamCommands, 377 + key: []const u8, 378 + group: []const u8, 379 + consumer: []const u8, 380 + min_idle_ms: u32, 381 + ids: []const []const u8, 382 + ) ClientError![]const StreamEntry { 383 + var args = try self.client.allocator.alloc([]const u8, ids.len + 5); 384 + defer self.client.allocator.free(args); 385 + 386 + var idle_buf: [16]u8 = undefined; 387 + args[0] = "XCLAIM"; 388 + args[1] = key; 389 + args[2] = group; 390 + args[3] = consumer; 391 + args[4] = std.fmt.bufPrint(&idle_buf, "{d}", .{min_idle_ms}) catch unreachable; 392 + @memcpy(args[5..], ids); 393 + 394 + const result = try self.client.sendCommand(args); 395 + return self.parseEntryArray(result); 396 + } 397 + 398 + // ======================================================================== 399 + // Pending 400 + // ======================================================================== 401 + 402 + /// XPENDING stream group - get pending summary 403 + pub fn xpendingSummary(self: *StreamCommands, key: []const u8, group: []const u8) ClientError!PendingSummary { 404 + const result = try self.client.sendCommand(&.{ "XPENDING", key, group }); 405 + 406 + const arr = switch (result) { 407 + .array => |a| a, 408 + else => return PendingSummary{ .count = 0, .min_id = null, .max_id = null, .consumers = &.{} }, 409 + }; 410 + 411 + if (arr.len < 4) return PendingSummary{ .count = 0, .min_id = null, .max_id = null, .consumers = &.{} }; 412 + 413 + const count = arr[0].asInt() orelse 0; 414 + const min_id = arr[1].asString(); 415 + const max_id = arr[2].asString(); 416 + 417 + // Parse consumer list 418 + const consumer_arr = arr[3].asArray() orelse &.{}; 419 + var consumers = try self.client.allocator.alloc(struct { name: []const u8, count: i64 }, consumer_arr.len); 420 + 421 + for (consumer_arr, 0..) |c, i| { 422 + const ca = c.asArray() orelse continue; 423 + if (ca.len >= 2) { 424 + consumers[i] = .{ 425 + .name = ca[0].asString() orelse "", 426 + .count = ca[1].asInt() orelse 0, 427 + }; 428 + } 429 + } 430 + 431 + return PendingSummary{ 432 + .count = count, 433 + .min_id = min_id, 434 + .max_id = max_id, 435 + .consumers = consumers, 436 + }; 437 + } 438 + 439 + // ======================================================================== 440 + // Info 441 + // ======================================================================== 442 + 443 + /// XLEN stream - get stream length 444 + pub fn xlen(self: *StreamCommands, key: []const u8) ClientError!i64 { 445 + const result = try self.client.sendCommand(&.{ "XLEN", key }); 446 + return switch (result) { 447 + .integer => |i| i, 448 + else => 0, 449 + }; 450 + } 451 + 452 + /// XINFO STREAM stream - get stream info 453 + pub fn xinfoStream(self: *StreamCommands, key: []const u8) ClientError![]const Value { 454 + const result = try self.client.sendCommand(&.{ "XINFO", "STREAM", key }); 455 + return switch (result) { 456 + .array => |a| a, 457 + else => &.{}, 458 + }; 459 + } 460 + 461 + /// XINFO GROUPS stream - get consumer groups info 462 + pub fn xinfoGroups(self: *StreamCommands, key: []const u8) ClientError![]const Value { 463 + const result = try self.client.sendCommand(&.{ "XINFO", "GROUPS", key }); 464 + return switch (result) { 465 + .array => |a| a, 466 + else => &.{}, 467 + }; 468 + } 469 + 470 + // ======================================================================== 471 + // Trimming 472 + // ======================================================================== 473 + 474 + /// XTRIM stream MAXLEN [~] count - trim stream to max length 475 + pub fn xtrim(self: *StreamCommands, key: []const u8, maxlen: usize, approximate: bool) ClientError!i64 { 476 + var buf: [24]u8 = undefined; 477 + const len_str = std.fmt.bufPrint(&buf, "{d}", .{maxlen}) catch unreachable; 478 + 479 + const result = if (approximate) 480 + try self.client.sendCommand(&.{ "XTRIM", key, "MAXLEN", "~", len_str }) 481 + else 482 + try self.client.sendCommand(&.{ "XTRIM", key, "MAXLEN", len_str }); 483 + 484 + return switch (result) { 485 + .integer => |i| i, 486 + else => 0, 487 + }; 488 + } 489 + 490 + /// XDEL stream id [id ...] - delete entries 491 + pub fn xdel(self: *StreamCommands, key: []const u8, ids: []const []const u8) ClientError!i64 { 492 + var args = try self.client.allocator.alloc([]const u8, ids.len + 2); 493 + defer self.client.allocator.free(args); 494 + args[0] = "XDEL"; 495 + args[1] = key; 496 + @memcpy(args[2..], ids); 497 + 498 + const result = try self.client.sendCommand(args); 499 + return switch (result) { 500 + .integer => |i| i, 501 + else => 0, 502 + }; 503 + } 504 + 505 + // ======================================================================== 506 + // Parsing Helpers 507 + // ======================================================================== 508 + 509 + fn parseStreamReadResult(self: *StreamCommands, result: Value) ClientError!?StreamEntry { 510 + // Format: [[stream_name, [[entry_id, [field, value, ...]], ...]]] 511 + const outer = switch (result) { 512 + .array => |a| a, 513 + else => return null, 514 + }; 515 + if (outer.len == 0) return null; 516 + 517 + // First stream: [name, entries] 518 + const stream_data = switch (outer[0]) { 519 + .array => |a| a, 520 + else => return null, 521 + }; 522 + if (stream_data.len < 2) return null; 523 + 524 + // Entries array 525 + const entries = switch (stream_data[1]) { 526 + .array => |a| a, 527 + else => return null, 528 + }; 529 + if (entries.len == 0) return null; 530 + 531 + return self.parseEntry(entries[0]); 532 + } 533 + 534 + fn parseEntry(self: *StreamCommands, entry_val: Value) ClientError!?StreamEntry { 535 + const entry_arr = switch (entry_val) { 536 + .array => |a| a, 537 + else => return null, 538 + }; 539 + if (entry_arr.len < 2) return null; 540 + 541 + // Entry ID 542 + const entry_id = switch (entry_arr[0]) { 543 + .bulk => |b| b orelse return null, 544 + else => return null, 545 + }; 546 + 547 + // Fields array 548 + const fields_arr = switch (entry_arr[1]) { 549 + .array => |a| a, 550 + else => return null, 551 + }; 552 + 553 + // Parse field-value pairs 554 + const field_count = fields_arr.len / 2; 555 + var fields = try self.client.allocator.alloc(StreamField, field_count); 556 + 557 + var i: usize = 0; 558 + while (i < fields_arr.len - 1) : (i += 2) { 559 + const field = switch (fields_arr[i]) { 560 + .bulk => |b| b orelse continue, 561 + else => continue, 562 + }; 563 + const value = switch (fields_arr[i + 1]) { 564 + .bulk => |b| b orelse continue, 565 + else => continue, 566 + }; 567 + fields[i / 2] = .{ .field = field, .value = value }; 568 + } 569 + 570 + return StreamEntry{ 571 + .id = entry_id, 572 + .fields = fields[0..field_count], 573 + }; 574 + } 575 + 576 + fn parseEntryArray(self: *StreamCommands, result: Value) ClientError![]const StreamEntry { 577 + const arr = switch (result) { 578 + .array => |a| a, 579 + else => return &.{}, 580 + }; 581 + 582 + var entries = try self.client.allocator.alloc(StreamEntry, arr.len); 583 + var count: usize = 0; 584 + 585 + for (arr) |entry_val| { 586 + if (try self.parseEntry(entry_val)) |entry| { 587 + entries[count] = entry; 588 + count += 1; 589 + } 590 + } 591 + 592 + return entries[0..count]; 593 + } 594 + 595 + fn parseAutoclaimResult(self: *StreamCommands, result: Value) ClientError!?AutoclaimResult { 596 + // Format: [next_id, [[id, [field, value]], ...], [deleted_ids]] 597 + const outer = switch (result) { 598 + .array => |a| a, 599 + else => return null, 600 + }; 601 + if (outer.len < 2) return null; 602 + 603 + // Next ID 604 + const next_id = switch (outer[0]) { 605 + .bulk => |b| b orelse "0-0", 606 + else => "0-0", 607 + }; 608 + 609 + // Entries array 610 + const entries_arr = switch (outer[1]) { 611 + .array => |a| a, 612 + else => return AutoclaimResult{ .next_id = next_id, .entries = &.{}, .deleted_ids = &.{} }, 613 + }; 614 + 615 + var entries = try self.client.allocator.alloc(StreamEntry, entries_arr.len); 616 + var count: usize = 0; 617 + 618 + for (entries_arr) |entry_val| { 619 + if (try self.parseEntry(entry_val)) |entry| { 620 + entries[count] = entry; 621 + count += 1; 622 + } 623 + } 624 + 625 + // Deleted IDs (Redis 7+) 626 + var deleted_ids: []const []const u8 = &.{}; 627 + if (outer.len >= 3) { 628 + if (outer[2].asArray()) |del_arr| { 629 + var ids = try self.client.allocator.alloc([]const u8, del_arr.len); 630 + var del_count: usize = 0; 631 + for (del_arr) |v| { 632 + if (v.asString()) |s| { 633 + ids[del_count] = s; 634 + del_count += 1; 635 + } 636 + } 637 + deleted_ids = ids[0..del_count]; 638 + } 639 + } 640 + 641 + return AutoclaimResult{ 642 + .next_id = next_id, 643 + .entries = entries[0..count], 644 + .deleted_ids = deleted_ids, 645 + }; 646 + } 647 + }; 648 + 649 + /// Extend Client with stream commands. 650 + pub fn streams(client: *Client) StreamCommands { 651 + return StreamCommands.init(client); 652 + }
+286
src/commands/strings.zig
··· 1 + //! Redis string commands 2 + //! 3 + //! Strings are the most basic Redis value type. Despite the name, they can hold 4 + //! any binary data up to 512MB. Common uses: 5 + //! - Caching (SET/GET with TTL) 6 + //! - Counters (INCR/DECR) 7 + //! - Bit operations (SETBIT/GETBIT) 8 + //! - Simple key-value storage 9 + //! 10 + //! ## Examples 11 + //! 12 + //! ```zig 13 + //! try client.set("name", "alice"); 14 + //! const name = try client.get("name"); // "alice" 15 + //! 16 + //! try client.setEx("session", "data", 3600); // expires in 1 hour 17 + //! 18 + //! try client.set("counter", "0"); 19 + //! const n = try client.incr("counter"); // 1 20 + //! const m = try client.incrBy("counter", 10); // 11 21 + //! ``` 22 + 23 + const std = @import("std"); 24 + const Client = @import("../client.zig").Client; 25 + const Value = @import("../resp.zig").Value; 26 + const CommandError = @import("../resp.zig").CommandError; 27 + const ClientError = @import("../resp.zig").ClientError; 28 + 29 + /// String command implementations. 30 + /// These are implemented as methods that take a Client pointer. 31 + pub const StringCommands = struct { 32 + client: *Client, 33 + 34 + pub fn init(client: *Client) StringCommands { 35 + return .{ .client = client }; 36 + } 37 + 38 + // ======================================================================== 39 + // Basic Operations 40 + // ======================================================================== 41 + 42 + /// GET key - retrieve string value 43 + /// Returns null if key doesn't exist. 44 + pub fn get(self: *StringCommands, key: []const u8) ClientError!?[]const u8 { 45 + const result = try self.client.sendCommand(&.{ "GET", key }); 46 + return switch (result) { 47 + .bulk => |b| b, 48 + .nil => null, 49 + .err => return CommandError.RedisError, 50 + else => null, 51 + }; 52 + } 53 + 54 + /// SET key value - store string value 55 + pub fn set(self: *StringCommands, key: []const u8, value: []const u8) ClientError!void { 56 + const result = try self.client.sendCommand(&.{ "SET", key, value }); 57 + if (result.isError()) return CommandError.RedisError; 58 + } 59 + 60 + /// SET key value NX - set only if key doesn't exist 61 + /// Returns true if set, false if key existed. 62 + pub fn setNx(self: *StringCommands, key: []const u8, value: []const u8) ClientError!bool { 63 + const result = try self.client.sendCommand(&.{ "SET", key, value, "NX" }); 64 + return switch (result) { 65 + .string => true, 66 + .nil => false, 67 + .err => return CommandError.RedisError, 68 + else => false, 69 + }; 70 + } 71 + 72 + /// SET key value XX - set only if key exists 73 + /// Returns true if set, false if key didn't exist. 74 + pub fn setXx(self: *StringCommands, key: []const u8, value: []const u8) ClientError!bool { 75 + const result = try self.client.sendCommand(&.{ "SET", key, value, "XX" }); 76 + return switch (result) { 77 + .string => true, 78 + .nil => false, 79 + .err => return CommandError.RedisError, 80 + else => false, 81 + }; 82 + } 83 + 84 + /// SET key value EX seconds - set with TTL in seconds 85 + pub fn setEx(self: *StringCommands, key: []const u8, value: []const u8, seconds: u32) ClientError!void { 86 + var buf: [16]u8 = undefined; 87 + const sec_str = std.fmt.bufPrint(&buf, "{d}", .{seconds}) catch unreachable; 88 + const result = try self.client.sendCommand(&.{ "SET", key, value, "EX", sec_str }); 89 + if (result.isError()) return CommandError.RedisError; 90 + } 91 + 92 + /// SET key value PX milliseconds - set with TTL in milliseconds 93 + pub fn setPx(self: *StringCommands, key: []const u8, value: []const u8, millis: u64) ClientError!void { 94 + var buf: [24]u8 = undefined; 95 + const ms_str = std.fmt.bufPrint(&buf, "{d}", .{millis}) catch unreachable; 96 + const result = try self.client.sendCommand(&.{ "SET", key, value, "PX", ms_str }); 97 + if (result.isError()) return CommandError.RedisError; 98 + } 99 + 100 + /// GETSET key value - set new value and return old value (deprecated, use GETEX) 101 + pub fn getSet(self: *StringCommands, key: []const u8, value: []const u8) ClientError!?[]const u8 { 102 + const result = try self.client.sendCommand(&.{ "GETSET", key, value }); 103 + return switch (result) { 104 + .bulk => |b| b, 105 + .nil => null, 106 + .err => return CommandError.RedisError, 107 + else => null, 108 + }; 109 + } 110 + 111 + /// MGET key [key ...] - get multiple values 112 + /// Returns array of values (null for missing keys). 113 + pub fn mget(self: *StringCommands, keys: []const []const u8) ClientError![]const Value { 114 + var args = try self.client.allocator.alloc([]const u8, keys.len + 1); 115 + defer self.client.allocator.free(args); 116 + args[0] = "MGET"; 117 + @memcpy(args[1..], keys); 118 + 119 + const result = try self.client.sendCommand(args); 120 + return switch (result) { 121 + .array => |a| a, 122 + else => &.{}, 123 + }; 124 + } 125 + 126 + /// MSET key value [key value ...] - set multiple key-value pairs atomically 127 + pub fn mset(self: *StringCommands, pairs: []const [2][]const u8) ClientError!void { 128 + const arg_count = 1 + pairs.len * 2; 129 + var args = try self.client.allocator.alloc([]const u8, arg_count); 130 + defer self.client.allocator.free(args); 131 + 132 + args[0] = "MSET"; 133 + for (pairs, 0..) |pair, i| { 134 + args[1 + i * 2] = pair[0]; 135 + args[1 + i * 2 + 1] = pair[1]; 136 + } 137 + 138 + const result = try self.client.sendCommand(args); 139 + if (result.isError()) return CommandError.RedisError; 140 + } 141 + 142 + /// MSETNX key value [key value ...] - set multiple only if none exist 143 + /// Returns true if all were set, false if any existed. 144 + pub fn msetNx(self: *StringCommands, pairs: []const [2][]const u8) ClientError!bool { 145 + const arg_count = 1 + pairs.len * 2; 146 + var args = try self.client.allocator.alloc([]const u8, arg_count); 147 + defer self.client.allocator.free(args); 148 + 149 + args[0] = "MSETNX"; 150 + for (pairs, 0..) |pair, i| { 151 + args[1 + i * 2] = pair[0]; 152 + args[1 + i * 2 + 1] = pair[1]; 153 + } 154 + 155 + const result = try self.client.sendCommand(args); 156 + return switch (result) { 157 + .integer => |i| i == 1, 158 + else => false, 159 + }; 160 + } 161 + 162 + // ======================================================================== 163 + // Numeric Operations 164 + // ======================================================================== 165 + 166 + /// INCR key - increment integer value by 1 167 + pub fn incr(self: *StringCommands, key: []const u8) ClientError!i64 { 168 + const result = try self.client.sendCommand(&.{ "INCR", key }); 169 + return switch (result) { 170 + .integer => |i| i, 171 + .err => return CommandError.WrongType, 172 + else => return CommandError.RedisError, 173 + }; 174 + } 175 + 176 + /// INCRBY key increment - increment by specific amount 177 + pub fn incrBy(self: *StringCommands, key: []const u8, increment: i64) ClientError!i64 { 178 + var buf: [24]u8 = undefined; 179 + const inc_str = std.fmt.bufPrint(&buf, "{d}", .{increment}) catch unreachable; 180 + const result = try self.client.sendCommand(&.{ "INCRBY", key, inc_str }); 181 + return switch (result) { 182 + .integer => |i| i, 183 + .err => return CommandError.WrongType, 184 + else => return CommandError.RedisError, 185 + }; 186 + } 187 + 188 + /// INCRBYFLOAT key increment - increment by float 189 + pub fn incrByFloat(self: *StringCommands, key: []const u8, increment: f64) ClientError!f64 { 190 + var buf: [32]u8 = undefined; 191 + const inc_str = std.fmt.bufPrint(&buf, "{d}", .{increment}) catch unreachable; 192 + const result = try self.client.sendCommand(&.{ "INCRBYFLOAT", key, inc_str }); 193 + return switch (result) { 194 + .bulk => |b| if (b) |s| std.fmt.parseFloat(f64, s) catch return CommandError.RedisError else return CommandError.RedisError, 195 + .err => return CommandError.WrongType, 196 + else => return CommandError.RedisError, 197 + }; 198 + } 199 + 200 + /// DECR key - decrement integer value by 1 201 + pub fn decr(self: *StringCommands, key: []const u8) ClientError!i64 { 202 + const result = try self.client.sendCommand(&.{ "DECR", key }); 203 + return switch (result) { 204 + .integer => |i| i, 205 + .err => return CommandError.WrongType, 206 + else => return CommandError.RedisError, 207 + }; 208 + } 209 + 210 + /// DECRBY key decrement - decrement by specific amount 211 + pub fn decrBy(self: *StringCommands, key: []const u8, decrement: i64) ClientError!i64 { 212 + var buf: [24]u8 = undefined; 213 + const dec_str = std.fmt.bufPrint(&buf, "{d}", .{decrement}) catch unreachable; 214 + const result = try self.client.sendCommand(&.{ "DECRBY", key, dec_str }); 215 + return switch (result) { 216 + .integer => |i| i, 217 + .err => return CommandError.WrongType, 218 + else => return CommandError.RedisError, 219 + }; 220 + } 221 + 222 + // ======================================================================== 223 + // String Manipulation 224 + // ======================================================================== 225 + 226 + /// APPEND key value - append to string 227 + /// Returns new length of string. 228 + pub fn append(self: *StringCommands, key: []const u8, value: []const u8) ClientError!i64 { 229 + const result = try self.client.sendCommand(&.{ "APPEND", key, value }); 230 + return switch (result) { 231 + .integer => |i| i, 232 + .err => return CommandError.WrongType, 233 + else => 0, 234 + }; 235 + } 236 + 237 + /// STRLEN key - get string length 238 + pub fn strlen(self: *StringCommands, key: []const u8) ClientError!i64 { 239 + const result = try self.client.sendCommand(&.{ "STRLEN", key }); 240 + return switch (result) { 241 + .integer => |i| i, 242 + else => 0, 243 + }; 244 + } 245 + 246 + /// GETRANGE key start end - get substring 247 + pub fn getRange(self: *StringCommands, key: []const u8, start: i64, end: i64) ClientError!?[]const u8 { 248 + var start_buf: [24]u8 = undefined; 249 + var end_buf: [24]u8 = undefined; 250 + const start_str = std.fmt.bufPrint(&start_buf, "{d}", .{start}) catch unreachable; 251 + const end_str = std.fmt.bufPrint(&end_buf, "{d}", .{end}) catch unreachable; 252 + 253 + const result = try self.client.sendCommand(&.{ "GETRANGE", key, start_str, end_str }); 254 + return switch (result) { 255 + .bulk => |b| b, 256 + else => null, 257 + }; 258 + } 259 + 260 + /// SETRANGE key offset value - overwrite part of string 261 + /// Returns new length of string. 262 + pub fn setRange(self: *StringCommands, key: []const u8, offset: usize, value: []const u8) ClientError!i64 { 263 + var buf: [24]u8 = undefined; 264 + const offset_str = std.fmt.bufPrint(&buf, "{d}", .{offset}) catch unreachable; 265 + const result = try self.client.sendCommand(&.{ "SETRANGE", key, offset_str, value }); 266 + return switch (result) { 267 + .integer => |i| i, 268 + .err => return CommandError.WrongType, 269 + else => 0, 270 + }; 271 + } 272 + }; 273 + 274 + // ============================================================================ 275 + // Client Extension Methods 276 + // ============================================================================ 277 + 278 + /// Extend Client with string commands. 279 + /// Usage: `try client.strings().get("key")` 280 + pub fn strings(client: *Client) StringCommands { 281 + return StringCommands.init(client); 282 + } 283 + 284 + // Direct convenience methods on Client would require modifying client.zig 285 + // For now, users can call: client.strings().get("key") 286 + // Or we can add these as pub fn in the main redis.zig module
+235
src/example.zig
··· 1 + //! Redis client usage examples 2 + //! 3 + //! Run with: zig build run 4 + //! Requires a Redis server running on localhost:6379 5 + 6 + const std = @import("std"); 7 + const redis = @import("redis"); 8 + 9 + pub fn main() !void { 10 + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; 11 + defer _ = gpa.deinit(); 12 + const allocator = gpa.allocator(); 13 + 14 + // Connect to Redis 15 + var client = redis.Client.connect(allocator, "localhost", 6379) catch |err| { 16 + std.debug.print("Failed to connect: {}\n", .{err}); 17 + return; 18 + }; 19 + defer client.close(); 20 + 21 + std.debug.print("Connected to Redis\n\n", .{}); 22 + 23 + // String operations 24 + stringExamples(&client); 25 + 26 + // Hash operations 27 + hashExamples(&client); 28 + 29 + // List operations 30 + listExamples(&client); 31 + 32 + // Set operations 33 + setExamples(&client); 34 + 35 + // Sorted set operations 36 + sortedSetExamples(&client); 37 + 38 + // Stream operations 39 + streamExamples(&client); 40 + 41 + std.debug.print("\nAll examples completed.\n", .{}); 42 + } 43 + 44 + fn stringExamples(client: *redis.Client) void { 45 + std.debug.print("=== String Operations ===\n", .{}); 46 + var str = client.strings(); 47 + 48 + // SET and GET 49 + str.set("greeting", "hello, redis!") catch return; 50 + if (str.get("greeting") catch null) |val| { 51 + std.debug.print("GET greeting: {s}\n", .{val}); 52 + } 53 + 54 + // INCR 55 + _ = str.set("counter", "0") catch return; 56 + const count = str.incr("counter") catch return; 57 + std.debug.print("INCR counter: {d}\n", .{count}); 58 + 59 + // MSET/MGET 60 + str.mset(&.{ 61 + .{ "key1", "value1" }, 62 + .{ "key2", "value2" }, 63 + }) catch return; 64 + const values = str.mget(&.{ "key1", "key2", "missing" }) catch return; 65 + std.debug.print("MGET: ", .{}); 66 + for (values) |v| { 67 + if (v.asString()) |s| { 68 + std.debug.print("{s} ", .{s}); 69 + } else { 70 + std.debug.print("(nil) ", .{}); 71 + } 72 + } 73 + std.debug.print("\n\n", .{}); 74 + } 75 + 76 + fn hashExamples(client: *redis.Client) void { 77 + std.debug.print("=== Hash Operations ===\n", .{}); 78 + var hash = client.hashes(); 79 + 80 + // HSET multiple fields 81 + _ = hash.hset("user:1", &.{ 82 + .{ "name", "alice" }, 83 + .{ "email", "alice@example.com" }, 84 + .{ "score", "100" }, 85 + }) catch return; 86 + 87 + // HGET single field 88 + if (hash.hget("user:1", "name") catch null) |name| { 89 + std.debug.print("HGET user:1 name: {s}\n", .{name}); 90 + } 91 + 92 + // HINCRBY 93 + const new_score = hash.hincrBy("user:1", "score", 50) catch return; 94 + std.debug.print("HINCRBY user:1 score 50: {d}\n", .{new_score}); 95 + 96 + // HGETALL 97 + const all = hash.hgetAll("user:1") catch return; 98 + std.debug.print("HGETALL user:1: ", .{}); 99 + var i: usize = 0; 100 + while (i + 1 < all.len) : (i += 2) { 101 + const field = all[i].asString() orelse continue; 102 + const value = all[i + 1].asString() orelse continue; 103 + std.debug.print("{s}={s} ", .{ field, value }); 104 + } 105 + std.debug.print("\n\n", .{}); 106 + } 107 + 108 + fn listExamples(client: *redis.Client) void { 109 + std.debug.print("=== List Operations ===\n", .{}); 110 + var list = client.lists(); 111 + 112 + // Clear and populate list 113 + _ = client.keys().del(&.{"tasks"}) catch {}; 114 + _ = list.rpush("tasks", &.{ "task1", "task2", "task3" }) catch return; 115 + 116 + // LRANGE 117 + const tasks = list.lrange("tasks", 0, -1) catch return; 118 + std.debug.print("LRANGE tasks 0 -1: ", .{}); 119 + for (tasks) |t| { 120 + if (t.asString()) |s| { 121 + std.debug.print("{s} ", .{s}); 122 + } 123 + } 124 + std.debug.print("\n", .{}); 125 + 126 + // LPOP 127 + if (list.lpop("tasks") catch null) |first| { 128 + std.debug.print("LPOP tasks: {s}\n", .{first}); 129 + } 130 + 131 + std.debug.print("\n", .{}); 132 + } 133 + 134 + fn setExamples(client: *redis.Client) void { 135 + std.debug.print("=== Set Operations ===\n", .{}); 136 + var s = client.sets(); 137 + 138 + // SADD 139 + _ = s.sadd("tags:post1", &.{ "redis", "database", "nosql" }) catch return; 140 + _ = s.sadd("tags:post2", &.{ "redis", "cache", "performance" }) catch return; 141 + 142 + // SMEMBERS 143 + const members = s.smembers("tags:post1") catch return; 144 + std.debug.print("SMEMBERS tags:post1: ", .{}); 145 + for (members) |m| { 146 + if (m.asString()) |str| { 147 + std.debug.print("{s} ", .{str}); 148 + } 149 + } 150 + std.debug.print("\n", .{}); 151 + 152 + // SINTER 153 + const common = s.sinter(&.{ "tags:post1", "tags:post2" }) catch return; 154 + std.debug.print("SINTER tags:post1 tags:post2: ", .{}); 155 + for (common) |c| { 156 + if (c.asString()) |str| { 157 + std.debug.print("{s} ", .{str}); 158 + } 159 + } 160 + std.debug.print("\n\n", .{}); 161 + } 162 + 163 + fn sortedSetExamples(client: *redis.Client) void { 164 + std.debug.print("=== Sorted Set Operations ===\n", .{}); 165 + var zset = client.sortedSets(); 166 + 167 + // Clear and add scores 168 + _ = client.keys().del(&.{"leaderboard"}) catch {}; 169 + _ = zset.zadd("leaderboard", &.{ 170 + .{ .score = 100, .member = "alice" }, 171 + .{ .score = 85, .member = "bob" }, 172 + .{ .score = 92, .member = "charlie" }, 173 + }, .{}) catch return; 174 + 175 + // ZRANGE with scores (top 3) 176 + const top = zset.zrangeWithScores("leaderboard", 0, -1, .{ .rev = true }) catch return; 177 + std.debug.print("Leaderboard (high to low):\n", .{}); 178 + for (top) |entry| { 179 + std.debug.print(" {s}: {d}\n", .{ entry.member, entry.score }); 180 + } 181 + 182 + // ZSCORE 183 + if (zset.zscore("leaderboard", "bob") catch null) |score| { 184 + std.debug.print("ZSCORE leaderboard bob: {d}\n", .{score}); 185 + } 186 + 187 + std.debug.print("\n", .{}); 188 + } 189 + 190 + fn streamExamples(client: *redis.Client) void { 191 + std.debug.print("=== Stream Operations ===\n", .{}); 192 + var stream = client.streams(); 193 + 194 + // Delete and recreate stream 195 + _ = client.keys().del(&.{"events"}) catch {}; 196 + 197 + // XADD 198 + const id1 = stream.xadd("events", .auto, &.{ 199 + .{ "type", "login" }, 200 + .{ "user", "alice" }, 201 + }) catch return; 202 + std.debug.print("XADD events: {s}\n", .{id1}); 203 + 204 + const id2 = stream.xadd("events", .auto, &.{ 205 + .{ "type", "purchase" }, 206 + .{ "user", "alice" }, 207 + .{ "amount", "99.99" }, 208 + }) catch return; 209 + std.debug.print("XADD events: {s}\n", .{id2}); 210 + 211 + // XLEN 212 + const len = stream.xlen("events") catch return; 213 + std.debug.print("XLEN events: {d}\n", .{len}); 214 + 215 + // XRANGE 216 + const entries = stream.xrange("events", "-", "+", null) catch return; 217 + std.debug.print("XRANGE events:\n", .{}); 218 + for (entries) |entry| { 219 + std.debug.print(" {s}: ", .{entry.id}); 220 + for (entry.fields) |field| { 221 + std.debug.print("{s}={s} ", .{ field.name, field.value }); 222 + } 223 + std.debug.print("\n", .{}); 224 + } 225 + 226 + // Consumer group example 227 + _ = stream.xgroupDestroy("events", "workers") catch {}; // cleanup 228 + stream.xgroupCreate("events", "workers", "0", true) catch |err| { 229 + std.debug.print("XGROUP CREATE error: {}\n", .{err}); 230 + return; 231 + }; 232 + std.debug.print("Created consumer group 'workers'\n", .{}); 233 + 234 + std.debug.print("\n", .{}); 235 + }
+126
src/redis.zig
··· 1 + //! Redis client for Zig 2 + //! 3 + //! A minimal Redis client implementing RESP (REdis Serialization Protocol). 4 + //! Supports strings, hashes, lists, sets, sorted sets, and streams. 5 + //! 6 + //! ## Design Philosophy 7 + //! 8 + //! - **Tagged unions for RESP values**: `Value = union(enum)` represents all Redis types 9 + //! - **Distinct error sets**: Network/protocol/command errors are categorized 10 + //! - **Buffer ownership**: Client owns read buffer; returned slices valid until next command 11 + //! - **Modular commands**: Each data type has its own command module 12 + //! 13 + //! ## Quick Start 14 + //! 15 + //! ```zig 16 + //! const redis = @import("redis"); 17 + //! 18 + //! var client = try redis.Client.connect(allocator, "localhost", 6379); 19 + //! defer client.close(); 20 + //! 21 + //! // String operations 22 + //! var str = client.strings(); 23 + //! try str.set("key", "value"); 24 + //! const val = try str.get("key"); 25 + //! 26 + //! // Stream operations 27 + //! var streams = client.streams(); 28 + //! const id = try streams.xadd("events", .auto, &.{.{"type", "login"}}); 29 + //! ``` 30 + //! 31 + //! ## Module Structure 32 + //! 33 + //! - `resp.zig`: RESP protocol types, parsing, error definitions 34 + //! - `client.zig`: Connection management, buffer handling, command execution 35 + //! - `commands/`: Data structure-specific command implementations 36 + //! - `strings.zig`: String operations (GET, SET, INCR, etc.) 37 + //! - `keys.zig`: Generic key operations (DEL, EXPIRE, TTL, etc.) 38 + //! - `hashes.zig`: Hash operations (HSET, HGET, HGETALL, etc.) 39 + //! - `lists.zig`: List operations (LPUSH, RPOP, LRANGE, etc.) 40 + //! - `sets.zig`: Set operations (SADD, SREM, SMEMBERS, etc.) 41 + //! - `sorted_sets.zig`: Sorted set operations (ZADD, ZRANGE, etc.) 42 + //! - `streams.zig`: Stream operations (XADD, XREAD, XREADGROUP, etc.) 43 + 44 + const std = @import("std"); 45 + 46 + // ============================================================================ 47 + // Core Types (re-exported from resp.zig) 48 + // ============================================================================ 49 + 50 + pub const resp = @import("resp.zig"); 51 + 52 + /// RESP value type - tagged union representing all Redis return types 53 + pub const Value = resp.Value; 54 + 55 + /// Errors during connection (network, auth) 56 + pub const ConnectionError = resp.ConnectionError; 57 + 58 + /// Errors in RESP parsing (malformed response) 59 + pub const ProtocolError = resp.ProtocolError; 60 + 61 + /// Errors from Redis commands (WRONGTYPE, etc.) 62 + pub const CommandError = resp.CommandError; 63 + 64 + /// Combined error set for all client operations 65 + pub const ClientError = resp.ClientError; 66 + 67 + /// RESP protocol parser 68 + pub const Parser = resp.Parser; 69 + 70 + /// RESP command builder 71 + pub const CommandBuilder = resp.CommandBuilder; 72 + 73 + // ============================================================================ 74 + // Client (re-exported from client.zig) 75 + // ============================================================================ 76 + 77 + pub const client_mod = @import("client.zig"); 78 + 79 + /// Redis client with connection and buffer management 80 + pub const Client = client_mod.Client; 81 + 82 + // ============================================================================ 83 + // Command Modules 84 + // ============================================================================ 85 + 86 + pub const strings = @import("commands/strings.zig"); 87 + pub const keys = @import("commands/keys.zig"); 88 + pub const hashes = @import("commands/hashes.zig"); 89 + pub const lists = @import("commands/lists.zig"); 90 + pub const sets = @import("commands/sets.zig"); 91 + pub const sorted_sets = @import("commands/sorted_sets.zig"); 92 + pub const streams = @import("commands/streams.zig"); 93 + 94 + // ============================================================================ 95 + // Stream Types (commonly used, re-exported for convenience) 96 + // ============================================================================ 97 + 98 + /// A field-value pair in a stream entry 99 + pub const StreamField = streams.StreamField; 100 + 101 + /// A single entry from a Redis stream 102 + pub const StreamEntry = streams.StreamEntry; 103 + 104 + /// Result from XAUTOCLAIM command 105 + pub const AutoclaimResult = streams.AutoclaimResult; 106 + 107 + /// Stream ID for XADD 108 + pub const StreamId = streams.StreamId; 109 + 110 + // ============================================================================ 111 + // Tests 112 + // ============================================================================ 113 + 114 + test { 115 + // Run tests from all submodules 116 + std.testing.refAllDecls(@This()); 117 + _ = resp; 118 + _ = client_mod; 119 + _ = strings; 120 + _ = keys; 121 + _ = hashes; 122 + _ = lists; 123 + _ = sets; 124 + _ = sorted_sets; 125 + _ = streams; 126 + }
+516
src/resp.zig
··· 1 + //! RESP (REdis Serialization Protocol) types and parsing 2 + //! 3 + //! RESP is Redis's wire protocol. This module provides: 4 + //! - `Value`: Tagged union representing all RESP types 5 + //! - Error sets categorized by failure origin 6 + //! - Parser for reading RESP from a byte stream 7 + //! 8 + //! ## Protocol Overview 9 + //! 10 + //! RESP uses a prefix byte to indicate type: 11 + //! - `+` Simple string: `+OK\r\n` 12 + //! - `-` Error: `-ERR message\r\n` 13 + //! - `:` Integer: `:1000\r\n` 14 + //! - `$` Bulk string: `$5\r\nhello\r\n` or `$-1\r\n` (null) 15 + //! - `*` Array: `*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n` 16 + //! 17 + //! ## Type System Notes 18 + //! 19 + //! The `Value` union demonstrates Zig's sum types. Unlike C enums with void pointers 20 + //! or C++ variants, Zig's tagged unions: 21 + //! - Are type-safe: the compiler tracks which variant is active 22 + //! - Require exhaustive matching: switch must handle all cases 23 + //! - Have zero overhead: same memory layout as C unions + tag 24 + //! 25 + //! Error sets are split by category so callers can handle failures appropriately: 26 + //! - `ConnectionError`: Network/auth issues, might retry with backoff 27 + //! - `ProtocolError`: Parsing failures, likely a bug or incompatibility 28 + //! - `CommandError`: Redis rejected the command, check your usage 29 + 30 + const std = @import("std"); 31 + 32 + // ============================================================================ 33 + // Error Types 34 + // ============================================================================ 35 + 36 + /// Errors during connection establishment. 37 + /// These indicate network or authentication problems. 38 + pub const ConnectionError = error{ 39 + /// DNS lookup failed or returned no addresses 40 + AddressResolutionFailed, 41 + /// TCP connection refused or timed out 42 + ConnectionRefused, 43 + /// AUTH command failed (wrong password/username) 44 + AuthenticationFailed, 45 + /// SELECT command failed (invalid database number) 46 + InvalidDatabase, 47 + }; 48 + 49 + /// Errors in RESP protocol parsing. 50 + /// These indicate wire-level issues or server bugs. 51 + pub const ProtocolError = error{ 52 + /// Response doesn't follow RESP format 53 + InvalidResponse, 54 + /// Connection closed mid-response 55 + ConnectionClosed, 56 + /// Response exceeds buffer capacity 57 + BufferOverflow, 58 + /// Read timeout (if configured) 59 + Timeout, 60 + }; 61 + 62 + /// Errors returned by Redis commands. 63 + /// These are application-level errors from Redis itself. 64 + pub const CommandError = error{ 65 + /// Generic Redis error (check error message) 66 + RedisError, 67 + /// Key doesn't exist when required 68 + KeyNotFound, 69 + /// Operation on wrong type (e.g., INCR on a list) 70 + WrongType, 71 + /// Command syntax error 72 + SyntaxError, 73 + /// Command not allowed (permissions, readonly replica, etc.) 74 + NotAllowed, 75 + }; 76 + 77 + /// Combined error set for all client operations. 78 + /// Use this for functions that might fail at any level. 79 + pub const ClientError = ConnectionError || ProtocolError || CommandError || std.mem.Allocator.Error || std.posix.ReadError || std.posix.WriteError; 80 + 81 + // ============================================================================ 82 + // RESP Value Type 83 + // ============================================================================ 84 + 85 + /// A Redis value as returned by commands. 86 + /// 87 + /// This tagged union represents all RESP types. The tag field indicates 88 + /// which variant is active, and Zig's switch ensures exhaustive handling. 89 + /// 90 + /// ## Memory Ownership 91 + /// 92 + /// String slices reference the client's read buffer and are valid only 93 + /// until the next command. Copy data if you need to retain it. 94 + /// 95 + /// Array elements are heap-allocated and must be freed by the caller 96 + /// (the client provides a `freeValue` method for this). 97 + pub const Value = union(enum) { 98 + /// Simple string (status reply like "OK", "PONG", "QUEUED") 99 + /// These are always short and ASCII-safe. 100 + string: []const u8, 101 + 102 + /// Error message from Redis (e.g., "ERR unknown command") 103 + /// The message includes the error type prefix. 104 + err: []const u8, 105 + 106 + /// 64-bit signed integer 107 + integer: i64, 108 + 109 + /// Bulk string (binary-safe, may be null) 110 + /// Null is represented as `bulk = null`. 111 + bulk: ?[]const u8, 112 + 113 + /// Array of values (recursive, may be nested) 114 + /// Empty array is `array = &.{}`. 115 + array: []const Value, 116 + 117 + /// Explicit null (RESP3, or null array/bulk in RESP2) 118 + nil, 119 + 120 + // ======================================================================== 121 + // Convenience Methods 122 + // ======================================================================== 123 + 124 + /// Check if this value represents a Redis error. 125 + pub fn isError(self: Value) bool { 126 + return self == .err; 127 + } 128 + 129 + /// Check if this value is null/nil. 130 + /// Handles both explicit nil and null bulk strings. 131 + pub fn isNull(self: Value) bool { 132 + return switch (self) { 133 + .nil => true, 134 + .bulk => |b| b == null, 135 + else => false, 136 + }; 137 + } 138 + 139 + /// Extract string content from string, bulk, or error values. 140 + /// Returns null for other types. 141 + pub fn asString(self: Value) ?[]const u8 { 142 + return switch (self) { 143 + .string => |s| s, 144 + .bulk => |b| b, 145 + .err => |e| e, 146 + else => null, 147 + }; 148 + } 149 + 150 + /// Extract integer value. 151 + /// Returns null for non-integer types. 152 + pub fn asInt(self: Value) ?i64 { 153 + return switch (self) { 154 + .integer => |i| i, 155 + else => null, 156 + }; 157 + } 158 + 159 + /// Extract array contents. 160 + /// Returns null for non-array types, empty slice for nil. 161 + pub fn asArray(self: Value) ?[]const Value { 162 + return switch (self) { 163 + .array => |a| a, 164 + .nil => &.{}, 165 + else => null, 166 + }; 167 + } 168 + 169 + /// Try to interpret as a boolean. 170 + /// Integer 1 = true, 0 = false. "OK" = true. 171 + pub fn asBool(self: Value) ?bool { 172 + return switch (self) { 173 + .integer => |i| i != 0, 174 + .string => |s| std.mem.eql(u8, s, "OK"), 175 + else => null, 176 + }; 177 + } 178 + 179 + /// Format value for debugging/logging 180 + pub fn format( 181 + self: Value, 182 + comptime fmt: []const u8, 183 + options: std.fmt.FormatOptions, 184 + writer: anytype, 185 + ) !void { 186 + _ = fmt; 187 + _ = options; 188 + switch (self) { 189 + .string => |s| try writer.print("+{s}", .{s}), 190 + .err => |e| try writer.print("-{s}", .{e}), 191 + .integer => |i| try writer.print(":{d}", .{i}), 192 + .bulk => |b| if (b) |s| { 193 + try writer.print("${d}:{s}", .{ s.len, s }); 194 + } else { 195 + try writer.writeAll("$nil"); 196 + }, 197 + .array => |a| { 198 + try writer.print("*{d}[", .{a.len}); 199 + for (a, 0..) |v, i| { 200 + if (i > 0) try writer.writeAll(", "); 201 + try v.format("", .{}, writer); 202 + } 203 + try writer.writeAll("]"); 204 + }, 205 + .nil => try writer.writeAll("(nil)"), 206 + } 207 + } 208 + }; 209 + 210 + // ============================================================================ 211 + // RESP Parser 212 + // ============================================================================ 213 + 214 + /// Stateful parser for reading RESP values from a buffer. 215 + /// 216 + /// The parser maintains position within a buffer and can parse values 217 + /// incrementally. It handles fragmented reads by tracking how much 218 + /// data is available. 219 + /// 220 + /// ## Usage 221 + /// 222 + /// ```zig 223 + /// var parser = Parser.init(allocator, buffer[0..len]); 224 + /// const value = try parser.parseValue(); 225 + /// ``` 226 + pub const Parser = struct { 227 + const Self = @This(); 228 + 229 + allocator: std.mem.Allocator, 230 + buffer: []const u8, 231 + pos: usize, 232 + 233 + pub fn init(allocator: std.mem.Allocator, buffer: []const u8) Self { 234 + return .{ 235 + .allocator = allocator, 236 + .buffer = buffer, 237 + .pos = 0, 238 + }; 239 + } 240 + 241 + /// Parse a single RESP value from the buffer. 242 + /// Advances position past the parsed value. 243 + pub fn parseValue(self: *Self) ProtocolError!Value { 244 + if (self.pos >= self.buffer.len) return ProtocolError.InvalidResponse; 245 + 246 + const type_char = self.buffer[self.pos]; 247 + self.pos += 1; 248 + 249 + return switch (type_char) { 250 + '+' => .{ .string = try self.readLine() }, 251 + '-' => .{ .err = try self.readLine() }, 252 + ':' => .{ .integer = try self.readInt() }, 253 + '$' => try self.readBulk(), 254 + '*' => try self.readArray(), 255 + else => ProtocolError.InvalidResponse, 256 + }; 257 + } 258 + 259 + /// Read until \r\n, returning content without the terminator. 260 + fn readLine(self: *Self) ProtocolError![]const u8 { 261 + const start = self.pos; 262 + while (self.pos + 1 < self.buffer.len) { 263 + if (self.buffer[self.pos] == '\r' and self.buffer[self.pos + 1] == '\n') { 264 + const line = self.buffer[start..self.pos]; 265 + self.pos += 2; 266 + return line; 267 + } 268 + self.pos += 1; 269 + } 270 + return ProtocolError.InvalidResponse; 271 + } 272 + 273 + /// Read an integer terminated by \r\n. 274 + fn readInt(self: *Self) ProtocolError!i64 { 275 + const line = try self.readLine(); 276 + return std.fmt.parseInt(i64, line, 10) catch ProtocolError.InvalidResponse; 277 + } 278 + 279 + /// Read a bulk string (or null). 280 + fn readBulk(self: *Self) ProtocolError!Value { 281 + const len = try self.readInt(); 282 + if (len < 0) return .nil; 283 + 284 + const ulen: usize = @intCast(len); 285 + if (self.pos + ulen + 2 > self.buffer.len) return ProtocolError.InvalidResponse; 286 + 287 + const data = self.buffer[self.pos..][0..ulen]; 288 + self.pos += ulen + 2; // skip data + \r\n 289 + return .{ .bulk = data }; 290 + } 291 + 292 + /// Read an array of values (recursive). 293 + fn readArray(self: *Self) ProtocolError!Value { 294 + const len = try self.readInt(); 295 + if (len < 0) return .nil; 296 + if (len == 0) return .{ .array = &.{} }; 297 + 298 + const ulen: usize = @intCast(len); 299 + const values = self.allocator.alloc(Value, ulen) catch return ProtocolError.BufferOverflow; 300 + errdefer self.allocator.free(values); 301 + 302 + for (0..ulen) |i| { 303 + values[i] = try self.parseValue(); 304 + } 305 + 306 + return .{ .array = values }; 307 + } 308 + 309 + /// Check if there's more data to parse. 310 + pub fn hasMore(self: *const Self) bool { 311 + return self.pos < self.buffer.len; 312 + } 313 + 314 + /// Get remaining unparsed bytes. 315 + pub fn remaining(self: *const Self) []const u8 { 316 + return self.buffer[self.pos..]; 317 + } 318 + }; 319 + 320 + // ============================================================================ 321 + // Command Builder 322 + // ============================================================================ 323 + 324 + /// Builds a RESP array command in a buffer. 325 + /// 326 + /// RESP commands are arrays of bulk strings: 327 + /// ``` 328 + /// *3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n 329 + /// ``` 330 + /// 331 + /// This builder writes directly to a buffer without allocation 332 + /// for most commands. 333 + pub const CommandBuilder = struct { 334 + const Self = @This(); 335 + 336 + buffer: []u8, 337 + pos: usize = 0, 338 + 339 + pub fn init(buffer: []u8) Self { 340 + return .{ .buffer = buffer }; 341 + } 342 + 343 + /// Start a command with the given argument count. 344 + pub fn begin(self: *Self, arg_count: usize) ProtocolError!void { 345 + const written = std.fmt.bufPrint(self.buffer[self.pos..], "*{d}\r\n", .{arg_count}) catch { 346 + return ProtocolError.BufferOverflow; 347 + }; 348 + self.pos += written.len; 349 + } 350 + 351 + /// Add a bulk string argument. 352 + pub fn arg(self: *Self, value: []const u8) ProtocolError!void { 353 + const header = std.fmt.bufPrint(self.buffer[self.pos..], "${d}\r\n", .{value.len}) catch { 354 + return ProtocolError.BufferOverflow; 355 + }; 356 + self.pos += header.len; 357 + 358 + if (self.pos + value.len + 2 > self.buffer.len) return ProtocolError.BufferOverflow; 359 + 360 + @memcpy(self.buffer[self.pos..][0..value.len], value); 361 + self.pos += value.len; 362 + self.buffer[self.pos] = '\r'; 363 + self.buffer[self.pos + 1] = '\n'; 364 + self.pos += 2; 365 + } 366 + 367 + /// Add an integer argument (formatted as string). 368 + pub fn argInt(self: *Self, value: anytype) ProtocolError!void { 369 + var buf: [24]u8 = undefined; 370 + const str = std.fmt.bufPrint(&buf, "{d}", .{value}) catch unreachable; 371 + return self.arg(str); 372 + } 373 + 374 + /// Get the built command. 375 + pub fn getCommand(self: *const Self) []const u8 { 376 + return self.buffer[0..self.pos]; 377 + } 378 + }; 379 + 380 + // ============================================================================ 381 + // Tests 382 + // ============================================================================ 383 + 384 + test "Value type properties" { 385 + const testing = std.testing; 386 + 387 + const string_val = Value{ .string = "OK" }; 388 + try testing.expect(!string_val.isNull()); 389 + try testing.expect(!string_val.isError()); 390 + try testing.expectEqualStrings("OK", string_val.asString().?); 391 + try testing.expect(string_val.asBool().?); 392 + 393 + const err_val = Value{ .err = "ERR unknown command" }; 394 + try testing.expect(err_val.isError()); 395 + try testing.expect(!err_val.isNull()); 396 + 397 + const nil_val: Value = .nil; 398 + try testing.expect(nil_val.isNull()); 399 + try testing.expect(!nil_val.isError()); 400 + try testing.expect(nil_val.asString() == null); 401 + 402 + const bulk_nil = Value{ .bulk = null }; 403 + try testing.expect(bulk_nil.isNull()); 404 + 405 + const int_val = Value{ .integer = 42 }; 406 + try testing.expectEqual(@as(i64, 42), int_val.asInt().?); 407 + try testing.expect(int_val.asBool().?); 408 + 409 + const zero_val = Value{ .integer = 0 }; 410 + try testing.expect(!zero_val.asBool().?); 411 + } 412 + 413 + test "Parser: simple string" { 414 + const data = "+OK\r\n"; 415 + var parser = Parser.init(std.testing.allocator, data); 416 + const value = try parser.parseValue(); 417 + try std.testing.expectEqualStrings("OK", value.asString().?); 418 + } 419 + 420 + test "Parser: error" { 421 + const data = "-ERR unknown command\r\n"; 422 + var parser = Parser.init(std.testing.allocator, data); 423 + const value = try parser.parseValue(); 424 + try std.testing.expect(value.isError()); 425 + try std.testing.expectEqualStrings("ERR unknown command", value.asString().?); 426 + } 427 + 428 + test "Parser: integer" { 429 + const data = ":1000\r\n"; 430 + var parser = Parser.init(std.testing.allocator, data); 431 + const value = try parser.parseValue(); 432 + try std.testing.expectEqual(@as(i64, 1000), value.asInt().?); 433 + } 434 + 435 + test "Parser: negative integer" { 436 + const data = ":-42\r\n"; 437 + var parser = Parser.init(std.testing.allocator, data); 438 + const value = try parser.parseValue(); 439 + try std.testing.expectEqual(@as(i64, -42), value.asInt().?); 440 + } 441 + 442 + test "Parser: bulk string" { 443 + const data = "$5\r\nhello\r\n"; 444 + var parser = Parser.init(std.testing.allocator, data); 445 + const value = try parser.parseValue(); 446 + try std.testing.expectEqualStrings("hello", value.asString().?); 447 + } 448 + 449 + test "Parser: null bulk" { 450 + const data = "$-1\r\n"; 451 + var parser = Parser.init(std.testing.allocator, data); 452 + const value = try parser.parseValue(); 453 + try std.testing.expect(value.isNull()); 454 + } 455 + 456 + test "Parser: array" { 457 + const data = "*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n"; 458 + var parser = Parser.init(std.testing.allocator, data); 459 + const value = try parser.parseValue(); 460 + defer std.testing.allocator.free(value.array); 461 + 462 + try std.testing.expectEqual(@as(usize, 2), value.array.len); 463 + try std.testing.expectEqualStrings("foo", value.array[0].asString().?); 464 + try std.testing.expectEqualStrings("bar", value.array[1].asString().?); 465 + } 466 + 467 + test "Parser: empty array" { 468 + const data = "*0\r\n"; 469 + var parser = Parser.init(std.testing.allocator, data); 470 + const value = try parser.parseValue(); 471 + try std.testing.expectEqual(@as(usize, 0), value.asArray().?.len); 472 + } 473 + 474 + test "Parser: null array" { 475 + const data = "*-1\r\n"; 476 + var parser = Parser.init(std.testing.allocator, data); 477 + const value = try parser.parseValue(); 478 + try std.testing.expect(value.isNull()); 479 + } 480 + 481 + test "CommandBuilder: simple command" { 482 + var buf: [256]u8 = undefined; 483 + var builder = CommandBuilder.init(&buf); 484 + 485 + try builder.begin(3); 486 + try builder.arg("SET"); 487 + try builder.arg("key"); 488 + try builder.arg("value"); 489 + 490 + const expected = "*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"; 491 + try std.testing.expectEqualStrings(expected, builder.getCommand()); 492 + } 493 + 494 + test "CommandBuilder: with integer" { 495 + var buf: [256]u8 = undefined; 496 + var builder = CommandBuilder.init(&buf); 497 + 498 + try builder.begin(3); 499 + try builder.arg("EXPIRE"); 500 + try builder.arg("key"); 501 + try builder.argInt(3600); 502 + 503 + const expected = "*3\r\n$6\r\nEXPIRE\r\n$3\r\nkey\r\n$4\r\n3600\r\n"; 504 + try std.testing.expectEqualStrings(expected, builder.getCommand()); 505 + } 506 + 507 + test "error set categories" { 508 + // Verify error sets are distinct 509 + const conn_err: ConnectionError = ConnectionError.AuthenticationFailed; 510 + const proto_err: ProtocolError = ProtocolError.InvalidResponse; 511 + const cmd_err: CommandError = CommandError.WrongType; 512 + 513 + // All can be caught as ClientError 514 + const all: [3]ClientError = .{ conn_err, proto_err, cmd_err }; 515 + try std.testing.expectEqual(@as(usize, 3), all.len); 516 + }