diff --git a/Makefile b/Makefile index a8099cf..ecc178b 100644 --- a/Makefile +++ b/Makefile @@ -8,4 +8,4 @@ run: make build && docker-compose up --build test: - go clean -testcache && go test ./pkg/... -coverprofile coverage/coverage.out + go clean -testcache && go test ./... -coverprofile coverage/coverage.out diff --git a/coverage/coverage.out b/coverage/coverage.out index 59648fc..c85f3d7 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -94,80 +94,80 @@ github.com/echovault/echovault/pkg/echovault/api_admin.go:66.2,66.41 1 0 github.com/echovault/echovault/pkg/echovault/api_admin.go:69.55,71.16 2 0 github.com/echovault/echovault/pkg/echovault/api_admin.go:71.16,73.3 1 0 github.com/echovault/echovault/pkg/echovault/api_admin.go:74.2,74.40 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:47.85,50.9 2 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:51.18,52.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:53.18,54.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:57.2,57.9 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:58.23,59.65 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:60.23,61.65 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:62.25,63.69 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:64.25,65.69 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:68.2,68.17 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:68.17,70.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:72.2,73.16 2 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:73.16,75.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:77.2,77.40 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:80.74,83.28 2 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:83.28,85.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:87.2,88.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:47.85,50.9 2 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:51.18,52.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:53.18,54.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:57.2,57.9 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:58.23,59.65 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:60.23,61.65 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:62.25,63.69 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:64.25,65.69 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:68.2,68.17 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:68.17,70.3 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:72.2,73.16 2 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:73.16,75.3 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:77.2,77.40 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:80.74,83.28 2 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:83.28,85.3 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:87.2,88.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:88.16,90.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:92.2,92.40 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:95.58,97.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:92.2,92.40 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:95.58,97.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:97.16,99.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:100.2,100.40 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:103.65,105.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:100.2,100.40 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:103.65,105.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:105.16,107.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:108.2,108.45 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:111.59,113.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:108.2,108.45 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:111.59,113.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:113.16,115.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:116.2,116.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:119.59,121.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:116.2,116.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:119.59,121.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:121.16,123.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:124.2,124.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:127.62,129.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:124.2,124.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:127.62,129.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:129.16,131.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:132.2,132.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:135.63,137.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:132.2,132.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:135.63,137.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:137.16,139.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:140.2,140.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:143.55,145.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:140.2,140.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:143.55,145.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:145.16,147.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:148.2,148.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:151.56,153.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:148.2,148.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:151.56,153.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:153.16,155.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:156.2,156.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:159.94,162.9 2 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:163.18,164.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:165.18,166.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:167.18,168.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:169.18,170.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:173.2,174.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:156.2,156.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:159.94,162.9 2 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:163.18,164.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:165.18,166.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:167.18,168.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:169.18,170.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:173.2,174.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:174.16,176.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:178.2,178.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:181.101,184.9 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:178.2,178.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:181.101,184.9 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:185.18,186.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:187.18,188.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:189.18,190.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:191.18,192.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:195.2,196.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:195.2,196.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:196.16,198.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:200.2,200.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:203.102,206.9 2 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:207.18,208.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:209.18,210.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:211.18,212.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:213.18,214.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:217.2,218.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:200.2,200.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:203.102,206.9 2 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:207.18,208.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:209.18,210.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:211.18,212.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:213.18,214.26 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:217.2,218.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:218.16,220.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:222.2,222.41 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:225.109,228.9 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:222.2,222.41 1 1 +github.com/echovault/echovault/pkg/echovault/api_generic.go:225.109,228.9 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:229.18,230.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:231.18,232.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:233.18,234.26 1 0 github.com/echovault/echovault/pkg/echovault/api_generic.go:235.18,236.26 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:239.2,240.16 2 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:239.2,240.16 2 1 github.com/echovault/echovault/pkg/echovault/api_generic.go:240.16,242.3 1 0 -github.com/echovault/echovault/pkg/echovault/api_generic.go:244.2,244.41 1 0 +github.com/echovault/echovault/pkg/echovault/api_generic.go:244.2,244.41 1 1 github.com/echovault/echovault/pkg/echovault/api_hash.go:27.91,30.36 2 1 github.com/echovault/echovault/pkg/echovault/api_hash.go:30.36,32.3 1 1 github.com/echovault/echovault/pkg/echovault/api_hash.go:34.2,35.16 2 1 @@ -710,7 +710,7 @@ github.com/echovault/echovault/pkg/echovault/keyspace.go:37.34,40.3 2 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:42.2,42.6 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:42.6,43.10 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:44.11,45.35 1 1 -github.com/echovault/echovault/pkg/echovault/keyspace.go:45.35,47.5 1 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:45.35,47.5 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:48.4,49.10 2 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:49.10,51.5 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:52.21,53.36 1 0 @@ -755,28 +755,28 @@ github.com/echovault/echovault/pkg/echovault/keyspace.go:179.16,181.3 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:183.2,183.27 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:183.27,185.3 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:187.2,187.12 1 1 -github.com/echovault/echovault/pkg/echovault/keyspace.go:192.79,193.58 1 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:192.79,193.58 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:193.58,195.3 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:196.2,196.35 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:205.101,213.55 3 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:213.55,215.3 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:216.2,219.11 2 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:219.11,221.17 2 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:196.2,196.35 1 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:205.101,213.55 3 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:213.55,215.3 1 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:216.2,219.11 2 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:219.11,221.17 2 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:221.17,223.4 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:229.51,238.97 4 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:238.97,240.3 1 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:229.51,238.97 4 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:238.97,240.3 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:248.60,250.6 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:250.6,251.83 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:251.83,253.9 2 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:256.2,257.33 2 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:257.33,259.3 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:260.2,261.13 2 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:265.75,266.52 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:266.52,268.3 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:271.2,278.9 4 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:265.75,266.52 1 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:266.52,268.3 1 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:271.2,278.9 4 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:279.108,280.36 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:281.108,282.36 1 0 -github.com/echovault/echovault/pkg/echovault/keyspace.go:285.2,287.12 2 0 +github.com/echovault/echovault/pkg/echovault/keyspace.go:285.2,287.12 2 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:292.82,294.83 1 1 github.com/echovault/echovault/pkg/echovault/keyspace.go:294.83,296.3 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:298.2,298.34 1 1 @@ -869,6 +869,7 @@ github.com/echovault/echovault/pkg/echovault/keyspace.go:557.2,560.58 2 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:560.58,564.3 2 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:566.2,566.12 1 0 github.com/echovault/echovault/pkg/echovault/keyspace.go:569.68,573.2 3 1 +github.com/echovault/echovault/pkg/echovault/keyspace.go:575.74,580.2 4 1 github.com/echovault/echovault/pkg/echovault/modules.go:28.59,30.2 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:32.47,34.2 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:36.50,38.2 1 0 @@ -902,210 +903,131 @@ github.com/echovault/echovault/pkg/echovault/modules.go:108.3,108.18 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:112.2,112.34 1 0 github.com/echovault/echovault/pkg/echovault/modules.go:112.34,115.3 2 0 github.com/echovault/echovault/pkg/echovault/modules.go:117.2,117.72 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:34.108,35.34 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:35.34,37.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:38.2,39.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:39.9,41.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:42.2,42.67 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:42.67,44.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:45.2,45.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:48.106,49.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:49.19,51.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:53.2,54.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:54.9,56.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:58.2,60.30 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:60.30,61.27 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:61.27,64.9 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:68.2,68.16 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:68.16,70.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:73.2,77.18 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:77.18,79.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:79.8,81.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:82.2,82.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:82.21,84.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:85.2,85.17 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:85.17,87.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:89.2,90.29 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:90.29,92.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:95.2,96.51 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:96.51,97.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:97.22,99.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:101.3,101.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:103.2,103.51 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:103.51,104.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:104.22,106.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:108.3,108.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:112.2,113.48 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:113.48,114.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:114.21,116.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:118.3,118.47 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:120.2,120.48 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:120.48,121.21 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:121.21,123.12 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:125.3,125.47 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:129.2,130.79 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:130.79,131.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:131.37,133.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:135.2,136.30 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:136.30,137.10 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:138.100,140.53 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:141.53,143.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:144.52,146.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:151.2,153.54 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:153.54,155.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:156.2,156.54 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:156.54,158.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:160.2,162.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:165.102,166.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:166.18,168.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:170.2,174.35 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:174.35,175.36 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:175.36,176.48 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:176.48,178.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:179.4,179.12 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:181.3,181.50 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:181.50,182.51 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:182.51,185.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:189.2,189.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:189.19,192.34 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:192.34,195.4 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:196.3,197.28 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:197.28,199.24 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:199.24,201.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:203.3,203.26 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:206.2,206.19 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:206.19,208.46 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:208.46,209.43 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:209.43,211.38 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:211.38,213.30 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:213.30,215.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:217.5,217.28 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:222.2,222.74 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:225.102,227.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:227.9,229.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:230.2,231.33 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:231.33,233.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:234.2,235.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:238.106,240.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:240.9,242.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:243.2,243.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:243.45,245.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:246.2,246.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:249.108,250.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:250.18,252.3 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:253.2,254.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:254.9,256.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:257.2,257.53 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:257.53,259.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:260.2,260.42 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:263.106,265.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:265.9,267.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:268.2,269.74 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:272.103,273.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:273.18,275.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:276.2,277.9 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:277.9,279.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:280.2,282.33 3 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:282.33,285.19 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:285.19,287.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:287.9,289.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:291.3,291.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:291.22,293.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:295.3,295.18 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:295.18,297.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:299.3,299.43 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:299.43,300.61 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:300.61,302.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:303.4,303.58 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:303.58,305.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:308.3,308.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:308.52,309.23 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:309.23,311.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:313.4,313.39 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:316.3,316.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:316.52,317.23 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:317.23,319.13 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:321.4,321.39 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:324.3,324.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:324.49,325.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:325.22,327.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:329.4,329.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:332.3,332.49 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:332.49,333.22 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:333.22,335.13 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:337.4,337.37 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:340.3,340.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:340.45,341.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:341.52,343.13 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:345.4,345.41 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:348.3,348.45 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:348.45,349.52 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:349.52,351.5 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:354.3,354.55 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:354.55,356.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:358.3,358.55 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:358.55,360.4 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:361.3,361.54 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:364.2,365.25 2 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:368.103,369.19 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:369.19,371.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:373.2,374.9 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:374.9,376.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:378.2,382.16 4 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:382.16,384.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:386.2,386.15 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:386.15,387.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:387.35,389.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:392.2,396.20 3 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:396.20,397.59 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:397.59,399.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:402.2,402.37 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:402.37,403.59 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:403.59,405.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:409.2,409.29 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:409.29,413.31 3 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:413.31,414.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:414.35,417.43 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:417.43,419.6 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:419.11,422.6 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:423.5,423.10 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:427.3,427.17 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:427.17,429.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:432.2,432.42 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:435.103,436.18 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:436.18,438.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:440.2,441.9 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:441.9,443.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:445.2,449.16 4 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:449.16,451.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:453.2,453.15 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:453.15,454.35 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:454.35,456.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:459.2,461.20 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:461.20,464.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:464.17,466.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:467.3,468.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:468.17,470.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:473.2,473.37 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:473.37,476.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:476.17,478.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:479.3,480.17 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:480.17,482.4 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:485.2,486.16 2 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:486.16,488.3 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:490.2,490.42 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:493.33,501.60 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:501.60,503.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:512.60,514.5 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:523.62,525.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:534.62,536.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:545.62,547.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:556.62,558.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:567.62,569.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:578.62,580.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:589.62,591.7 1 1 -github.com/echovault/echovault/pkg/modules/acl/commands.go:603.62,605.7 1 0 -github.com/echovault/echovault/pkg/modules/acl/commands.go:614.62,616.7 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:29.115,35.29 4 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:35.29,36.54 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:36.54,42.42 4 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:42.42,44.5 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:46.4,49.12 3 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:52.3,52.36 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:52.36,59.43 5 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:59.43,61.5 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:63.4,65.21 2 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:69.2,71.25 2 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:74.109,78.35 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:78.35,79.65 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:79.65,80.41 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:80.41,82.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:83.4,83.12 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:85.3,85.13 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:88.2,88.51 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:91.110,92.18 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:93.9,98.36 4 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:98.36,99.66 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:99.66,100.52 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:100.52,104.6 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:105.5,105.13 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:107.4,108.14 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:110.3,111.26 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:113.9,117.45 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:117.45,119.4 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:120.3,120.42 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:120.42,124.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:124.37,125.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:125.67,126.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:126.53,127.59 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:127.59,131.8 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:133.6,133.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:135.5,135.54 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:135.54,138.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:140.9,140.50 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:140.50,144.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:144.37,145.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:145.67,146.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:146.53,148.24 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:148.24,151.8 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:153.6,153.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:155.5,155.33 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:155.33,158.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:160.9,160.49 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:160.49,164.37 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:164.37,165.67 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:165.67,166.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:166.53,167.55 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:167.55,171.8 3 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:173.6,173.14 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:175.5,175.50 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:175.50,178.6 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:180.9,182.4 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:183.3,184.26 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:185.10,186.54 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:190.103,192.2 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:194.33,202.60 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:202.60,202.86 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:211.60,213.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:221.62,221.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:230.62,230.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:240.62,240.88 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:251.60,253.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:254.113,255.49 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:255.49,257.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:258.5,258.45 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:267.60,269.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:270.113,272.18 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:272.18,274.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:275.5,275.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:284.60,286.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:287.113,288.47 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:288.47,290.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:291.5,291.45 1 0 +github.com/echovault/echovault/pkg/modules/connection/commands.go:26.108,27.18 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:28.10,29.54 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:30.9,31.34 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:32.9,33.72 1 1 +github.com/echovault/echovault/pkg/modules/connection/commands.go:37.33,45.60 1 0 +github.com/echovault/echovault/pkg/modules/connection/commands.go:45.60,47.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:28.113,30.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:30.9,32.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:34.2,36.24 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:36.24,38.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:40.2,43.17 3 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:46.115,48.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:48.9,50.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:52.2,56.66 3 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:59.108,61.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:61.9,63.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:64.2,64.19 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:64.19,66.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:67.2,68.42 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:71.113,72.18 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:72.18,74.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:76.2,77.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:77.9,79.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:81.2,82.19 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:82.19,84.3 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:86.2,86.38 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:89.109,91.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:91.9,93.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:94.2,95.49 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:98.112,100.9 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:100.9,102.3 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:103.2,103.36 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:106.33,114.60 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:114.60,116.21 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:116.21,118.6 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:119.5,119.24 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:129.60,131.21 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:131.21,133.6 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:134.5,134.24 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:144.60,146.22 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:146.22,148.6 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:149.5,149.33 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:161.60,164.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:175.60,178.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:187.60,187.86 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:188.101,190.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:200.62,200.88 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:209.62,209.88 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:219.62,219.85 1 0 github.com/echovault/echovault/pkg/modules/generic/commands.go:34.13,35.34 1 1 github.com/echovault/echovault/pkg/modules/generic/commands.go:35.34,39.3 2 1 github.com/echovault/echovault/pkg/modules/generic/commands.go:41.2,42.29 2 0 @@ -1360,352 +1282,6 @@ github.com/echovault/echovault/pkg/modules/generic/utils.go:106.3,108.17 3 1 github.com/echovault/echovault/pkg/modules/generic/utils.go:108.17,110.4 1 1 github.com/echovault/echovault/pkg/modules/generic/utils.go:111.3,112.46 2 1 github.com/echovault/echovault/pkg/modules/generic/utils.go:114.10,115.95 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:29.115,35.29 4 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:35.29,36.54 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:36.54,42.42 4 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:42.42,44.5 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:46.4,49.12 3 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:52.3,52.36 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:52.36,59.43 5 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:59.43,61.5 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:63.4,65.21 2 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:69.2,71.25 2 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:74.109,78.35 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:78.35,79.65 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:79.65,80.41 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:80.41,82.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:83.4,83.12 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:85.3,85.13 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:88.2,88.51 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:91.110,92.18 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:93.9,98.36 4 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:98.36,99.66 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:99.66,100.52 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:100.52,104.6 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:105.5,105.13 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:107.4,108.14 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:110.3,111.26 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:113.9,117.45 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:117.45,119.4 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:120.3,120.42 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:120.42,124.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:124.37,125.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:125.67,126.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:126.53,127.59 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:127.59,131.8 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:133.6,133.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:135.5,135.54 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:135.54,138.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:140.9,140.50 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:140.50,144.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:144.37,145.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:145.67,146.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:146.53,148.24 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:148.24,151.8 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:153.6,153.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:155.5,155.33 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:155.33,158.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:160.9,160.49 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:160.49,164.37 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:164.37,165.67 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:165.67,166.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:166.53,167.55 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:167.55,171.8 3 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:173.6,173.14 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:175.5,175.50 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:175.50,178.6 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:180.9,182.4 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:183.3,184.26 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:185.10,186.54 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:190.103,192.2 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:194.33,202.60 1 1 -github.com/echovault/echovault/pkg/modules/admin/commands.go:202.60,202.86 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:211.60,213.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:221.62,221.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:230.62,230.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:240.62,240.88 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:251.60,253.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:254.113,255.49 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:255.49,257.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:258.5,258.45 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:267.60,269.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:270.113,272.18 2 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:272.18,274.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:275.5,275.53 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:284.60,286.5 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:287.113,288.47 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:288.47,290.6 1 0 -github.com/echovault/echovault/pkg/modules/admin/commands.go:291.5,291.45 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:31.105,33.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:33.16,35.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:37.2,40.25 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:40.25,42.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:44.2,44.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:44.38,46.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:48.2,48.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:48.33,50.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:50.17,52.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:53.3,54.59 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:54.59,56.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:57.3,57.59 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:60.2,60.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:60.51,62.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:63.2,66.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:66.9,68.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:70.2,71.36 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:71.36,72.42 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:72.42,73.26 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:73.26,76.5 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:77.4,77.12 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:79.3,80.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:82.2,82.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:82.55,84.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:86.2,86.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:89.105,91.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:91.16,93.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:95.2,98.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:98.33,100.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:102.2,102.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:102.52,104.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:105.2,108.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:108.9,110.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:112.2,115.31 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:115.31,117.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:117.19,119.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:121.3,121.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:121.34,123.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:125.3,125.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:125.31,127.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:129.3,129.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:129.35,132.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:134.3,134.32 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:137.2,137.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:140.111,142.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:142.16,144.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:146.2,149.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:149.33,151.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:153.2,153.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:153.52,155.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:156.2,159.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:159.9,161.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:163.2,166.31 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:166.31,168.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:168.19,170.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:172.3,172.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:172.34,174.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:176.3,176.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:176.35,179.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:181.3,181.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:181.31,183.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:185.3,185.18 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:188.2,188.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:191.109,193.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:193.16,195.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:197.2,199.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:199.33,201.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:203.2,203.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:203.52,205.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:206.2,209.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:209.9,211.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:213.2,214.27 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:214.27,215.32 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:215.32,217.12 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:219.3,219.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:219.33,222.12 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:224.3,224.29 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:224.29,226.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:229.2,229.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:232.114,234.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:234.16,236.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:238.2,241.19 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:241.19,243.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:243.17,245.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:246.3,246.13 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:246.13,248.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:249.3,249.12 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:252.2,253.19 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:253.19,254.46 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:254.46,256.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:256.9,258.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:261.2,261.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:261.33,263.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:265.2,265.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:265.52,267.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:268.2,271.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:271.9,273.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:276.2,276.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:276.24,278.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:278.17,280.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:281.3,281.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:281.34,283.18 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:283.18,284.36 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:284.36,286.14 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:288.5,288.37 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:288.37,291.14 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:293.5,293.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:293.33,295.14 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:299.3,299.26 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:303.2,304.29 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:304.29,306.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:309.2,311.46 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:311.46,315.16 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:315.16,316.59 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:316.59,318.5 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:322.2,323.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:323.16,325.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:326.2,326.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:326.38,328.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:328.17,329.41 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:329.41,331.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:333.4,333.42 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:333.42,336.13 3 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:338.4,338.38 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:338.38,340.13 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:345.2,345.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:348.108,350.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:350.16,352.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:354.2,356.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:356.33,358.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:360.2,360.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:360.52,362.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:363.2,366.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:366.9,368.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:370.2,370.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:373.109,375.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:375.16,377.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:379.2,381.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:381.33,383.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:385.2,385.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:385.52,387.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:388.2,391.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:391.9,393.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:395.2,396.29 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:396.29,398.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:400.2,400.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:403.111,405.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:405.16,407.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:409.2,415.47 5 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:415.47,417.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:417.17,419.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:420.3,420.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:421.8,423.17 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:423.17,425.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:426.3,426.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:429.2,429.33 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:429.33,430.62 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:430.62,432.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:433.3,435.48 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:435.48,437.57 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:437.57,439.5 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:440.4,440.96 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:441.9,443.57 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:443.57,445.5 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:446.4,446.60 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:450.2,450.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:450.52,452.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:453.2,456.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:456.9,458.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:460.2,460.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:460.24,462.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:464.2,464.28 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:465.10,466.69 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:467.11,469.48 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:469.48,471.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:471.9,473.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:474.15,476.48 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:476.48,478.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:478.9,480.4 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:483.2,483.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:483.55,485.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:487.2,487.40 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:487.40,489.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:491.2,492.47 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:495.111,497.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:497.16,499.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:501.2,503.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:503.33,505.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:507.2,507.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:507.52,509.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:510.2,513.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:513.9,515.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:517.2,518.33 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:518.33,520.34 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:520.34,522.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:523.3,523.35 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:523.35,526.4 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:527.3,527.31 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:527.31,529.4 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:532.2,532.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:535.111,537.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:537.16,539.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:541.2,544.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:544.33,546.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:548.2,548.52 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:548.52,550.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:551.2,554.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:554.9,556.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:558.2,558.24 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:558.24,560.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:562.2,562.30 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:565.108,567.16 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:567.16,569.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:571.2,574.33 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:574.33,576.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:578.2,578.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:578.51,580.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:581.2,584.9 3 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:584.9,586.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:588.2,590.31 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:590.31,591.25 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:591.25,594.4 2 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:597.2,597.55 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:597.55,599.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/commands.go:601.2,601.51 1 1 -github.com/echovault/echovault/pkg/modules/hash/commands.go:604.33,725.2 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:22.50,23.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:23.18,25.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:26.2,26.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:29.52,30.18 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:30.18,32.3 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:33.2,33.22 1 0 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:36.50,37.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:37.18,39.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:40.2,40.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:43.53,44.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:44.18,46.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:47.2,47.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:50.51,51.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:51.19,53.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:54.2,54.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:57.56,58.34 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:58.34,60.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.2,61.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.19,63.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:64.2,64.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:67.50,68.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:68.19,70.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:71.2,71.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:74.51,75.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:75.19,77.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:78.2,78.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:81.53,82.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.19,84.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:85.2,85.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:88.53,89.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:89.19,91.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:92.2,92.21 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:95.53,96.19 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:96.19,98.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1 -github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:26.108,27.18 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:28.10,29.54 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:30.9,31.34 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:32.9,33.72 1 1 -github.com/echovault/echovault/pkg/modules/connection/commands.go:37.33,45.60 1 0 -github.com/echovault/echovault/pkg/modules/connection/commands.go:45.60,47.5 1 0 github.com/echovault/echovault/pkg/modules/list/commands.go:30.105,32.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:32.16,34.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:36.2,38.33 2 1 @@ -1925,49 +1501,474 @@ github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:28.113,30.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:30.9,32.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:34.2,36.24 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:36.24,38.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:40.2,43.17 3 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:46.115,48.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:48.9,50.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:52.2,56.66 3 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:59.108,61.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:61.9,63.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:64.2,64.19 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:64.19,66.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:67.2,68.42 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:71.113,72.18 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:72.18,74.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:76.2,77.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:77.9,79.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:81.2,82.19 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:82.19,84.3 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:86.2,86.38 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:89.109,91.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:91.9,93.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:94.2,95.49 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:98.112,100.9 2 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:100.9,102.3 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:103.2,103.36 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:106.33,114.60 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:114.60,116.21 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:116.21,118.6 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:119.5,119.24 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:129.60,131.21 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:131.21,133.6 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:134.5,134.24 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:144.60,146.22 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:146.22,148.6 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:149.5,149.33 1 1 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:161.60,164.5 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:175.60,178.5 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:187.60,187.86 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:188.101,190.5 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:200.62,200.88 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:209.62,209.88 1 0 -github.com/echovault/echovault/pkg/modules/pubsub/commands.go:219.62,219.85 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:31.105,33.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:33.16,35.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:37.2,40.25 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:40.25,42.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:44.2,44.38 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:44.38,46.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:48.2,48.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:48.33,50.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:50.17,52.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:53.3,54.59 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:54.59,56.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:57.3,57.59 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:60.2,60.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:60.51,62.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:63.2,66.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:66.9,68.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:70.2,71.36 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:71.36,72.42 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:72.42,73.26 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:73.26,76.5 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:77.4,77.12 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:79.3,80.13 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:82.2,82.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:82.55,84.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:86.2,86.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:89.105,91.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:91.16,93.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:95.2,98.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:98.33,100.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:102.2,102.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:102.52,104.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:105.2,108.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:108.9,110.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:112.2,115.31 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:115.31,117.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:117.19,119.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:121.3,121.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:121.34,123.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:125.3,125.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:125.31,127.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:129.3,129.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:129.35,132.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:134.3,134.32 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:137.2,137.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:140.111,142.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:142.16,144.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:146.2,149.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:149.33,151.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:153.2,153.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:153.52,155.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:156.2,159.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:159.9,161.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:163.2,166.31 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:166.31,168.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:168.19,170.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:172.3,172.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:172.34,174.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:176.3,176.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:176.35,179.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:181.3,181.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:181.31,183.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:185.3,185.18 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:188.2,188.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:191.109,193.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:193.16,195.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:197.2,199.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:199.33,201.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:203.2,203.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:203.52,205.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:206.2,209.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:209.9,211.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:213.2,214.27 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:214.27,215.32 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:215.32,217.12 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:219.3,219.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:219.33,222.12 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:224.3,224.29 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:224.29,226.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:229.2,229.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:232.114,234.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:234.16,236.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:238.2,241.19 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:241.19,243.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:243.17,245.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:246.3,246.13 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:246.13,248.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:249.3,249.12 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:252.2,253.19 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:253.19,254.46 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:254.46,256.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:256.9,258.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:261.2,261.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:261.33,263.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:265.2,265.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:265.52,267.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:268.2,271.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:271.9,273.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:276.2,276.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:276.24,278.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:278.17,280.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:281.3,281.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:281.34,283.18 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:283.18,284.36 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:284.36,286.14 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:288.5,288.37 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:288.37,291.14 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:293.5,293.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:293.33,295.14 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:299.3,299.26 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:303.2,304.29 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:304.29,306.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:309.2,311.46 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:311.46,315.16 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:315.16,316.59 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:316.59,318.5 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:322.2,323.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:323.16,325.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:326.2,326.38 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:326.38,328.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:328.17,329.41 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:329.41,331.13 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:333.4,333.42 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:333.42,336.13 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:338.4,338.38 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:338.38,340.13 2 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:345.2,345.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:348.108,350.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:350.16,352.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:354.2,356.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:356.33,358.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:360.2,360.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:360.52,362.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:363.2,366.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:366.9,368.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:370.2,370.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:373.109,375.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:375.16,377.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:379.2,381.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:381.33,383.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:385.2,385.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:385.52,387.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:388.2,391.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:391.9,393.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:395.2,396.29 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:396.29,398.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:400.2,400.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:403.111,405.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:405.16,407.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:409.2,415.47 5 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:415.47,417.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:417.17,419.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:420.3,420.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:421.8,423.17 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:423.17,425.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:426.3,426.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:429.2,429.33 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:429.33,430.62 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:430.62,432.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:433.3,435.48 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:435.48,437.57 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:437.57,439.5 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:440.4,440.96 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:441.9,443.57 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:443.57,445.5 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:446.4,446.60 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:450.2,450.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:450.52,452.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:453.2,456.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:456.9,458.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:460.2,460.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:460.24,462.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:464.2,464.28 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:465.10,466.69 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:467.11,469.48 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:469.48,471.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:471.9,473.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:474.15,476.48 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:476.48,478.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:478.9,480.4 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:483.2,483.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:483.55,485.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:487.2,487.40 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:487.40,489.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:491.2,492.47 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:495.111,497.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:497.16,499.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:501.2,503.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:503.33,505.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:507.2,507.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:507.52,509.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:510.2,513.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:513.9,515.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:517.2,518.33 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:518.33,520.34 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:520.34,522.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:523.3,523.35 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:523.35,526.4 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:527.3,527.31 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:527.31,529.4 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:532.2,532.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:535.111,537.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:537.16,539.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:541.2,544.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:544.33,546.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:548.2,548.52 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:548.52,550.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:551.2,554.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:554.9,556.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:558.2,558.24 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:558.24,560.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:562.2,562.30 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:565.108,567.16 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:567.16,569.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:571.2,574.33 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:574.33,576.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:578.2,578.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:578.51,580.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:581.2,584.9 3 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:584.9,586.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:588.2,590.31 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:590.31,591.25 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:591.25,594.4 2 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:597.2,597.55 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:597.55,599.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/commands.go:601.2,601.51 1 1 +github.com/echovault/echovault/pkg/modules/hash/commands.go:604.33,725.2 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:22.50,23.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:23.18,25.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:26.2,26.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:29.52,30.18 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:30.18,32.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:33.2,33.22 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:36.50,37.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:37.18,39.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:40.2,40.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:43.53,44.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:44.18,46.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:47.2,47.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:50.51,51.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:51.19,53.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:54.2,54.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:57.56,58.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:58.34,60.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.2,61.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:61.19,63.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:64.2,64.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:67.50,68.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:68.19,70.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:71.2,71.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:74.51,75.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:75.19,77.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:78.2,78.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:81.53,82.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.19,84.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:85.2,85.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:88.53,89.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:89.19,91.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:92.2,92.21 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:95.53,96.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:96.19,98.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:99.2,99.22 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:102.50,103.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:103.18,105.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:106.2,106.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:34.108,35.34 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:35.34,37.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:38.2,39.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:39.9,41.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:42.2,42.67 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:42.67,44.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:45.2,45.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:48.106,49.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:49.19,51.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:53.2,54.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:54.9,56.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:58.2,60.30 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:60.30,61.27 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:61.27,64.9 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:68.2,68.16 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:68.16,70.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:73.2,77.18 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:77.18,79.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:79.8,81.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:82.2,82.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:82.21,84.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:85.2,85.17 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:85.17,87.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:89.2,90.29 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:90.29,92.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:95.2,96.51 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:96.51,97.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:97.22,99.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:101.3,101.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:103.2,103.51 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:103.51,104.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:104.22,106.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:108.3,108.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:112.2,113.48 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:113.48,114.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:114.21,116.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:118.3,118.47 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:120.2,120.48 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:120.48,121.21 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:121.21,123.12 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:125.3,125.47 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:129.2,130.79 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:130.79,131.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:131.37,133.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:135.2,136.30 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:136.30,137.10 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:138.100,140.53 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:141.53,143.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:144.52,146.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:151.2,153.54 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:153.54,155.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:156.2,156.54 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:156.54,158.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:160.2,162.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:165.102,166.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:166.18,168.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:170.2,174.35 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:174.35,175.36 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:175.36,176.48 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:176.48,178.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:179.4,179.12 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:181.3,181.50 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:181.50,182.51 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:182.51,185.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:189.2,189.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:189.19,192.34 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:192.34,195.4 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:196.3,197.28 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:197.28,199.24 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:199.24,201.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:203.3,203.26 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:206.2,206.19 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:206.19,208.46 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:208.46,209.43 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:209.43,211.38 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:211.38,213.30 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:213.30,215.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:217.5,217.28 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:222.2,222.74 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:225.102,227.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:227.9,229.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:230.2,231.33 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:231.33,233.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:234.2,235.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:238.106,240.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:240.9,242.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:243.2,243.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:243.45,245.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:246.2,246.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:249.108,250.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:250.18,252.3 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:253.2,254.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:254.9,256.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:257.2,257.53 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:257.53,259.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:260.2,260.42 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:263.106,265.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:265.9,267.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:268.2,269.74 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:272.103,273.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:273.18,275.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:276.2,277.9 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:277.9,279.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:280.2,282.33 3 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:282.33,285.19 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:285.19,287.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:287.9,289.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:291.3,291.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:291.22,293.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:295.3,295.18 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:295.18,297.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:299.3,299.43 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:299.43,300.61 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:300.61,302.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:303.4,303.58 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:303.58,305.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:308.3,308.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:308.52,309.23 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:309.23,311.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:313.4,313.39 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:316.3,316.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:316.52,317.23 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:317.23,319.13 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:321.4,321.39 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:324.3,324.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:324.49,325.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:325.22,327.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:329.4,329.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:332.3,332.49 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:332.49,333.22 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:333.22,335.13 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:337.4,337.37 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:340.3,340.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:340.45,341.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:341.52,343.13 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:345.4,345.41 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:348.3,348.45 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:348.45,349.52 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:349.52,351.5 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:354.3,354.55 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:354.55,356.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:358.3,358.55 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:358.55,360.4 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:361.3,361.54 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:364.2,365.25 2 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:368.103,369.19 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:369.19,371.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:373.2,374.9 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:374.9,376.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:378.2,382.16 4 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:382.16,384.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:386.2,386.15 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:386.15,387.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:387.35,389.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:392.2,396.20 3 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:396.20,397.59 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:397.59,399.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:402.2,402.37 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:402.37,403.59 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:403.59,405.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:409.2,409.29 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:409.29,413.31 3 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:413.31,414.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:414.35,417.43 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:417.43,419.6 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:419.11,422.6 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:423.5,423.10 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:427.3,427.17 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:427.17,429.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:432.2,432.42 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:435.103,436.18 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:436.18,438.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:440.2,441.9 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:441.9,443.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:445.2,449.16 4 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:449.16,451.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:453.2,453.15 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:453.15,454.35 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:454.35,456.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:459.2,461.20 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:461.20,464.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:464.17,466.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:467.3,468.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:468.17,470.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:473.2,473.37 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:473.37,476.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:476.17,478.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:479.3,480.17 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:480.17,482.4 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:485.2,486.16 2 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:486.16,488.3 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:490.2,490.42 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:493.33,501.60 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:501.60,503.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:512.60,514.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:523.62,525.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:534.62,536.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:545.62,547.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:556.62,558.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:567.62,569.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:578.62,580.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:589.62,591.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:603.62,605.7 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:614.62,616.7 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:30.108,32.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:32.16,34.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:36.2,40.33 3 1 diff --git a/pkg/echovault/api_generic_test.go b/pkg/echovault/api_generic_test.go index afd234a..723375f 100644 --- a/pkg/echovault/api_generic_test.go +++ b/pkg/echovault/api_generic_test.go @@ -13,3 +13,931 @@ // limitations under the License. package echovault + +import ( + "github.com/echovault/echovault/internal" + "github.com/echovault/echovault/internal/config" + "github.com/echovault/echovault/pkg/commands" + "github.com/echovault/echovault/pkg/constants" + "reflect" + "slices" + "strings" + "testing" + "time" +) + +var timeNow = func() time.Time { + now := time.Now() + return func() time.Time { + return now.Add(5 * time.Hour).Add(30 * time.Minute).Add(30 * time.Second).Add(10 * time.Millisecond) + }() +} + +func TestEchoVault_DEL(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + keys []string + want int + wantErr bool + }{ + { + name: "Delete several keys and return deleted count", + keys: []string{"key1", "key2", "key3", "key4", "key5"}, + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: time.Time{}}, + "key2": {Value: "value2", ExpireAt: time.Time{}}, + "key3": {Value: "value3", ExpireAt: time.Time{}}, + "key4": {Value: "value4", ExpireAt: time.Time{}}, + }, + want: 4, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + got, err := server.DEL(tt.keys...) + if (err != nil) != tt.wantErr { + t.Errorf("DEL() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("DEL() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_EXPIRE(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + cmd string + key string + time int + expireOpts EXPIREOptions + pexpireOpts PEXPIREOptions + want int + wantErr bool + }{ + { + name: "Set new expire by seconds", + cmd: "EXPIRE", + key: "key1", + time: 100, + expireOpts: EXPIREOptions{}, + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { + name: "Set new expire by milliseconds", + cmd: "PEXPIRE", + key: "key2", + time: 1000, + pexpireOpts: PEXPIREOptions{}, + presetValues: map[string]internal.KeyData{ + "key2": {Value: "value2", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { + name: "Set new expire only when key does not have an expiry time with NX flag", + cmd: "EXPIRE", + key: "key3", + time: 1000, + expireOpts: EXPIREOptions{NX: true}, + presetValues: map[string]internal.KeyData{ + "key3": {Value: "value3", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when NX flag is provided and key already has an expiry time", + cmd: "EXPIRE", + key: "key4", + time: 1000, + expireOpts: EXPIREOptions{NX: true}, + presetValues: map[string]internal.KeyData{ + "key4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + { + name: "Set new expire time from now key only when the key already has an expiry time with XX flag", + cmd: "EXPIRE", + key: "key5", + time: 1000, + expireOpts: EXPIREOptions{XX: true}, + presetValues: map[string]internal.KeyData{ + "key5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when key does not have an expiry and the XX flag is provided", + cmd: "EXPIRE", + time: 1000, + expireOpts: EXPIREOptions{XX: true}, + key: "key6", + presetValues: map[string]internal.KeyData{ + "key6": {Value: "value6", ExpireAt: time.Time{}}, + }, + want: 0, + wantErr: false, + }, + { + name: "Set expiry time when the provided time is after the current expiry time when GT flag is provided", + cmd: "EXPIRE", + key: "key7", + time: 100000, + expireOpts: EXPIREOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when GT flag is passed and current expiry time is greater than provided time", + cmd: "EXPIRE", + key: "key8", + time: 1000, + expireOpts: EXPIREOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + { + name: "Return 0 when GT flag is passed and key does not have an expiry time", + cmd: "EXPIRE", + key: "key9", + time: 1000, + expireOpts: EXPIREOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key9": {Value: "value9", ExpireAt: time.Time{}}, + }, + want: 0, + wantErr: false, + }, + { + name: "Set expiry time when the provided time is before the current expiry time when LT flag is provided", + cmd: "EXPIRE", + key: "key10", + time: 1000, + expireOpts: EXPIREOptions{LT: true}, + presetValues: map[string]internal.KeyData{ + "key10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when LT flag is passed and current expiry time is less than provided time", + cmd: "EXPIRE", + key: "key11", + time: 50000, + expireOpts: EXPIREOptions{LT: true}, + presetValues: map[string]internal.KeyData{ + "key11": {Value: "value11", ExpireAt: timeNow().Add(30 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + var got int + var err error + if strings.EqualFold(tt.cmd, "PEXPIRE") { + got, err = server.PEXPIRE(tt.key, tt.time, tt.pexpireOpts) + } else { + got, err = server.EXPIRE(tt.key, tt.time, tt.expireOpts) + } + if (err != nil) != tt.wantErr { + t.Errorf("(P)EXPIRE() error = %v, wantErr %v, key %s", err, tt.wantErr, tt.key) + return + } + if got != tt.want { + t.Errorf("(P)EXPIRE() got = %v, want %v, key %s", got, tt.want, tt.key) + } + }) + } +} + +func TestEchoVault_EXPIREAT(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + cmd string + key string + time int + expireAtOpts EXPIREATOptions + pexpireAtOpts PEXPIREATOptions + want int + wantErr bool + }{ + { + name: "Set new expire by unix seconds", + cmd: "EXPIREAT", + key: "key1", + expireAtOpts: EXPIREATOptions{}, + time: int(timeNow().Add(1000 * time.Second).Unix()), + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { + name: "Set new expire by milliseconds", + cmd: "PEXPIREAT", + key: "key2", + pexpireAtOpts: PEXPIREATOptions{}, + time: int(timeNow().Add(1000 * time.Second).UnixMilli()), + presetValues: map[string]internal.KeyData{ + "key2": {Value: "value2", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { // 3. + name: "Set new expire only when key does not have an expiry time with NX flag", + cmd: "EXPIREAT", + key: "key3", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{NX: true}, + presetValues: map[string]internal.KeyData{ + "key3": {Value: "value3", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0, when NX flag is provided and key already has an expiry time", + cmd: "EXPIREAT", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{NX: true}, + key: "key4", + presetValues: map[string]internal.KeyData{ + "key4": {Value: "value4", ExpireAt: timeNow().Add(1000 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + { + name: "Set new expire time from now key only when the key already has an expiry time with XX flag", + cmd: "EXPIREAT", + time: int(timeNow().Add(1000 * time.Second).Unix()), + key: "key5", + expireAtOpts: EXPIREATOptions{XX: true}, + presetValues: map[string]internal.KeyData{ + "key5": {Value: "value5", ExpireAt: timeNow().Add(30 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when key does not have an expiry and the XX flag is provided", + cmd: "EXPIREAT", + key: "key6", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{XX: true}, + presetValues: map[string]internal.KeyData{ + "key6": {Value: "value6", ExpireAt: time.Time{}}, + }, + want: 0, + wantErr: false, + }, + { + name: "Set expiry time when the provided time is after the current expiry time when GT flag is provided", + cmd: "EXPIREAT", + key: "key7", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key7": {Value: "value7", ExpireAt: timeNow().Add(30 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when GT flag is passed and current expiry time is greater than provided time", + cmd: "EXPIREAT", + key: "key8", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key8": {Value: "value8", ExpireAt: timeNow().Add(3000 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + { + name: "Return 0 when GT flag is passed and key does not have an expiry time", + cmd: "EXPIREAT", + key: "key9", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{GT: true}, + presetValues: map[string]internal.KeyData{ + "key9": {Value: "value9", ExpireAt: time.Time{}}, + }, + want: 0, + }, + { + name: "Set expiry time when the provided time is before the current expiry time when LT flag is provided", + cmd: "EXPIREAT", + key: "key10", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{LT: true}, + presetValues: map[string]internal.KeyData{ + "key10": {Value: "value10", ExpireAt: timeNow().Add(3000 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when LT flag is passed and current expiry time is less than provided time", + cmd: "EXPIREAT", + key: "key11", + time: int(timeNow().Add(3000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{LT: true}, + presetValues: map[string]internal.KeyData{ + "key11": {Value: "value11", ExpireAt: timeNow().Add(1000 * time.Second)}, + }, + want: 0, + wantErr: false, + }, + { + name: "Return 0 when LT flag is passed and key does not have an expiry time", + cmd: "EXPIREAT", + key: "key12", + time: int(timeNow().Add(1000 * time.Second).Unix()), + expireAtOpts: EXPIREATOptions{LT: true}, + presetValues: map[string]internal.KeyData{ + "key12": {Value: "value12", ExpireAt: time.Time{}}, + }, + want: 1, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + var got int + var err error + if strings.EqualFold(tt.cmd, "PEXPIREAT") { + got, err = server.PEXPIREAT(tt.key, tt.time, tt.pexpireAtOpts) + } else { + got, err = server.EXPIREAT(tt.key, tt.time, tt.expireAtOpts) + } + if (err != nil) != tt.wantErr { + t.Errorf("(P)EXPIREAT() error = %v, wantErr %v, KEY %s", err, tt.wantErr, tt.key) + return + } + if got != tt.want { + t.Errorf("(P)EXPIREAT() got = %v, want %v, KEY %s", got, tt.want, tt.key) + } + }) + } +} + +func TestEchoVault_EXPIRETIME(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + key string + expiretimeFunc func(key string) (int, error) + want int + wantErr bool + }{ + { + name: "Return expire time in seconds", + key: "key1", + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)}, + }, + expiretimeFunc: server.EXPIRETIME, + want: int(timeNow().Add(100 * time.Second).Unix()), + wantErr: false, + }, + { + name: "Return expire time in milliseconds", + key: "key2", + presetValues: map[string]internal.KeyData{ + "key2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)}, + }, + expiretimeFunc: server.PEXPIRETIME, + want: int(timeNow().Add(4096 * time.Millisecond).UnixMilli()), + wantErr: false, + }, + { + name: "If the key is non-volatile, return -1", + key: "key3", + presetValues: map[string]internal.KeyData{ + "key3": {Value: "value3", ExpireAt: time.Time{}}, + }, + expiretimeFunc: server.PEXPIRETIME, + want: -1, + wantErr: false, + }, + { + name: "If the key is non-existent return -2", + presetValues: nil, + expiretimeFunc: server.PEXPIRETIME, + want: -2, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + got, err := tt.expiretimeFunc(tt.key) + if (err != nil) != tt.wantErr { + t.Errorf("(P)EXPIRETIME() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("(P)EXPIRETIME() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_GET(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValue interface{} + key string + want string + wantErr bool + }{ + { + name: "Return string from existing key", + presetValue: "value1", + key: "key1", + want: "value1", + wantErr: false, + }, + { + name: "Return empty string if the key does not exist", + presetValue: nil, + key: "key2", + want: "", + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValue != nil { + presetValue(server, tt.key, tt.presetValue) + } + got, err := server.GET(tt.key) + if (err != nil) != tt.wantErr { + t.Errorf("GET() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("GET() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_MGET(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]interface{} + keys []string + want []string + wantErr bool + }{ + { + name: "Get all values in the same order the keys were provided in", + presetValues: map[string]interface{}{"key1": "value1", "key2": "value2", "key3": "value3", "key4": "value4"}, + keys: []string{"key1", "key4", "key2", "key3", "key1"}, + want: []string{"value1", "value4", "value2", "value3", "value1"}, + wantErr: false, + }, + { + name: "Return empty strings for non-existent keys", + presetValues: map[string]interface{}{"key5": "value5", "key6": "value6", "key7": "value7"}, + keys: []string{"key5", "key6", "non-existent", "non-existent", "key7", "non-existent"}, + want: []string{"value5", "value6", "", "", "value7", ""}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, v := range tt.presetValues { + presetValue(server, k, v) + } + } + got, err := server.MGET(tt.keys...) + if (err != nil) != tt.wantErr { + t.Errorf("MGET() error = %v, wantErr %v", err, tt.wantErr) + return + } + if len(got) != len(tt.want) { + t.Errorf("MGET() got = %v, want %v", got, tt.want) + } + for _, g := range got { + if !slices.Contains(tt.want, g) { + t.Errorf("MGET() got = %v, want %v", got, tt.want) + } + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("MGET() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_SET(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + key string + value string + options SETOptions + want string + wantErr bool + }{ + { + name: "Set normal value", + presetValues: nil, + key: "key1", + value: "value1", + options: SETOptions{}, + want: "OK", + wantErr: false, + }, + { + name: "Only set the value if the key does not exist", + presetValues: nil, + key: "key2", + value: "value2", + options: SETOptions{NX: true}, + want: "OK", + wantErr: false, + }, + { + name: "Throw error when value already exists with NX flag passed", + presetValues: map[string]internal.KeyData{ + "key3": { + Value: "preset-value3", + ExpireAt: time.Time{}, + }, + }, + key: "key3", + value: "value3", + options: SETOptions{NX: true}, + want: "", + wantErr: true, + }, + { + name: "Set new key value when key exists with XX flag passed", + presetValues: map[string]internal.KeyData{ + "key4": { + Value: "preset-value4", + ExpireAt: time.Time{}, + }, + }, + key: "key4", + value: "value4", + options: SETOptions{XX: true}, + want: "OK", + wantErr: false, + }, + { + name: "Return error when setting non-existent key with XX flag", + presetValues: nil, + key: "key5", + value: "value5", + options: SETOptions{XX: true}, + want: "", + wantErr: true, + }, + { + name: "Set expiry time on the key to 100 seconds from now", + presetValues: nil, + key: "key6", + value: "value6", + options: SETOptions{EX: 100}, + want: "OK", + wantErr: false, + }, + { + name: "Set expiry time on the key in unix milliseconds", + presetValues: nil, + key: "key7", + value: "value7", + options: SETOptions{PX: 4096}, + want: "OK", + wantErr: false, + }, + { + name: "Set exact expiry time in seconds from unix epoch", + presetValues: nil, + key: "key8", + value: "value8", + options: SETOptions{EXAT: int(timeNow().Add(200 * time.Second).Unix())}, + want: "OK", + wantErr: false, + }, + { + name: "Set exact expiry time in milliseconds from unix epoch", + key: "key9", + value: "value9", + options: SETOptions{PXAT: int(timeNow().Add(4096 * time.Millisecond).UnixMilli())}, + presetValues: nil, + want: "OK", + wantErr: false, + }, + { + name: "Get the previous value when GET flag is passed", + presetValues: map[string]internal.KeyData{ + "key10": { + Value: "previous-value", + ExpireAt: time.Time{}, + }, + }, + key: "key10", + value: "value10", + options: SETOptions{GET: true, EX: 1000}, + want: "previous-value", + wantErr: false, + }, + { + name: "Return nil when GET value is passed and no previous value exists", + presetValues: nil, + key: "key11", + value: "value11", + options: SETOptions{GET: true, EX: 1000}, + want: "", + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + got, err := server.SET(tt.key, tt.value, tt.options) + if (err != nil) != tt.wantErr { + t.Errorf("SET() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("SET() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_MSET(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + kvPairs map[string]string + want string + wantErr bool + }{ + { + name: "Set multiple keys", + kvPairs: map[string]string{"key1": "value1", "key2": "10", "key3": "3.142"}, + want: "OK", + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := server.MSET(tt.kvPairs) + if (err != nil) != tt.wantErr { + t.Errorf("MSET() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("MSET() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_PERSIST(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + key string + want int + wantErr bool + }{ + { + name: "Successfully persist a volatile key", + key: "key1", + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: timeNow().Add(1000 * time.Second)}, + }, + want: 1, + wantErr: false, + }, + { + name: "Return 0 when trying to persist a non-existent key", + key: "key2", + presetValues: nil, + want: 0, + wantErr: false, + }, + { + name: "Return 0 when trying to persist a non-volatile key", + key: "key3", + presetValues: map[string]internal.KeyData{ + "key3": {Value: "value3", ExpireAt: time.Time{}}, + }, + want: 0, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + got, err := server.PERSIST(tt.key) + if (err != nil) != tt.wantErr { + t.Errorf("PERSIST() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("PERSIST() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestEchoVault_TTL(t *testing.T) { + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + EvictionPolicy: constants.NoEviction, + }), + ) + + tests := []struct { + name string + presetValues map[string]internal.KeyData + key string + ttlFunc func(key string) (int, error) + want int + wantErr bool + }{ + { + name: "Return TTL time in seconds", + key: "key1", + presetValues: map[string]internal.KeyData{ + "key1": {Value: "value1", ExpireAt: timeNow().Add(100 * time.Second)}, + }, + ttlFunc: server.TTL, + want: 19930, + wantErr: false, + }, + { + name: "Return TTL time in milliseconds", + key: "key2", + ttlFunc: server.PTTL, + presetValues: map[string]internal.KeyData{ + "key2": {Value: "value2", ExpireAt: timeNow().Add(4096 * time.Millisecond)}, + }, + want: 19834106, + wantErr: false, + }, + { + name: "If the key is non-volatile, return -1", + key: "key3", + ttlFunc: server.TTL, + presetValues: map[string]internal.KeyData{ + "key3": {Value: "value3", ExpireAt: time.Time{}}, + }, + want: -1, + wantErr: false, + }, + { + name: "If the key is non-existent return -2", + key: "key4", + ttlFunc: server.TTL, + presetValues: nil, + want: -2, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.presetValues != nil { + for k, d := range tt.presetValues { + presetKeyData(server, k, d) + } + } + got, err := tt.ttlFunc(tt.key) + if (err != nil) != tt.wantErr { + t.Errorf("TTL() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("TTL() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/pkg/echovault/api_string_test.go b/pkg/echovault/api_string_test.go index 7b8d377..8e78723 100644 --- a/pkg/echovault/api_string_test.go +++ b/pkg/echovault/api_string_test.go @@ -15,12 +15,20 @@ package echovault import ( + "github.com/echovault/echovault/internal/config" "github.com/echovault/echovault/pkg/commands" + "github.com/echovault/echovault/pkg/constants" "testing" ) func TestEchoVault_SUBSTR(t *testing.T) { - server := NewEchoVault(WithCommands(commands.All())) + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + DataDir: "", + EvictionPolicy: constants.NoEviction, + }), + ) tests := []struct { name string @@ -175,7 +183,13 @@ func TestEchoVault_SUBSTR(t *testing.T) { } func TestEchoVault_SETRANGE(t *testing.T) { - server := NewEchoVault(WithCommands(commands.All())) + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + DataDir: "", + EvictionPolicy: constants.NoEviction, + }), + ) tests := []struct { name string @@ -259,7 +273,13 @@ func TestEchoVault_SETRANGE(t *testing.T) { } func TestEchoVault_STRLEN(t *testing.T) { - server := NewEchoVault(WithCommands(commands.All())) + server := NewEchoVault( + WithCommands(commands.All()), + WithConfig(config.Config{ + DataDir: "", + EvictionPolicy: constants.NoEviction, + }), + ) tests := []struct { name string diff --git a/pkg/echovault/keyspace.go b/pkg/echovault/keyspace.go index a02135c..b8d18cc 100644 --- a/pkg/echovault/keyspace.go +++ b/pkg/echovault/keyspace.go @@ -571,3 +571,10 @@ func presetValue(server *EchoVault, key string, value interface{}) { _ = server.SetValue(server.context, key, value) server.KeyUnlock(server.context, key) } + +func presetKeyData(server *EchoVault, key string, data internal.KeyData) { + _, _ = server.CreateKeyAndLock(server.context, key) + defer server.KeyUnlock(server.context, key) + _ = server.SetValue(server.context, key, data.Value) + server.SetExpiry(server.context, key, data.ExpireAt, false) +}