diff --git a/coverage/coverage.out b/coverage/coverage.out index 0e7fd08..6e533a2 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -904,88 +904,256 @@ 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/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/generic/commands.go:36.104,38.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:38.16,40.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:42.2,48.16 6 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:48.16,50.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:54.2,54.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:54.16,55.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:55.34,57.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:57.9,59.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:62.2,62.44 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:62.44,64.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:64.34,66.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:67.3,67.36 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:68.8,68.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:68.51,70.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:70.33,72.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:73.3,73.45 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:74.8,76.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:76.34,79.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:79.9,82.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:84.2,84.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:84.16,86.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:87.2,89.76 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:89.76,91.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:94.2,94.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:94.28,96.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.17 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:101.105,103.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:103.16,105.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:107.2,110.15 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:110.15,111.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:111.29,112.16 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:112.16,118.5 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:123.2,123.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:123.30,124.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:124.15,129.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:134.2,134.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:134.28,135.31 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:135.31,136.52 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:136.52,138.5 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:139.4,140.12 2 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:142.3,142.60 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:142.60,144.4 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:145.3,145.55 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:149.2,149.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:149.28,150.58 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:150.58,152.4 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:155.2,155.42 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:158.104,160.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:160.16,162.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:163.2,165.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:165.33,167.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:169.2,170.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:170.16,172.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:173.2,177.51 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:180.105,182.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:182.16,184.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:186.2,189.36 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:189.36,190.31 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:190.31,192.12 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:194.3,194.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:194.33,196.18 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:196.18,198.5 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:199.4,200.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:202.3,202.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:204.2,204.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:204.15,205.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:205.34,206.14 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:206.14,209.5 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:213.2,213.28 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:213.28,215.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:217.2,219.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:219.30,220.24 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:220.24,222.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:224.3,224.96 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:227.2,227.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:230.104,232.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:232.16,234.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:235.2,236.37 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:236.37,238.17 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:238.17,240.12 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:242.3,242.13 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:244.2,244.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:247.108,249.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:249.16,251.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:253.2,255.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:255.33,257.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:259.2,259.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:259.51,261.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:262.2,265.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:265.31,267.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:269.2,271.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:274.111,276.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:276.16,278.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:280.2,282.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:282.33,284.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:286.2,286.52 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:286.52,288.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:289.2,293.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:293.31,295.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:297.2,298.46 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:298.46,300.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:302.2,302.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:305.104,307.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:307.16,309.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:311.2,315.33 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:315.33,317.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:319.2,319.52 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:319.52,321.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:322.2,326.31 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:326.31,328.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:330.2,331.39 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:331.39,333.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:335.2,335.12 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:335.12,337.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:339.2,339.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:342.107,344.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:344.16,346.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:348.2,352.16 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:352.16,354.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:355.2,356.42 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:356.42,358.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:360.2,360.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:360.33,362.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:364.2,364.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:364.51,366.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:367.2,369.19 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:369.19,372.3 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:374.2,376.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:377.12,378.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:378.39,380.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:381.3,381.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:382.12,383.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:383.39,385.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:386.3,386.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:387.12,388.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:388.39,390.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:391.3,391.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:391.39,393.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:394.3,394.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:395.12,396.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:396.39,397.40 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:397.40,399.5 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:400.4,400.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:402.3,402.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:403.10,404.71 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:407.2,407.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:410.109,412.16 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:412.16,414.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:416.2,420.16 3 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:420.16,422.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:423.2,424.44 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:424.44,426.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:428.2,428.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:428.33,430.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:432.2,432.51 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:432.51,434.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/commands.go:435.2,437.19 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:437.19,440.3 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:442.2,444.33 2 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:445.12,446.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:446.39,448.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:449.3,449.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:450.12,451.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:451.39,453.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:454.3,454.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:455.12,456.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:456.39,458.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:459.3,459.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:459.39,461.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:462.3,462.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:463.12,464.39 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:464.39,465.40 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:465.40,467.5 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:468.4,468.47 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:470.3,470.46 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:471.10,472.71 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:475.2,475.30 1 1 +github.com/echovault/echovault/pkg/modules/generic/commands.go:478.33,647.2 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.57,24.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:24.34,26.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:27.2,31.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.58,35.25 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.25,37.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:38.2,39.30 2 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.30,40.15 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:40.15,42.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:44.2,48.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:51.57,52.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:52.19,54.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:55.2,59.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:62.58,63.18 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.18,65.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:66.2,70.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:73.57,74.18 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.18,76.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.2,81.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.61,85.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.19,87.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,92.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.64,96.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:96.19,98.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:99.2,103.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:106.57,107.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:107.19,109.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:110.2,114.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:117.60,118.34 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:118.34,120.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:121.2,125.8 1 1 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:128.62,129.34 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:129.34,131.3 1 0 +github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:132.2,136.8 1 0 +github.com/echovault/echovault/pkg/modules/generic/utils.go:32.96,33.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:33.19,35.3 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:36.2,36.33 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:37.13,39.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:41.12,42.26 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:42.26,44.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:45.3,46.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:48.12,49.26 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:49.26,51.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:52.3,53.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:55.12,56.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:56.19,58.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:59.3,59.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:59.29,61.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:62.3,64.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:64.17,66.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:67.3,68.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:70.12,71.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:71.19,73.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:74.3,74.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:74.29,76.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:77.3,79.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:79.17,81.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:82.3,83.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:85.14,86.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:86.19,88.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:89.3,89.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:89.29,91.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:92.3,94.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:94.17,96.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:97.3,98.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:100.14,101.19 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:101.19,103.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:104.3,104.29 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:104.29,106.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:107.3,109.17 3 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:109.17,111.4 1 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:112.3,113.53 2 1 +github.com/echovault/echovault/pkg/modules/generic/utils.go:115.10,116.95 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 @@ -1178,268 +1346,94 @@ 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/generic/commands.go:36.104,38.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:38.16,40.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:42.2,48.16 6 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:48.16,50.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:54.2,54.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:54.16,55.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:55.34,57.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:57.9,59.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:62.2,62.44 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:62.44,64.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:64.34,66.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:67.3,67.36 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:68.8,68.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:68.51,70.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:70.33,72.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:73.3,73.45 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:74.8,76.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:76.34,79.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:79.9,82.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:84.2,84.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:84.16,86.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:87.2,89.76 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:89.76,91.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:94.2,94.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:94.28,96.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:98.2,98.17 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:101.105,102.44 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:102.44,104.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:106.2,109.15 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:109.15,110.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:110.29,111.16 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:111.16,117.5 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:122.2,122.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:122.30,123.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:123.15,128.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:133.2,133.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:133.28,134.31 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:134.31,135.52 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:135.52,137.5 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:138.4,139.12 2 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:141.3,141.60 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:141.60,143.4 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:144.3,144.55 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:148.2,148.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:148.28,149.58 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:149.58,151.4 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:154.2,154.42 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:157.104,159.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:159.16,161.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:162.2,164.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:164.33,166.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:168.2,169.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:169.16,171.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:172.2,176.51 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:179.105,181.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:181.16,183.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:185.2,188.27 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:188.27,189.31 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:189.31,191.12 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:193.3,193.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:193.33,195.18 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:195.18,197.5 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:198.4,199.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:201.3,201.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:203.2,203.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:203.15,204.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:204.34,205.14 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:205.14,208.5 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:212.2,212.28 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:212.28,214.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:216.2,218.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:218.30,219.24 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:219.24,221.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:223.3,223.96 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:226.2,226.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:229.104,231.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:231.16,233.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:234.2,235.27 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:235.27,237.17 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:237.17,239.12 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:241.3,241.13 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:243.2,243.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:246.108,248.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:248.16,250.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:252.2,254.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:254.33,256.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:258.2,258.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:258.51,260.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:261.2,264.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:264.31,266.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:268.2,270.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:273.111,275.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:275.16,277.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:279.2,281.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:281.33,283.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:285.2,285.52 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:285.52,287.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:288.2,292.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:292.31,294.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:296.2,297.46 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:297.46,299.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:301.2,301.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:304.104,306.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:306.16,308.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:310.2,314.33 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:314.33,316.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:318.2,318.52 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:318.52,320.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:321.2,325.31 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:325.31,327.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:329.2,330.39 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:330.39,332.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:334.2,334.12 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:334.12,336.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:338.2,338.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:341.107,343.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:343.16,345.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:347.2,351.16 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:351.16,353.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:354.2,355.42 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:355.42,357.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:359.2,359.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:359.33,361.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:363.2,363.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:363.51,365.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:366.2,368.19 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:368.19,371.3 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:373.2,375.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:376.12,377.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:377.39,379.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:380.3,380.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:381.12,382.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:382.39,384.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:385.3,385.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:386.12,387.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:387.39,389.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:390.3,390.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:390.39,392.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:393.3,393.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:394.12,395.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:395.39,396.40 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:396.40,398.5 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:399.4,399.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:401.3,401.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:402.10,403.71 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:406.2,406.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:409.109,411.16 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:411.16,413.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:415.2,419.16 3 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:419.16,421.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:422.2,423.44 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:423.44,425.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:427.2,427.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:427.33,429.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:431.2,431.51 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:431.51,433.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/commands.go:434.2,436.19 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:436.19,439.3 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:441.2,443.33 2 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:444.12,445.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:445.39,447.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:448.3,448.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:449.12,450.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:450.39,452.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:453.3,453.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:454.12,455.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:455.39,457.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:458.3,458.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:458.39,460.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:461.3,461.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:462.12,463.39 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:463.39,464.40 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:464.40,466.5 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:467.4,467.47 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:469.3,469.46 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:470.10,471.71 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:474.2,474.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/commands.go:477.33,646.2 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:22.49,23.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:23.34,25.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:26.2,26.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:29.50,30.25 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:30.25,32.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:33.2,34.30 2 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:34.30,35.15 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:35.15,37.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:39.2,39.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:42.49,43.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:43.19,45.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:46.2,46.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:49.50,50.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:50.18,52.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:53.2,53.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:56.49,57.18 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:57.18,59.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:60.2,60.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:63.53,64.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:64.19,66.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:67.2,67.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:70.56,71.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:71.19,73.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:74.2,74.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:77.49,78.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:78.19,80.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:81.2,81.21 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:84.52,85.34 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:85.34,87.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:88.2,88.30 1 1 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:91.54,92.34 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:92.34,94.3 1 0 -github.com/echovault/echovault/pkg/modules/generic/key_funcs.go:95.2,95.30 1 0 -github.com/echovault/echovault/pkg/modules/generic/utils.go:32.96,33.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:33.19,35.3 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:36.2,36.33 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:37.13,39.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:41.12,42.26 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:42.26,44.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:45.3,46.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:48.12,49.26 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:49.26,51.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:52.3,53.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:55.12,56.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:56.19,58.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:59.3,59.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:59.29,61.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:62.3,64.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:64.17,66.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:67.3,68.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:70.12,71.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:71.19,73.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:74.3,74.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:74.29,76.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:77.3,79.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:79.17,81.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:82.3,83.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:85.14,86.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:86.19,88.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:89.3,89.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:89.29,91.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:92.3,94.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:94.17,96.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:97.3,98.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:100.14,101.19 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:101.19,103.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:104.3,104.29 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:104.29,106.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:107.3,109.17 3 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:109.17,111.4 1 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:112.3,113.53 2 1 -github.com/echovault/echovault/pkg/modules/generic/utils.go:115.10,116.95 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:493.33,501.68 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:501.68,507.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:516.68,522.5 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:531.70,537.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:546.70,552.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:561.70,567.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:576.70,582.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:591.70,597.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:606.70,612.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:621.70,627.7 1 1 +github.com/echovault/echovault/pkg/modules/acl/commands.go:639.70,645.7 1 0 +github.com/echovault/echovault/pkg/modules/acl/commands.go:654.70,660.7 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:29.111,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.68 1 1 +github.com/echovault/echovault/pkg/modules/admin/commands.go:202.68,208.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:217.68,223.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:231.70,237.7 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:246.70,252.7 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:262.70,268.7 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:279.68,285.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:286.113,287.49 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:287.49,289.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:290.5,290.45 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:299.68,305.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:306.113,308.18 2 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:308.18,310.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:311.5,311.53 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:320.68,326.5 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:327.113,328.47 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:328.47,330.6 1 0 +github.com/echovault/echovault/pkg/modules/admin/commands.go:331.5,331.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 @@ -1563,8 +1557,8 @@ 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: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.105,350.16 2 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:350.16,352.3 1 1 @@ -1666,44 +1660,50 @@ 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:23.58,24.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:24.18,26.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:27.2,31.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:34.60,35.18 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:35.18,37.3 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:38.2,42.8 1 0 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:45.58,46.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:46.18,48.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:49.2,53.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:56.61,57.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:57.18,59.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:60.2,64.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:67.59,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/hash/key_funcs.go:71.2,75.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:78.64,79.34 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:79.34,81.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.2,82.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:82.19,88.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:89.2,93.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:96.58,97.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:97.19,99.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:100.2,104.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:107.59,108.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:108.19,110.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:111.2,115.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:118.61,119.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:119.19,121.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:122.2,126.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:129.61,130.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:130.19,132.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:133.2,137.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:140.61,141.19 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:141.19,143.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:144.2,148.8 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:151.58,152.18 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:152.18,154.3 1 1 +github.com/echovault/echovault/pkg/modules/hash/key_funcs.go:155.2,159.8 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.68 1 0 +github.com/echovault/echovault/pkg/modules/connection/commands.go:45.68,51.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 @@ -1713,7 +1713,7 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:43.52,45.3 1 0 github.com/echovault/echovault/pkg/modules/list/commands.go:46.2,48.63 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:48.63,50.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:52.2,52.57 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:55.110,57.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:55.107,57.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:57.16,59.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:61.2,64.9 3 1 github.com/echovault/echovault/pkg/modules/list/commands.go:64.9,66.3 1 1 @@ -1726,7 +1726,7 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:78.9,80.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:82.2,82.40 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:82.40,84.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:86.2,86.57 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:89.110,91.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:89.107,91.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:91.16,93.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:95.2,99.24 4 1 github.com/echovault/echovault/pkg/modules/list/commands.go:99.24,101.3 1 1 @@ -1753,7 +1753,7 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:155.13,158.18 3 1 github.com/echovault/echovault/pkg/modules/list/commands.go:158.18,160.4 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:160.9,162.4 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:165.2,165.19 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:168.108,170.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:168.105,170.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:170.16,172.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:174.2,177.9 3 1 github.com/echovault/echovault/pkg/modules/list/commands.go:177.9,179.3 1 1 @@ -1768,7 +1768,7 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:195.40,197.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:199.2,200.55 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:200.55,202.3 1 0 github.com/echovault/echovault/pkg/modules/list/commands.go:204.2,204.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:207.109,209.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:207.106,209.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:209.16,211.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:213.2,217.24 4 1 github.com/echovault/echovault/pkg/modules/list/commands.go:217.24,219.3 1 1 @@ -1789,7 +1789,7 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:247.3,247.43 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:250.2,250.66 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:250.66,252.3 1 0 github.com/echovault/echovault/pkg/modules/list/commands.go:253.2,253.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:256.108,258.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:256.105,258.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:258.16,260.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:262.2,266.9 4 1 github.com/echovault/echovault/pkg/modules/list/commands.go:266.9,268.3 1 1 @@ -1816,113 +1816,113 @@ github.com/echovault/echovault/pkg/modules/list/commands.go:313.61,315.3 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:317.2,317.55 1 1 github.com/echovault/echovault/pkg/modules/list/commands.go:317.55,319.3 1 0 github.com/echovault/echovault/pkg/modules/list/commands.go:321.2,321.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:324.109,326.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:324.106,326.16 2 1 github.com/echovault/echovault/pkg/modules/list/commands.go:326.16,328.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:330.2,335.116 5 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:335.116,337.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:339.2,339.75 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:339.75,341.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:343.2,343.54 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:343.54,345.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:346.2,349.16 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:349.16,351.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:352.2,357.33 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:357.33,359.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:361.2,361.19 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:362.14,364.24 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:364.24,366.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:366.9,366.32 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:366.32,368.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:369.15,371.24 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:371.24,373.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:373.9,373.32 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:373.32,375.4 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:378.2,378.16 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:378.16,380.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:382.2,382.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:385.106,387.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:387.16,389.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:391.2,393.31 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:393.31,395.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:397.2,399.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:399.33,400.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:401.17,402.61 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:403.11,404.62 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:404.62,406.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:407.4,407.68 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:407.68,409.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:411.8,412.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:412.52,414.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:416.2,421.9 4 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:421.9,423.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:425.2,425.73 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:425.73,427.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:428.2,428.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:431.109,433.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:433.16,435.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:437.2,441.31 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:441.31,443.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:445.2,445.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:445.33,446.34 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:447.17,448.61 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:449.11,450.62 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:450.62,452.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:453.4,454.68 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:454.68,456.5 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:458.8,459.52 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:459.52,461.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:462.3,462.35 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:465.2,469.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:469.9,471.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:473.2,473.73 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:473.73,475.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:476.2,476.42 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:479.104,481.16 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:481.16,483.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:485.2,487.33 2 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:487.33,489.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:491.2,491.51 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:491.51,493.3 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:494.2,497.9 3 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:497.9,499.3 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:501.2,501.33 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:502.10,503.60 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:503.60,505.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:506.3,506.54 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:507.14,508.70 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:508.70,510.4 1 0 -github.com/echovault/echovault/pkg/modules/list/commands.go:511.3,511.64 1 1 -github.com/echovault/echovault/pkg/modules/list/commands.go:515.33,635.2 1 0 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:22.51,23.18 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:23.18,25.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:26.2,26.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:29.49,30.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:30.19,32.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:33.2,33.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:36.50,37.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:37.19,39.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:40.2,40.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:43.52,44.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:44.19,46.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:47.2,47.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:50.52,51.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:51.19,53.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:54.2,54.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:57.50,58.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:58.19,60.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:61.2,61.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:64.51,65.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:65.19,67.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:68.2,68.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:71.50,72.19 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:72.19,74.3 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:75.2,75.30 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:78.51,79.18 1 1 -github.com/echovault/echovault/pkg/modules/list/key_funcs.go:79.18,81.3 1 1 -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/list/commands.go:330.2,334.116 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:334.116,336.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:338.2,338.75 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:338.75,340.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:342.2,342.54 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:342.54,344.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:345.2,348.16 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:348.16,350.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:351.2,356.33 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:356.33,358.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:360.2,360.19 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:361.14,363.24 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:363.24,365.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:365.9,365.32 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:365.32,367.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:368.15,370.24 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:370.24,372.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:372.9,372.32 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:372.32,374.4 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:377.2,377.16 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:377.16,379.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:381.2,381.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:384.106,386.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:386.16,388.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:390.2,392.31 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:392.31,394.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:396.2,398.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:398.33,399.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:400.17,401.61 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:402.11,403.62 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:403.62,405.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:406.4,406.68 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:406.68,408.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:410.8,411.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:411.52,413.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:415.2,420.9 4 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:420.9,422.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:424.2,424.73 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:424.73,426.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:427.2,427.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:430.106,432.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:432.16,434.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:436.2,440.31 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:440.31,442.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:444.2,444.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:444.33,445.34 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:446.17,447.61 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:448.11,449.62 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:449.62,451.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:452.4,453.68 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:453.68,455.5 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:457.8,458.52 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:458.52,460.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:461.3,461.35 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:464.2,468.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:468.9,470.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:472.2,472.73 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:472.73,474.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:475.2,475.42 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:478.104,480.16 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:480.16,482.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:484.2,486.33 2 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:486.33,488.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:490.2,490.51 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:490.51,492.3 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:493.2,496.9 3 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:496.9,498.3 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:500.2,500.33 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:501.10,502.60 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:502.60,504.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:505.3,505.54 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:506.14,507.70 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:507.70,509.4 1 0 +github.com/echovault/echovault/pkg/modules/list/commands.go:510.3,510.64 1 1 +github.com/echovault/echovault/pkg/modules/list/commands.go:514.33,634.2 1 0 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:23.59,24.18 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:24.18,26.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:27.2,31.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:34.57,35.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:35.19,37.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:38.2,42.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:45.58,46.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:46.19,48.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:49.2,53.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:56.60,57.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:57.19,59.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:60.2,64.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:67.60,68.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:68.19,70.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:71.2,75.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:78.58,79.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:79.19,81.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,86.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.59,90.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:90.19,92.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:93.2,97.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:100.58,101.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:101.19,103.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:104.2,108.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:111.59,112.18 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:112.18,114.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:115.2,119.8 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:122.59,123.19 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:123.19,125.3 1 1 +github.com/echovault/echovault/pkg/modules/list/key_funcs.go:126.2,130.8 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 @@ -1949,24 +1949,24 @@ 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:106.33,114.68 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:114.68,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/set/commands.go:30.108,32.16 2 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:119.5,123.11 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:133.68,135.21 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:135.21,137.6 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:138.5,142.11 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:152.68,154.22 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:154.22,156.6 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:157.5,161.11 1 1 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:173.68,180.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:191.68,197.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:206.68,212.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:213.101,215.5 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:225.70,231.7 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:240.70,246.7 1 0 +github.com/echovault/echovault/pkg/modules/pubsub/commands.go:256.70,262.7 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:30.105,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 github.com/echovault/echovault/pkg/modules/set/commands.go:40.33,42.70 2 1 @@ -1979,7 +1979,7 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:52.51,54.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:55.2,58.9 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:58.9,60.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:62.2,64.51 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:67.109,69.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:67.106,69.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:69.16,71.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:73.2,75.33 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:75.33,77.3 1 1 @@ -1988,20 +1988,20 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:79.52,81.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:82.2,85.9 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:85.9,87.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:89.2,91.57 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:94.109,96.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:94.106,96.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:96.16,98.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:101.2,101.37 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:101.37,103.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:104.2,104.56 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:104.56,106.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:101.2,101.46 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:101.46,103.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:104.2,104.65 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:104.65,106.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:107.2,109.9 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:109.9,111.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:113.2,114.15 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:114.15,115.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:115.34,116.14 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:116.14,118.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:122.2,122.31 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:122.31,123.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:122.2,122.40 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:122.40,123.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:123.34,124.12 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:126.3,126.53 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:126.53,127.12 1 0 @@ -2014,26 +2014,26 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:141.2,145.26 4 1 github.com/echovault/echovault/pkg/modules/set/commands.go:145.26,147.24 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:147.24,149.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:152.2,152.25 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:155.114,157.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:155.111,157.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:157.16,159.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:161.2,164.37 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:164.37,166.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:167.2,167.57 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:167.57,169.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:161.2,164.46 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:164.46,166.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:167.2,167.66 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:167.66,169.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:170.2,172.9 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:172.9,174.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:176.2,177.15 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:177.15,178.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:178.34,179.14 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:179.14,181.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:185.2,185.31 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:185.31,186.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:185.2,185.40 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:185.40,186.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:186.34,187.12 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:189.3,189.53 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:189.53,190.12 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:192.3,192.20 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:195.2,196.31 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:196.31,198.10 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:195.2,196.40 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:196.40,198.10 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:198.10,199.12 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:201.3,201.27 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:204.2,209.40 4 1 @@ -2047,14 +2047,14 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:220.68,222.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:223.2,223.63 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:223.63,225.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:226.2,228.25 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:231.110,233.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:231.107,233.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:233.16,235.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:237.2,238.15 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:238.15,239.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:239.34,240.14 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:240.14,242.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:246.2,246.31 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:246.31,247.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:246.2,246.36 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:246.36,247.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:247.34,250.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:251.3,251.53 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:251.53,253.4 1 0 @@ -2085,8 +2085,8 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:313.2,314.15 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:314.15,315.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:315.34,316.14 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:316.14,318.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:322.2,322.27 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:322.27,323.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:322.2,322.36 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:322.36,323.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:323.34,326.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:327.3,327.53 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:327.53,329.4 1 0 @@ -2098,14 +2098,14 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:341.3,341.27 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:344.2,344.20 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:344.20,346.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:348.2,350.69 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:353.115,355.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:353.112,355.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:355.16,357.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:359.2,360.15 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:360.15,361.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:361.34,362.14 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:362.14,364.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:368.2,368.31 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:368.31,369.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:368.2,368.36 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:368.36,369.34 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:369.34,372.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:373.3,373.53 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:373.53,375.4 1 0 @@ -2122,7 +2122,7 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:398.69,400.4 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:403.2,403.68 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:403.68,405.3 1 0 github.com/echovault/echovault/pkg/modules/set/commands.go:406.2,408.69 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:411.113,413.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:411.110,413.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:413.16,415.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:417.2,419.33 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:419.33,421.3 1 0 @@ -2133,7 +2133,7 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:429.9,431.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:433.2,433.27 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:433.27,435.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:437.2,437.30 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:440.112,442.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:440.109,442.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:442.16,444.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:446.2,448.33 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:448.33,450.3 1 1 @@ -2145,7 +2145,7 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:462.2,465.26 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:465.26,467.24 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:467.24,469.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:472.2,472.25 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:475.114,477.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:475.111,477.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:477.16,479.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:481.2,484.33 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:484.33,486.29 2 1 @@ -2161,167 +2161,167 @@ github.com/echovault/echovault/pkg/modules/set/commands.go:506.36,507.31 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:507.31,509.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:509.9,511.4 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:513.2,515.25 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:518.109,520.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:518.106,520.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:520.16,522.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:524.2,528.36 4 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:528.36,530.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:532.2,532.54 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:532.54,534.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:535.2,538.9 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:538.9,540.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:542.2,544.41 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:544.41,546.69 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:546.69,548.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:549.3,551.74 3 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:551.74,553.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:554.8,556.61 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:556.61,558.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:559.3,561.10 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:561.10,563.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:564.3,564.22 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:567.2,569.49 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:572.108,574.16 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:574.16,576.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:578.2,581.19 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:581.19,583.10 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:583.10,585.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:586.3,586.12 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:589.2,589.33 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:589.33,591.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:593.2,593.51 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:593.51,595.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:596.2,599.9 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:599.9,601.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:603.2,606.28 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:606.28,608.26 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:608.26,610.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:613.2,613.25 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:616.115,618.16 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:618.16,620.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:622.2,625.19 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:625.19,627.10 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:627.10,629.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:630.3,630.12 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:633.2,633.33 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:633.33,635.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:637.2,637.51 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:637.51,639.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:640.2,643.9 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:643.9,645.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:647.2,650.28 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:650.28,652.26 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:652.26,654.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:657.2,657.25 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:660.108,662.16 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:662.16,664.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:666.2,669.33 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:669.33,671.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:673.2,673.51 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:673.51,675.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:676.2,679.9 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:679.9,681.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:683.2,685.51 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:688.110,690.16 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:690.16,692.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:694.2,695.15 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:695.15,696.34 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:696.34,697.14 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:697.14,699.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:703.2,703.27 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:703.27,704.34 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:704.34,705.12 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:707.3,707.53 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:707.53,709.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:710.3,710.20 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:713.2,715.33 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:715.33,716.14 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:716.14,717.12 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:719.3,720.10 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:720.10,722.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:723.3,723.27 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:726.2,729.35 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:729.35,731.33 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:731.33,733.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:736.2,736.25 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:739.115,741.16 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:741.16,743.3 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:745.2,746.15 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:746.15,747.34 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:747.34,748.14 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:748.14,750.5 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:754.2,754.31 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:754.31,755.34 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:755.34,756.12 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:758.3,758.53 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:758.53,760.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:761.3,761.20 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:764.2,766.33 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:766.33,767.14 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:767.14,768.12 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:770.3,771.10 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:771.10,773.4 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:774.3,774.27 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:777.2,781.40 3 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:781.40,782.60 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:782.60,784.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:785.8,786.69 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:786.69,788.4 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:790.2,792.64 2 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:792.64,794.3 1 0 -github.com/echovault/echovault/pkg/modules/set/commands.go:795.2,795.65 1 1 -github.com/echovault/echovault/pkg/modules/set/commands.go:798.33,949.2 1 0 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:24.50,25.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:25.18,27.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:28.2,28.30 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:31.51,32.19 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:32.19,34.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:35.2,35.30 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:38.51,39.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:39.18,41.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:42.2,42.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:45.56,46.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:46.18,48.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:49.2,49.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:52.52,53.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:53.18,55.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:56.2,56.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:59.56,60.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:60.18,62.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:64.2,64.56 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:64.56,66.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:68.2,68.20 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:68.20,70.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:72.2,72.29 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:75.57,76.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:76.18,78.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:79.2,79.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:82.55,83.19 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:83.19,85.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:86.2,86.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:89.54,90.19 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:90.19,92.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:93.2,93.30 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:96.56,97.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:97.18,99.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:100.2,100.30 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:103.51,104.19 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:104.19,106.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:107.2,107.22 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:110.50,111.34 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:111.34,113.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:114.2,114.22 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:117.57,118.34 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:118.34,120.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:121.2,121.22 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:124.50,125.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:125.18,127.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:128.2,128.30 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:131.52,132.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:132.18,134.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:135.2,135.21 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:138.57,139.18 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:139.18,141.3 1 1 -github.com/echovault/echovault/pkg/modules/set/key_funcs.go:142.2,142.21 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:524.2,527.36 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:527.36,529.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:531.2,531.54 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:531.54,533.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:534.2,537.9 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:537.9,539.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:541.2,543.41 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:543.41,545.69 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:545.69,547.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:548.3,550.74 3 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:550.74,552.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:553.8,555.61 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:555.61,557.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:558.3,560.10 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:560.10,562.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:563.3,563.22 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:566.2,568.49 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:571.105,573.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:573.16,575.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:577.2,580.19 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:580.19,582.10 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:582.10,584.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:585.3,585.12 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:588.2,588.33 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:588.33,590.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:592.2,592.51 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:592.51,594.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:595.2,598.9 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:598.9,600.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:602.2,605.28 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:605.28,607.26 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:607.26,609.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:612.2,612.25 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:615.112,617.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:617.16,619.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:621.2,624.19 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:624.19,626.10 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:626.10,628.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:629.3,629.12 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:632.2,632.33 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:632.33,634.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:636.2,636.51 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:636.51,638.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:639.2,642.9 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:642.9,644.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:646.2,649.28 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:649.28,651.26 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:651.26,653.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:656.2,656.25 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:659.105,661.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:661.16,663.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:665.2,668.33 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:668.33,670.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:672.2,672.51 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:672.51,674.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:675.2,678.9 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:678.9,680.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:682.2,684.51 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:687.107,689.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:689.16,691.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:693.2,694.15 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:694.15,695.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:695.34,696.14 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:696.14,698.5 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:702.2,702.36 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:702.36,703.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:703.34,704.12 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:706.3,706.53 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:706.53,708.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:709.3,709.20 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:712.2,714.33 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:714.33,715.14 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:715.14,716.12 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:718.3,719.10 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:719.10,721.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:722.3,722.27 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:725.2,728.35 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:728.35,730.33 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:730.33,732.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:735.2,735.25 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:738.112,740.16 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:740.16,742.3 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:744.2,745.15 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:745.15,746.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:746.34,747.14 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:747.14,749.5 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:753.2,753.36 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:753.36,754.34 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:754.34,755.12 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:757.3,757.53 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:757.53,759.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:760.3,760.20 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:763.2,765.33 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:765.33,766.14 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:766.14,767.12 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:769.3,770.10 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:770.10,772.4 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:773.3,773.27 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:776.2,780.40 3 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:780.40,781.60 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:781.60,783.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:784.8,785.69 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:785.69,787.4 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:789.2,791.64 2 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:791.64,793.3 1 0 +github.com/echovault/echovault/pkg/modules/set/commands.go:794.2,794.65 1 1 +github.com/echovault/echovault/pkg/modules/set/commands.go:797.33,948.2 1 0 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:25.58,26.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:26.18,28.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:29.2,33.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:36.59,37.19 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:37.19,39.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:40.2,44.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:47.59,48.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:48.18,50.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:51.2,55.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:58.64,59.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:59.18,61.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:62.2,66.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:69.60,70.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:70.18,72.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:73.2,77.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:80.64,81.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:81.18,83.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:85.2,85.56 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:85.56,87.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:89.2,89.20 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:89.20,95.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:97.2,101.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:104.65,105.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:105.18,107.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:108.2,112.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:115.63,116.19 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:116.19,118.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:119.2,123.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:126.62,127.19 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:127.19,129.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:130.2,134.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:137.64,138.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:138.18,140.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:141.2,145.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:148.59,149.19 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:149.19,151.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:152.2,156.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:159.58,160.34 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:160.34,162.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:163.2,167.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:170.65,171.34 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:171.34,173.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:174.2,178.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:181.58,182.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:182.18,184.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:185.2,189.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:192.60,193.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:193.18,195.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:196.2,200.8 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:203.65,204.18 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:204.18,206.3 1 1 +github.com/echovault/echovault/pkg/modules/set/key_funcs.go:207.2,211.8 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:33.105,35.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:35.16,37.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:39.2,48.32 7 1 @@ -2377,7 +2377,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:171.60,173.3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:174.2,177.54 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:177.54,179.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:181.2,181.63 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:184.109,186.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:184.106,186.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:186.16,188.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:189.2,191.33 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:191.33,193.3 1 1 @@ -2386,7 +2386,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:195.52,197.3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:198.2,201.9 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:201.9,203.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:205.2,205.63 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:208.110,210.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:208.107,210.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:210.16,212.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:214.2,217.43 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:218.10,219.60 1 0 @@ -2427,7 +2427,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:309.2,311.28 2 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:311.28,313.81 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:313.81,315.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:318.2,318.51 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:321.109,323.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:321.106,323.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:323.16,325.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:327.2,327.63 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:327.63,329.3 1 1 @@ -2437,15 +2437,15 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:334.2,335.15 2 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:335.15,336.34 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:336.34,337.14 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:337.14,339.5 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:344.2,344.37 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:344.37,347.3 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:348.2,348.56 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:348.56,350.3 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:344.2,344.46 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:344.46,347.3 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:348.2,348.65 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:348.65,350.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:351.2,353.9 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:353.9,355.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:358.2,360.33 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:360.33,361.38 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:361.38,362.12 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:358.2,360.42 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:360.42,361.47 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:361.47,362.12 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:364.3,365.17 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:365.17,367.4 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:368.3,370.10 3 1 @@ -2456,22 +2456,22 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:381.34,382.20 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:382.20,384.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:384.9,386.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:389.2,391.25 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:394.114,396.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:394.111,396.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:396.16,398.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:400.2,403.15 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:403.15,404.34 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:404.34,405.14 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:405.14,407.5 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:412.2,412.37 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:412.37,415.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:416.2,416.56 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:416.56,418.3 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:412.2,412.46 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:412.46,415.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:416.2,416.65 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:416.65,418.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:419.2,421.9 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:421.9,423.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:425.2,427.33 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:427.33,428.37 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:428.37,429.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:429.58,431.5 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:425.2,427.42 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:427.42,428.46 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:428.46,429.67 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:429.67,431.5 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:432.4,433.11 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:433.11,435.5 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:436.4,436.28 1 1 @@ -2483,7 +2483,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:447.69,449.4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:451.2,453.63 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:453.63,455.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:457.2,457.64 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:460.111,462.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:460.108,462.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:462.16,464.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:466.2,470.43 4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:471.10,472.55 1 0 @@ -2507,7 +2507,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:511.9,513.3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:514.2,520.23 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:520.23,522.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:523.2,524.74 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:527.110,529.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:527.107,529.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:529.16,531.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:533.2,534.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:534.16,536.3 1 1 @@ -2529,7 +2529,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:573.40,574.18 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:574.18,576.5 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:576.10,578.5 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:582.2,584.25 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:587.115,589.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:587.112,589.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:589.16,591.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:593.2,596.51 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:596.51,598.3 1 1 @@ -2556,7 +2556,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:641.69,643.4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:645.2,647.68 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:647.68,649.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:651.2,651.69 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:654.109,656.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:654.106,656.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:656.16,658.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:660.2,665.56 4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:665.56,667.3 1 1 @@ -2577,10 +2577,10 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:690.21,691.20 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:691.20,693.4 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:694.3,695.53 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:695.53,697.4 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:700.2,700.33 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:700.33,701.37 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:701.37,702.57 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:702.57,703.13 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:700.2,700.43 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:700.43,701.47 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:701.47,702.67 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:702.67,703.13 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:705.4,706.35 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:706.35,708.13 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:710.4,711.18 2 1 @@ -2589,7 +2589,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:715.4,719.38 3 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:719.38,721.5 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:723.4,725.27 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:729.2,729.30 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:732.108,734.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:732.105,734.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:734.16,736.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:738.2,742.42 4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:742.42,744.3 1 1 @@ -2609,7 +2609,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:771.16,773.3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:775.2,776.36 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:776.36,778.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:780.2,782.25 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:785.111,787.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:785.108,787.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:787.16,789.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:791.2,793.33 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:793.33,795.3 1 1 @@ -2622,7 +2622,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:813.36,815.21 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:815.21,817.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:817.9,819.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:822.2,824.25 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:827.115,829.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:827.112,829.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:829.16,831.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:833.2,836.19 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:836.19,838.17 2 1 @@ -2676,7 +2676,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:957.2,958.28 2 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:958.28,959.38 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:959.38,961.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:964.2,964.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:967.110,969.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:967.107,969.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:969.16,971.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:973.2,975.33 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:975.33,977.3 1 1 @@ -2687,7 +2687,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:983.9,985.3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:986.2,987.20 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:987.20,989.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:991.2,993.69 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:996.120,998.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:996.117,998.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:998.16,1000.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1002.2,1007.16 4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1007.16,1009.3 1 0 @@ -2703,7 +2703,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1030.2,1030.33 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1030.33,1031.83 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1031.83,1034.4 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1037.2,1037.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1040.119,1042.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1040.116,1042.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1042.16,1044.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1046.2,1049.16 3 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1049.16,1051.3 1 0 @@ -2729,7 +2729,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1091.34,1094.4 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1095.8,1096.34 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1096.34,1099.4 2 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1102.2,1102.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1105.118,1107.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1105.115,1107.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1107.16,1109.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1111.2,1115.33 4 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1115.33,1117.3 1 1 @@ -2744,7 +2744,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1138.2,1141.28 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1141.28,1143.81 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1143.81,1146.4 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1149.2,1149.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1152.110,1154.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1152.107,1154.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1154.16,1156.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1158.2,1167.65 9 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1167.65,1169.3 1 1 @@ -2806,7 +2806,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1279.34,1280.1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1280.17,1282.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1282.9,1284.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1287.2,1289.25 2 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1292.115,1294.16 2 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1292.112,1294.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1294.16,1296.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1298.2,1308.62 10 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1308.62,1310.3 1 1 @@ -2869,7 +2869,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1421.69,1423.4 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1425.2,1427.71 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1427.71,1429.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1431.2,1431.72 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1434.110,1435.46 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1434.107,1435.46 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1435.46,1437.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1439.2,1440.16 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1440.16,1442.3 1 1 @@ -2915,120 +2915,120 @@ github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1545.2,1547.64 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1547.64,1549.3 1 0 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1551.2,1551.65 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/commands.go:1554.33,1826.2 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:24.50,25.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:25.18,27.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:28.2,28.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:31.51,32.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:32.19,34.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:35.2,35.21 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:38.52,39.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:39.19,41.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:42.2,42.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:45.51,46.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:46.18,48.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:50.2,50.63 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:50.63,52.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:54.2,54.27 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:54.27,56.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:58.2,58.36 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:61.56,62.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:62.18,64.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:65.2,65.21 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:68.53,69.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:69.19,71.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:72.2,72.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:75.52,76.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:76.18,78.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:79.2,79.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:79.58,82.39 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:82.39,84.4 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:85.3,85.15 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:87.2,87.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:87.18,89.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:90.2,90.17 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:90.17,92.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:93.2,93.53 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:96.57,97.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:97.18,99.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:100.2,100.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:100.58,103.39 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:103.39,105.4 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:106.3,106.15 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:108.2,108.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:108.18,110.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:111.2,111.17 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:111.17,113.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:114.2,114.53 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:117.51,118.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:118.18,120.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:121.2,121.54 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:121.54,123.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:124.2,124.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:124.18,126.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:127.2,127.17 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:127.17,129.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:130.2,130.53 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:133.53,134.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:25.58,26.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:26.18,28.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:29.2,33.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:36.59,37.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:37.19,39.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:40.2,44.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:47.60,48.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:48.19,50.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:51.2,55.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:58.59,59.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:59.18,61.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:63.2,63.63 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:63.63,65.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:67.2,67.27 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:67.27,73.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:75.2,79.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:82.64,83.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:83.18,85.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:86.2,90.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:93.61,94.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:94.19,96.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:97.2,101.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:104.60,105.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:105.18,107.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:108.2,108.58 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:108.58,111.39 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:111.39,113.4 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:114.3,114.15 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:116.2,116.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:116.18,122.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:123.2,123.17 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:123.17,129.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:130.2,130.68 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:133.65,134.18 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:134.18,136.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:137.2,137.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:140.50,141.34 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:141.34,143.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:144.2,144.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:147.57,148.34 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:148.34,150.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:151.2,151.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:154.51,155.34 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:155.34,157.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:158.2,158.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:161.50,162.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:162.18,164.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:165.2,165.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:168.54,169.18 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:169.18,171.3 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:172.2,172.22 1 0 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:175.52,176.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:176.19,178.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:179.2,179.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:182.60,183.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:183.19,185.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:186.2,186.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:189.61,190.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:190.19,192.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:193.2,193.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:196.62,197.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:197.19,199.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:200.2,200.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:203.55,204.19 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:204.19,206.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:207.2,207.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:210.53,211.35 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:211.35,213.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:214.2,214.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:217.57,218.35 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:218.35,220.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:221.2,221.22 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:224.52,225.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:225.18,227.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:228.2,228.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:228.58,231.39 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:231.39,233.4 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:234.3,234.15 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:236.2,236.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:236.18,238.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:239.2,239.17 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:239.17,241.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:242.2,242.53 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:245.57,246.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:246.18,248.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:249.2,249.58 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:249.58,252.39 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:252.39,254.4 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:255.3,255.15 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:257.2,257.18 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:257.18,259.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:260.2,260.17 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:260.17,262.3 1 1 -github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:263.2,263.53 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:137.2,137.58 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:137.58,140.39 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:140.39,142.4 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:143.3,143.15 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:145.2,145.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:145.18,151.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:152.2,152.17 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:152.17,158.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:159.2,159.68 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:162.59,163.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:163.18,165.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:166.2,166.54 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:166.54,168.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:169.2,169.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:169.18,175.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:176.2,176.17 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:176.17,182.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:183.2,183.68 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:186.61,187.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:187.18,189.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:190.2,194.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:197.58,198.34 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:198.34,200.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:201.2,205.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:208.65,209.34 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:209.34,211.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:212.2,216.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:219.59,220.34 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:220.34,222.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:223.2,227.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:230.58,231.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:231.18,233.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:234.2,238.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:241.62,242.18 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:242.18,244.3 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:245.2,249.8 1 0 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:252.60,253.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:253.19,255.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:256.2,260.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:263.68,264.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:264.19,266.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:267.2,271.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:274.69,275.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:275.19,277.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:278.2,282.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:285.70,286.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:286.19,288.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:289.2,293.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:296.63,297.19 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:297.19,299.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:300.2,304.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:307.61,308.35 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:308.35,310.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:311.2,315.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:318.65,319.35 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:319.35,321.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:322.2,326.8 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:329.60,330.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:330.18,332.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:333.2,333.58 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:333.58,336.39 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:336.39,338.4 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:339.3,339.15 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:341.2,341.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:341.18,347.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:348.2,348.17 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:348.17,354.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:355.2,355.68 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:358.65,359.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:359.18,361.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:362.2,362.58 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:362.58,365.39 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:365.39,367.4 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:368.3,368.15 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:370.2,370.18 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:370.18,376.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:377.2,377.17 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:377.17,383.3 1 1 +github.com/echovault/echovault/pkg/modules/sorted_set/key_funcs.go:384.2,384.68 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:24.97,26.60 2 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:26.60,28.3 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:29.2,29.24 1 1 @@ -3064,7 +3064,7 @@ github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:85.8,85.31 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:85.31,86.34 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:86.34,88.4 1 1 github.com/echovault/echovault/pkg/modules/sorted_set/utils.go:91.2,91.50 1 1 -github.com/echovault/echovault/pkg/modules/string/commands.go:27.112,29.16 2 1 +github.com/echovault/echovault/pkg/modules/string/commands.go:27.109,29.16 2 1 github.com/echovault/echovault/pkg/modules/string/commands.go:29.16,31.3 1 1 github.com/echovault/echovault/pkg/modules/string/commands.go:33.2,36.9 3 1 github.com/echovault/echovault/pkg/modules/string/commands.go:36.9,38.3 1 1 @@ -3102,7 +3102,7 @@ github.com/echovault/echovault/pkg/modules/string/commands.go:114.53,116.3 1 0 github.com/echovault/echovault/pkg/modules/string/commands.go:117.2,121.9 3 1 github.com/echovault/echovault/pkg/modules/string/commands.go:121.9,123.3 1 0 github.com/echovault/echovault/pkg/modules/string/commands.go:125.2,125.56 1 1 -github.com/echovault/echovault/pkg/modules/string/commands.go:128.110,130.16 2 1 +github.com/echovault/echovault/pkg/modules/string/commands.go:128.107,130.16 2 1 github.com/echovault/echovault/pkg/modules/string/commands.go:130.16,132.3 1 1 github.com/echovault/echovault/pkg/modules/string/commands.go:134.2,140.24 5 1 github.com/echovault/echovault/pkg/modules/string/commands.go:140.24,142.3 1 1 @@ -3128,12 +3128,12 @@ github.com/echovault/echovault/pkg/modules/string/commands.go:182.38,184.4 1 1 github.com/echovault/echovault/pkg/modules/string/commands.go:185.3,185.12 1 1 github.com/echovault/echovault/pkg/modules/string/commands.go:188.2,188.65 1 1 github.com/echovault/echovault/pkg/modules/string/commands.go:191.33,231.2 1 0 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:22.54,23.19 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:23.19,25.3 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:26.2,26.30 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:29.52,30.19 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:30.19,32.3 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:33.2,33.30 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:36.52,37.19 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:37.19,39.3 1 1 -github.com/echovault/echovault/pkg/modules/string/key_funcs.go:40.2,40.30 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:23.62,24.19 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:24.19,26.3 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:27.2,31.8 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:34.60,35.19 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:35.19,37.3 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:38.2,42.8 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:45.60,46.19 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:46.19,48.3 1 1 +github.com/echovault/echovault/pkg/modules/string/key_funcs.go:49.2,53.8 1 1 diff --git a/internal/acl/acl.go b/internal/acl/acl.go index b49f5a0..94adf91 100644 --- a/internal/acl/acl.go +++ b/internal/acl/acl.go @@ -410,34 +410,30 @@ func (acl *ACL) AuthorizeConnection(conn *net.Conn, cmd []string, command types. return errors.New("not authorised to access any keys") } - // 8. If @read is in the list of categories, check if keys are in IncludedReadKeys - if slices.Contains(categories, constants.ReadCategory) { - if !slices.ContainsFunc(readKeys, func(key string) bool { - return slices.ContainsFunc(connection.User.IncludedReadKeys, func(readKeyGlob string) bool { - if acl.GlobPatterns[readKeyGlob].Match(key) { - return true - } - notAllowed = append(notAllowed, fmt.Sprintf("%s~%s", "%R", key)) - return false - }) - }) { - return fmt.Errorf("not authorised to access the following keys %+v", notAllowed) - } + // 8. Check if readKeys are in IncludedReadKeys + if !slices.ContainsFunc(readKeys, func(key string) bool { + return slices.ContainsFunc(connection.User.IncludedReadKeys, func(readKeyGlob string) bool { + if acl.GlobPatterns[readKeyGlob].Match(key) { + return true + } + notAllowed = append(notAllowed, fmt.Sprintf("%s~%s", "%R", key)) + return false + }) + }) { + return fmt.Errorf("not authorised to access the following keys %+v", notAllowed) } - // 9. If @write is in the list of categories, check if keys are in IncludedWriteKeys - if slices.Contains(categories, constants.WriteCategory) { - if !slices.ContainsFunc(writeKeys, func(key string) bool { - return slices.ContainsFunc(connection.User.IncludedWriteKeys, func(writeKeyGlob string) bool { - if acl.GlobPatterns[writeKeyGlob].Match(key) { - return true - } - notAllowed = append(notAllowed, fmt.Sprintf("%s~%s", "%W", key)) - return false - }) - }) { - return fmt.Errorf("not authorised to access the following keys %+v", notAllowed) - } + // 9. Check if keys are in IncludedWriteKeys + if !slices.ContainsFunc(writeKeys, func(key string) bool { + return slices.ContainsFunc(connection.User.IncludedWriteKeys, func(writeKeyGlob string) bool { + if acl.GlobPatterns[writeKeyGlob].Match(key) { + return true + } + notAllowed = append(notAllowed, fmt.Sprintf("%s~%s", "%W", key)) + return false + }) + }) { + return fmt.Errorf("not authorised to access the following keys %+v", notAllowed) } } diff --git a/pkg/modules/acl/commands.go b/pkg/modules/acl/commands.go index c7dfd8e..2392cb8 100644 --- a/pkg/modules/acl/commands.go +++ b/pkg/modules/acl/commands.go @@ -498,8 +498,12 @@ func Commands() []types.Command { Categories: []string{constants.ConnectionCategory, constants.SlowCategory}, Description: "(AUTH [username] password) Authenticates the connection", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleAuth, }, @@ -509,8 +513,12 @@ func Commands() []types.Command { Categories: []string{}, Description: "Access-Control-List commands", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, SubCommands: []types.SubCommand{ { @@ -520,8 +528,12 @@ func Commands() []types.Command { Description: `(ACL CAT [category]) List all the categories. If the optional category is provided, list all the commands in the category`, Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleCat, }, @@ -531,8 +543,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL USERS) List all usernames of the configured ACL users", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleUsers, }, @@ -542,8 +558,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL SETUSER) Configure a new or existing user", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleSetUser, }, @@ -553,8 +573,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL GETUSER username) List the ACL rules of a user", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleGetUser, }, @@ -564,8 +588,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL DELUSER username [username ...]) Deletes users and terminates their connections. Cannot delete default user", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleDelUser, }, @@ -575,8 +603,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.FastCategory}, Description: "(ACL WHOAMI) Returns the authenticated user of the current connection", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleWhoAmI, }, @@ -586,8 +618,12 @@ If the optional category is provided, list all the commands in the category`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL LIST) Dumps effective acl rules in acl config file format", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleList, }, @@ -600,8 +636,12 @@ If the optional category is provided, list all the commands in the category`, When 'MERGE' is passed, users from config file who share a username with users in memory will be merged. When 'REPLACE' is passed, users from config file who share a username with users in memory will replace the user in memory.`, Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleLoad, }, @@ -611,8 +651,12 @@ When 'REPLACE' is passed, users from config file who share a username with users Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(ACL SAVE) Saves the effective ACL rules the configured ACL config file", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleSave, }, diff --git a/pkg/modules/admin/commands.go b/pkg/modules/admin/commands.go index 6d62efa..b1edf83 100644 --- a/pkg/modules/admin/commands.go +++ b/pkg/modules/admin/commands.go @@ -26,7 +26,7 @@ import ( "strings" ) -func handleGetAllCommands(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { +func handleGetAllCommands(_ context.Context, _ []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { commands := server.GetAllCommands() res := "" @@ -194,13 +194,19 @@ func handleCommandDocs(_ context.Context, _ []string, _ types.EchoVault, _ *net. func Commands() []types.Command { return []types.Command{ { - Command: "commands", - Module: constants.AdminModule, - Categories: []string{constants.AdminCategory, constants.SlowCategory}, - Description: "Get a list of all the commands in available on the echovault with categories and descriptions", - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handleGetAllCommands, + Command: "commands", + Module: constants.AdminModule, + Categories: []string{constants.AdminCategory, constants.SlowCategory}, + Description: "Get a list of all the commands in available on the echovault with categories and descriptions", + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handleGetAllCommands, }, { Command: "command", @@ -208,27 +214,43 @@ func Commands() []types.Command { Categories: []string{}, Description: "Commands pertaining to echovault commands", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, SubCommands: []types.SubCommand{ { - Command: "docs", - Module: constants.AdminModule, - Categories: []string{constants.SlowCategory, constants.ConnectionCategory}, - Description: "Get command documentation", - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handleCommandDocs, + Command: "docs", + Module: constants.AdminModule, + Categories: []string{constants.SlowCategory, constants.ConnectionCategory}, + Description: "Get command documentation", + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handleCommandDocs, }, { - Command: "count", - Module: constants.AdminModule, - Categories: []string{constants.SlowCategory}, - Description: "Get the dumber of commands in the echovault", - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handleCommandCount, + Command: "count", + Module: constants.AdminModule, + Categories: []string{constants.SlowCategory}, + Description: "Get the dumber of commands in the echovault", + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handleCommandCount, }, { Command: "list", @@ -236,9 +258,15 @@ func Commands() []types.Command { Categories: []string{constants.SlowCategory}, Description: `(COMMAND LIST [FILTERBY ]) Get the list of command names. Allows for filtering by ACL category or glob pattern.`, - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handleCommandList, + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handleCommandList, }, }, }, @@ -248,8 +276,12 @@ Allows for filtering by ACL category or glob pattern.`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(SAVE) Trigger a snapshot save", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: func(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { if err := server.TakeSnapshot(); err != nil { @@ -264,8 +296,12 @@ Allows for filtering by ACL category or glob pattern.`, Categories: []string{constants.AdminCategory, constants.FastCategory, constants.DangerousCategory}, Description: "(LASTSAVE) Get unix timestamp for the latest snapshot in milliseconds.", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: func(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { msec := server.GetLatestSnapshotTime() @@ -281,8 +317,12 @@ Allows for filtering by ACL category or glob pattern.`, Categories: []string{constants.AdminCategory, constants.SlowCategory, constants.DangerousCategory}, Description: "(REWRITEAOF) Trigger re-writing of append process", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: func(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { if err := server.RewriteAOF(); err != nil { diff --git a/pkg/modules/connection/commands.go b/pkg/modules/connection/commands.go index ae71fb3..f9eac58 100644 --- a/pkg/modules/connection/commands.go +++ b/pkg/modules/connection/commands.go @@ -42,8 +42,12 @@ func Commands() []types.Command { Categories: []string{constants.FastCategory, constants.ConnectionCategory}, Description: "(PING [value]) Ping the echovault. If a value is provided, the value will be echoed.", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - return []string{}, nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handlePing, }, diff --git a/pkg/modules/generic/commands.go b/pkg/modules/generic/commands.go index 21c58d9..a9e454d 100644 --- a/pkg/modules/generic/commands.go +++ b/pkg/modules/generic/commands.go @@ -39,7 +39,7 @@ func handleSet(ctx context.Context, cmd []string, server types.EchoVault, _ *net return nil, err } - key := keys[0] + key := keys.WriteKeys[0] value := cmd[2] res := []byte(constants.OkResponse) clock := server.GetClock() @@ -99,7 +99,8 @@ func handleSet(ctx context.Context, cmd []string, server types.EchoVault, _ *net } func handleMSet(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { - if _, err := msetKeyFunc(cmd); err != nil { + _, err := msetKeyFunc(cmd) + if err != nil { return nil, err } @@ -159,7 +160,7 @@ func handleGet(ctx context.Context, cmd []string, server types.EchoVault, _ *net if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("$-1\r\n"), nil @@ -185,7 +186,7 @@ func handleMGet(ctx context.Context, cmd []string, server types.EchoVault, _ *ne values := make(map[string]string) locks := make(map[string]bool) - for _, key := range keys { + for _, key := range keys.ReadKeys { if _, ok := values[key]; ok { // Skip if we have already locked this key continue @@ -232,7 +233,7 @@ func handleDel(ctx context.Context, cmd []string, server types.EchoVault, _ *net return nil, err } count := 0 - for _, key := range keys { + for _, key := range keys.WriteKeys { err = server.DeleteKey(ctx, key) if err != nil { log.Printf("could not delete key %s due to error: %+v\n", key, err) @@ -249,7 +250,7 @@ func handlePersist(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.WriteKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -276,7 +277,7 @@ func handleExpireTime(ctx context.Context, cmd []string, server types.EchoVault, return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(":-2\r\n"), nil @@ -307,7 +308,7 @@ func handleTTL(ctx context.Context, cmd []string, server types.EchoVault, _ *net return nil, err } - key := keys[0] + key := keys.ReadKeys[0] clock := server.GetClock() @@ -344,7 +345,7 @@ func handleExpire(ctx context.Context, cmd []string, server types.EchoVault, _ * return nil, err } - key := keys[0] + key := keys.WriteKeys[0] // Extract time n, err := strconv.ParseInt(cmd[2], 10, 64) @@ -412,7 +413,7 @@ func handleExpireAt(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.WriteKeys[0] // Extract time n, err := strconv.ParseInt(cmd[2], 10, 64) diff --git a/pkg/modules/generic/key_funcs.go b/pkg/modules/generic/key_funcs.go index 8cf8131..5584af5 100644 --- a/pkg/modules/generic/key_funcs.go +++ b/pkg/modules/generic/key_funcs.go @@ -17,18 +17,23 @@ package generic import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" ) -func setKeyFunc(cmd []string) ([]string, error) { +func setKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 || len(cmd) > 7 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func msetKeyFunc(cmd []string) ([]string, error) { +func msetKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd[1:])%2 != 0 { - return nil, errors.New("each key must be paired with a value") + return types.AccessKeys{}, errors.New("each key must be paired with a value") } var keys []string for i, key := range cmd[1:] { @@ -36,61 +41,97 @@ func msetKeyFunc(cmd []string) ([]string, error) { keys = append(keys, key) } } - return keys, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: keys, + }, nil } -func getKeyFunc(cmd []string) ([]string, error) { +func getKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func mgetKeyFunc(cmd []string) ([]string, error) { +func mgetKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func delKeyFunc(cmd []string) ([]string, error) { +func delKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:], + }, nil } -func persistKeyFunc(cmd []string) ([]string, error) { +func persistKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:], + }, nil } -func expireTimeKeyFunc(cmd []string) ([]string, error) { +func expireTimeKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func ttlKeyFunc(cmd []string) ([]string, error) { +func ttlKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func expireKeyFunc(cmd []string) ([]string, error) { +func expireKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 || len(cmd) > 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func expireAtKeyFunc(cmd []string) ([]string, error) { +func expireAtKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 || len(cmd) > 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } diff --git a/pkg/modules/hash/commands.go b/pkg/modules/hash/commands.go index bd242cf..3399db3 100644 --- a/pkg/modules/hash/commands.go +++ b/pkg/modules/hash/commands.go @@ -34,7 +34,7 @@ func handleHSET(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.WriteKeys[0] entries := make(map[string]interface{}) if len(cmd[2:])%2 != 0 { @@ -92,7 +92,7 @@ func handleHGET(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.ReadKeys[0] fields := cmd[2:] if !server.KeyExists(ctx, key) { @@ -143,7 +143,7 @@ func handleHSTRLEN(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.ReadKeys[0] fields := cmd[2:] if !server.KeyExists(ctx, key) { @@ -194,7 +194,7 @@ func handleHVALS(ctx context.Context, cmd []string, server types.EchoVault, _ *n return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("*0\r\n"), nil @@ -235,7 +235,7 @@ func handleHRANDFIELD(ctx context.Context, cmd []string, server types.EchoVault, return nil, err } - key := keys[0] + key := keys.ReadKeys[0] count := 1 if len(cmd) >= 3 { @@ -351,7 +351,7 @@ func handleHLEN(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -376,7 +376,7 @@ func handleHKEYS(ctx context.Context, cmd []string, server types.EchoVault, _ *n return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("*0\r\n"), nil @@ -406,7 +406,7 @@ func handleHINCRBY(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.WriteKeys[0] field := cmd[2] var intIncrement int @@ -498,7 +498,7 @@ func handleHGETALL(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("*0\r\n"), nil @@ -538,7 +538,7 @@ func handleHEXISTS(ctx context.Context, cmd []string, server types.EchoVault, _ return nil, err } - key := keys[0] + key := keys.ReadKeys[0] field := cmd[2] if !server.KeyExists(ctx, key) { @@ -568,7 +568,7 @@ func handleHDEL(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.WriteKeys[0] fields := cmd[2:] if !server.KeyExists(ctx, key) { diff --git a/pkg/modules/hash/key_funcs.go b/pkg/modules/hash/key_funcs.go index 4aaed79..3e2f72d 100644 --- a/pkg/modules/hash/key_funcs.go +++ b/pkg/modules/hash/key_funcs.go @@ -17,91 +17,144 @@ package hash import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" ) -func hsetKeyFunc(cmd []string) ([]string, error) { +func hsetKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func hsetnxKeyFunc(cmd []string) ([]string, error) { +func hsetnxKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func hgetKeyFunc(cmd []string) ([]string, error) { +func hgetKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func hstrlenKeyFunc(cmd []string) ([]string, error) { +func hstrlenKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func hvalsKeyFunc(cmd []string) ([]string, error) { +func hvalsKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func hrandfieldKeyFunc(cmd []string) ([]string, error) { +func hrandfieldKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 || len(cmd) > 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } if len(cmd) == 2 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func hlenKeyFunc(cmd []string) ([]string, error) { +func hlenKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func hkeysKeyFunc(cmd []string) ([]string, error) { +func hkeysKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func hincrbyKeyFunc(cmd []string) ([]string, error) { +func hincrbyKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func hgetallKeyFunc(cmd []string) ([]string, error) { +func hgetallKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func hexistsKeyFunc(cmd []string) ([]string, error) { +func hexistsKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func hdelKeyFunc(cmd []string) ([]string, error) { +func hdelKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } diff --git a/pkg/modules/list/commands.go b/pkg/modules/list/commands.go index 881d76c..145dc1c 100644 --- a/pkg/modules/list/commands.go +++ b/pkg/modules/list/commands.go @@ -33,7 +33,7 @@ func handleLLen(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { // If key does not exist, return 0 @@ -52,13 +52,13 @@ func handleLLen(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, errors.New("LLEN command on non-list item") } -func handleLIndex(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLIndex(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := lindexKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] index, ok := internal.AdaptType(cmd[2]).(int) if !ok { @@ -86,13 +86,13 @@ func handleLIndex(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(fmt.Sprintf("+%s\r\n", list[index])), nil } -func handleLRange(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLRange(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := lrangeKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] start, startOk := internal.AdaptType(cmd[2]).(int) end, endOk := internal.AdaptType(cmd[3]).(int) @@ -165,13 +165,13 @@ func handleLRange(ctx context.Context, cmd []string, server types.EchoVault, con return bytes, nil } -func handleLSet(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLSet(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := lsetKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] index, ok := internal.AdaptType(cmd[2]).(int) if !ok { @@ -204,13 +204,13 @@ func handleLSet(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(constants.OkResponse), nil } -func handleLTrim(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLTrim(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := ltrimKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] start, startOk := internal.AdaptType(cmd[2]).(int) end, endOk := internal.AdaptType(cmd[3]).(int) @@ -253,13 +253,13 @@ func handleLTrim(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(constants.OkResponse), nil } -func handleLRem(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLRem(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := lremKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] value := cmd[3] count, ok := internal.AdaptType(cmd[2]).(int) @@ -321,14 +321,13 @@ func handleLRem(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(constants.OkResponse), nil } -func handleLMove(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleLMove(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := lmoveKeyFunc(cmd) if err != nil { return nil, err } - source := keys[0] - destination := keys[1] + source, destination := keys.WriteKeys[0], keys.WriteKeys[1] whereFrom := strings.ToLower(cmd[3]) whereTo := strings.ToLower(cmd[4]) @@ -394,7 +393,7 @@ func handleLPush(ctx context.Context, cmd []string, server types.EchoVault, _ *n newElems = append(newElems, internal.AdaptType(elem)) } - key := keys[0] + key := keys.WriteKeys[0] if !server.KeyExists(ctx, key) { switch strings.ToLower(cmd[0]) { @@ -428,13 +427,13 @@ func handleLPush(ctx context.Context, cmd []string, server types.EchoVault, _ *n return []byte(constants.OkResponse), nil } -func handleRPush(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleRPush(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := rpushKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] var newElems []interface{} @@ -482,7 +481,7 @@ func handlePop(ctx context.Context, cmd []string, server types.EchoVault, _ *net return nil, err } - key := keys[0] + key := keys.WriteKeys[0] if !server.KeyExists(ctx, key) { return nil, fmt.Errorf("%s command on non-list item", strings.ToUpper(cmd[0])) diff --git a/pkg/modules/list/key_funcs.go b/pkg/modules/list/key_funcs.go index cd4e2fb..3bd5526 100644 --- a/pkg/modules/list/key_funcs.go +++ b/pkg/modules/list/key_funcs.go @@ -17,74 +17,115 @@ package list import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" ) -func lpushKeyFunc(cmd []string) ([]string, error) { +func lpushKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func popKeyFunc(cmd []string) ([]string, error) { +func popKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:], + }, nil } -func llenKeyFunc(cmd []string) ([]string, error) { +func llenKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func lrangeKeyFunc(cmd []string) ([]string, error) { +func lrangeKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func lindexKeyFunc(cmd []string) ([]string, error) { +func lindexKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func lsetKeyFunc(cmd []string) ([]string, error) { +func lsetKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func ltrimKeyFunc(cmd []string) ([]string, error) { +func ltrimKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func lremKeyFunc(cmd []string) ([]string, error) { +func lremKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func rpushKeyFunc(cmd []string) ([]string, error) { +func rpushKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func lmoveKeyFunc(cmd []string) ([]string, error) { +func lmoveKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 5 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1], cmd[2]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:3], + }, nil } diff --git a/pkg/modules/pubsub/commands.go b/pkg/modules/pubsub/commands.go index c2b5d4c..6fe9fab 100644 --- a/pkg/modules/pubsub/commands.go +++ b/pkg/modules/pubsub/commands.go @@ -111,12 +111,16 @@ func Commands() []types.Command { Categories: []string{constants.PubSubCategory, constants.ConnectionCategory, constants.SlowCategory}, Description: "(SUBSCRIBE channel [channel ...]) Subscribe to one or more channels.", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { // Treat the channels as keys if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: cmd[1:], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleSubscribe, }, @@ -126,12 +130,16 @@ func Commands() []types.Command { Categories: []string{constants.PubSubCategory, constants.ConnectionCategory, constants.SlowCategory}, Description: "(PSUBSCRIBE pattern [pattern ...]) Subscribe to one or more glob patterns.", Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { // Treat the patterns as keys if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: cmd[1:], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleSubscribe, }, @@ -141,12 +149,16 @@ func Commands() []types.Command { Categories: []string{constants.PubSubCategory, constants.FastCategory}, Description: "(PUBLISH channel message) Publish a message to the specified channel.", Sync: true, - KeyExtractionFunc: func(cmd []string) ([]string, error) { + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { // Treat the channel as a key if len(cmd) != 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: cmd[1:2], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handlePublish, }, @@ -158,9 +170,13 @@ func Commands() []types.Command { If the channel list is not provided, then the connection will be unsubscribed from all the channels that it's currently subscribe to.`, Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { // Treat the channels as keys - return cmd[1:], nil + return types.AccessKeys{ + Channels: cmd[1:], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleUnsubscribe, }, @@ -172,19 +188,28 @@ it's currently subscribe to.`, If the pattern list is not provided, then the connection will be unsubscribed from all the patterns that it's currently subscribe to.`, Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { - // Treat the channels as keys - return cmd[1:], nil + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: cmd[1:], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil }, HandlerFunc: handleUnsubscribe, }, { - Command: "pubsub", - Module: constants.PubSubModule, - Categories: []string{}, - Description: "", - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, + Command: "pubsub", + Module: constants.PubSubModule, + Categories: []string{}, + Description: "", + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, HandlerFunc: func(_ context.Context, _ []string, _ types.EchoVault, _ *net.Conn) ([]byte, error) { return nil, errors.New("provide CHANNELS, NUMPAT, or NUMSUB subcommand") }, @@ -196,18 +221,30 @@ it's currently subscribe to.`, Description: `(PUBSUB CHANNELS [pattern]) Returns an array containing the list of channels that match the given pattern. If no pattern is provided, all active channels are returned. Active channels are channels with 1 or more subscribers.`, - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handlePubSubChannels, + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handlePubSubChannels, }, { - Command: "numpat", - Module: constants.PubSubModule, - Categories: []string{constants.PubSubCategory, constants.SlowCategory}, - Description: `(PUBSUB NUMPAT) Return the number of patterns that are currently subscribed to by clients.`, - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return []string{}, nil }, - HandlerFunc: handlePubSubNumPat, + Command: "numpat", + Module: constants.PubSubModule, + Categories: []string{constants.PubSubCategory, constants.SlowCategory}, + Description: `(PUBSUB NUMPAT) Return the number of patterns that are currently subscribed to by clients.`, + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handlePubSubNumPat, }, { Command: "numsub", @@ -215,9 +252,15 @@ channels with 1 or more subscribers.`, Categories: []string{constants.PubSubCategory, constants.SlowCategory}, Description: `(PUBSUB NUMSUB [channel [channel ...]]) Return an array of arrays containing the provided channel name and how many clients are currently subscribed to the channel.`, - Sync: false, - KeyExtractionFunc: func(cmd []string) ([]string, error) { return cmd[2:], nil }, - HandlerFunc: handlePubSubNumSubs, + Sync: false, + KeyExtractionFunc: func(cmd []string) (types.AccessKeys, error) { + return types.AccessKeys{ + Channels: cmd[2:], + ReadKeys: make([]string, 0), + WriteKeys: make([]string, 0), + }, nil + }, + HandlerFunc: handlePubSubNumSubs, }, }, }, diff --git a/pkg/modules/set/commands.go b/pkg/modules/set/commands.go index 4b37d22..f258283 100644 --- a/pkg/modules/set/commands.go +++ b/pkg/modules/set/commands.go @@ -27,13 +27,13 @@ import ( "strings" ) -func handleSADD(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSADD(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := saddKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] var set *internal_set.Set @@ -64,13 +64,13 @@ func handleSADD(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(fmt.Sprintf(":%d\r\n", count)), nil } -func handleSCARD(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSCARD(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := scardKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(fmt.Sprintf(":0\r\n")), nil @@ -91,23 +91,23 @@ func handleSCARD(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(fmt.Sprintf(":%d\r\n", cardinality)), nil } -func handleSDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSDIFF(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sdiffKeyFunc(cmd) if err != nil { return nil, err } // Extract base set first - if !server.KeyExists(ctx, keys[0]) { - return nil, fmt.Errorf("key for base set \"%s\" does not exist", keys[0]) + if !server.KeyExists(ctx, keys.ReadKeys[0]) { + return nil, fmt.Errorf("key for base set \"%s\" does not exist", keys.ReadKeys[0]) } - if _, err = server.KeyRLock(ctx, keys[0]); err != nil { + if _, err = server.KeyRLock(ctx, keys.ReadKeys[0]); err != nil { return nil, err } - defer server.KeyRUnlock(ctx, keys[0]) - baseSet, ok := server.GetValue(ctx, keys[0]).(*internal_set.Set) + defer server.KeyRUnlock(ctx, keys.ReadKeys[0]) + baseSet, ok := server.GetValue(ctx, keys.ReadKeys[0]).(*internal_set.Set) if !ok { - return nil, fmt.Errorf("value at key %s is not a set", keys[0]) + return nil, fmt.Errorf("value at key %s is not a set", keys.ReadKeys[0]) } locks := make(map[string]bool) @@ -119,7 +119,7 @@ func handleSDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn } }() - for _, key := range keys[1:] { + for _, key := range keys.ReadKeys[1:] { if !server.KeyExists(ctx, key) { continue } @@ -152,25 +152,25 @@ func handleSDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(res), nil } -func handleSDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sdiffstoreKeyFunc(cmd) if err != nil { return nil, err } - destination := keys[0] + destination := keys.WriteKeys[0] // Extract base set first - if !server.KeyExists(ctx, keys[1]) { - return nil, fmt.Errorf("key for base set \"%s\" does not exist", keys[1]) + if !server.KeyExists(ctx, keys.ReadKeys[0]) { + return nil, fmt.Errorf("key for base set \"%s\" does not exist", keys.ReadKeys[0]) } - if _, err := server.KeyRLock(ctx, keys[1]); err != nil { + if _, err := server.KeyRLock(ctx, keys.ReadKeys[0]); err != nil { return nil, err } - defer server.KeyRUnlock(ctx, keys[1]) - baseSet, ok := server.GetValue(ctx, keys[1]).(*internal_set.Set) + defer server.KeyRUnlock(ctx, keys.ReadKeys[0]) + baseSet, ok := server.GetValue(ctx, keys.ReadKeys[0]).(*internal_set.Set) if !ok { - return nil, fmt.Errorf("value at key %s is not a set", keys[1]) + return nil, fmt.Errorf("value at key %s is not a set", keys.ReadKeys[0]) } locks := make(map[string]bool) @@ -182,7 +182,7 @@ func handleSDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, } }() - for _, key := range keys[2:] { + for _, key := range keys.ReadKeys[1:] { if !server.KeyExists(ctx, key) { continue } @@ -193,7 +193,7 @@ func handleSDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, } var sets []*internal_set.Set - for _, key := range keys[2:] { + for _, key := range keys.ReadKeys[1:] { set, ok := server.GetValue(ctx, key).(*internal_set.Set) if !ok { continue @@ -228,7 +228,7 @@ func handleSDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, return []byte(res), nil } -func handleSINTER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSINTER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sinterKeyFunc(cmd) if err != nil { return nil, err @@ -243,7 +243,7 @@ func handleSINTER(ctx context.Context, cmd []string, server types.EchoVault, con } }() - for _, key := range keys[0:] { + for _, key := range keys.ReadKeys { if !server.KeyExists(ctx, key) { // If key does not exist, then there is no intersection return []byte("*0\r\n"), nil @@ -319,7 +319,7 @@ func handleSINTERCARD(ctx context.Context, cmd []string, server types.EchoVault, } }() - for _, key := range keys { + for _, key := range keys.ReadKeys { if !server.KeyExists(ctx, key) { // If key does not exist, then there is no intersection return []byte(":0\r\n"), nil @@ -350,7 +350,7 @@ func handleSINTERCARD(ctx context.Context, cmd []string, server types.EchoVault, return []byte(fmt.Sprintf(":%d\r\n", intersect.Cardinality())), nil } -func handleSINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sinterstoreKeyFunc(cmd) if err != nil { return nil, err @@ -365,7 +365,7 @@ func handleSINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault } }() - for _, key := range keys[1:] { + for _, key := range keys.ReadKeys { if !server.KeyExists(ctx, key) { // If key does not exist, then there is no intersection return []byte(":0\r\n"), nil @@ -388,7 +388,7 @@ func handleSINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault } intersect, _ := internal_set.Intersection(0, sets...) - destination := keys[0] + destination := keys.WriteKeys[0] if server.KeyExists(ctx, destination) { if _, err = server.KeyLock(ctx, destination); err != nil { @@ -408,13 +408,13 @@ func handleSINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault return []byte(fmt.Sprintf(":%d\r\n", intersect.Cardinality())), nil } -func handleSISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sismemberKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -437,13 +437,13 @@ func handleSISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, return []byte(":1\r\n"), nil } -func handleSMEMBERS(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSMEMBERS(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := smembersKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("*0\r\n"), nil @@ -472,13 +472,13 @@ func handleSMEMBERS(ctx context.Context, cmd []string, server types.EchoVault, c return []byte(res), nil } -func handleSMISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSMISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := smismemberKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] members := cmd[2:] if !server.KeyExists(ctx, key) { @@ -515,14 +515,13 @@ func handleSMISMEMBER(ctx context.Context, cmd []string, server types.EchoVault, return []byte(res), nil } -func handleSMOVE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSMOVE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := smoveKeyFunc(cmd) if err != nil { return nil, err } - source := keys[0] - destination := keys[1] + source, destination := keys.WriteKeys[0], keys.WriteKeys[1] member := cmd[3] if !server.KeyExists(ctx, source) { @@ -569,13 +568,13 @@ func handleSMOVE(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(fmt.Sprintf(":%d\r\n", res)), nil } -func handleSPOP(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSPOP(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := spopKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] count := 1 if len(cmd) == 3 { @@ -613,13 +612,13 @@ func handleSPOP(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(res), nil } -func handleSRANDMEMBER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSRANDMEMBER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := srandmemberKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] count := 1 if len(cmd) == 3 { @@ -657,13 +656,13 @@ func handleSRANDMEMBER(ctx context.Context, cmd []string, server types.EchoVault return []byte(res), nil } -func handleSREM(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSREM(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sremKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] members := cmd[2:] if !server.KeyExists(ctx, key) { @@ -685,7 +684,7 @@ func handleSREM(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(fmt.Sprintf(":%d\r\n", count)), nil } -func handleSUNION(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSUNION(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sunionKeyFunc(cmd) if err != nil { return nil, err @@ -700,7 +699,7 @@ func handleSUNION(ctx context.Context, cmd []string, server types.EchoVault, con } }() - for _, key := range keys { + for _, key := range keys.ReadKeys { if !server.KeyExists(ctx, key) { continue } @@ -736,7 +735,7 @@ func handleSUNION(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(res), nil } -func handleSUNIONSTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSUNIONSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := sunionstoreKeyFunc(cmd) if err != nil { return nil, err @@ -751,7 +750,7 @@ func handleSUNIONSTORE(ctx context.Context, cmd []string, server types.EchoVault } }() - for _, key := range keys[1:] { + for _, key := range keys.ReadKeys { if !server.KeyExists(ctx, key) { continue } @@ -776,7 +775,7 @@ func handleSUNIONSTORE(ctx context.Context, cmd []string, server types.EchoVault union := internal_set.Union(sets...) - destination := cmd[1] + destination := keys.WriteKeys[0] if server.KeyExists(ctx, destination) { if _, err = server.KeyLock(ctx, destination); err != nil { diff --git a/pkg/modules/set/key_funcs.go b/pkg/modules/set/key_funcs.go index ab8bf1e..36910de 100644 --- a/pkg/modules/set/key_funcs.go +++ b/pkg/modules/set/key_funcs.go @@ -17,48 +17,69 @@ package set import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" "slices" "strings" ) -func saddKeyFunc(cmd []string) ([]string, error) { +func saddKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func scardKeyFunc(cmd []string) ([]string, error) { +func scardKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func sdiffKeyFunc(cmd []string) ([]string, error) { +func sdiffKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func sdiffstoreKeyFunc(cmd []string) ([]string, error) { +func sdiffstoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } -func sinterKeyFunc(cmd []string) ([]string, error) { +func sinterKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func sintercardKeyFunc(cmd []string) ([]string, error) { +func sintercardKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } limitIdx := slices.IndexFunc(cmd, func(s string) bool { @@ -66,78 +87,126 @@ func sintercardKeyFunc(cmd []string) ([]string, error) { }) if limitIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } - return cmd[1:limitIdx], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:limitIdx], + WriteKeys: make([]string, 0), + }, nil } -func sinterstoreKeyFunc(cmd []string) ([]string, error) { +func sinterstoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } -func sismemberKeyFunc(cmd []string) ([]string, error) { +func sismemberKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func smembersKeyFunc(cmd []string) ([]string, error) { +func smembersKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func smismemberKeyFunc(cmd []string) ([]string, error) { +func smismemberKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func smoveKeyFunc(cmd []string) ([]string, error) { +func smoveKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:3], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:3], + }, nil } -func spopKeyFunc(cmd []string) ([]string, error) { +func spopKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 || len(cmd) > 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func srandmemberKeyFunc(cmd []string) ([]string, error) { +func srandmemberKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 || len(cmd) > 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func sremKeyFunc(cmd []string) ([]string, error) { +func sremKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func sunionKeyFunc(cmd []string) ([]string, error) { +func sunionKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func sunionstoreKeyFunc(cmd []string) ([]string, error) { +func sunionstoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } diff --git a/pkg/modules/sorted_set/commands.go b/pkg/modules/sorted_set/commands.go index b3708b4..325844c 100644 --- a/pkg/modules/sorted_set/commands.go +++ b/pkg/modules/sorted_set/commands.go @@ -36,7 +36,7 @@ func handleZADD(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.WriteKeys[0] var updatePolicy interface{} = nil var comparison interface{} = nil @@ -181,12 +181,12 @@ func handleZADD(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return []byte(fmt.Sprintf(":%d\r\n", set.Cardinality())), nil } -func handleZCARD(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZCARD(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zcardKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -205,13 +205,13 @@ func handleZCARD(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(fmt.Sprintf(":%d\r\n", set.Cardinality())), nil } -func handleZCOUNT(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZCOUNT(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zcountKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] minimum := sorted_set.Score(math.Inf(-1)) switch internal.AdaptType(cmd[2]).(type) { @@ -279,7 +279,7 @@ func handleZLEXCOUNT(ctx context.Context, cmd []string, server types.EchoVault, return nil, err } - key := keys[0] + key := keys.ReadKeys[0] minimum := cmd[2] maximum := cmd[3] @@ -318,7 +318,7 @@ func handleZLEXCOUNT(ctx context.Context, cmd []string, server types.EchoVault, return []byte(fmt.Sprintf(":%d\r\n", count)), nil } -func handleZDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZDIFF(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zdiffKeyFunc(cmd) if err != nil { return nil, err @@ -341,34 +341,34 @@ func handleZDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn }() // Extract base set - if !server.KeyExists(ctx, keys[0]) { + if !server.KeyExists(ctx, keys.ReadKeys[0]) { // If base set does not exist, return an empty array return []byte("*0\r\n"), nil } - if _, err = server.KeyRLock(ctx, keys[0]); err != nil { + if _, err = server.KeyRLock(ctx, keys.ReadKeys[0]); err != nil { return nil, err } - defer server.KeyRUnlock(ctx, keys[0]) - baseSortedSet, ok := server.GetValue(ctx, keys[0]).(*sorted_set.SortedSet) + defer server.KeyRUnlock(ctx, keys.ReadKeys[0]) + baseSortedSet, ok := server.GetValue(ctx, keys.ReadKeys[0]).(*sorted_set.SortedSet) if !ok { - return nil, fmt.Errorf("value at %s is not a sorted set", keys[0]) + return nil, fmt.Errorf("value at %s is not a sorted set", keys.ReadKeys[0]) } // Extract the remaining sets var sets []*sorted_set.SortedSet - for i := 1; i < len(keys); i++ { - if !server.KeyExists(ctx, keys[i]) { + for i := 1; i < len(keys.ReadKeys); i++ { + if !server.KeyExists(ctx, keys.ReadKeys[i]) { continue } - locked, err := server.KeyRLock(ctx, keys[i]) + locked, err := server.KeyRLock(ctx, keys.ReadKeys[i]) if err != nil { return nil, err } - locks[keys[i]] = locked - set, ok := server.GetValue(ctx, keys[i]).(*sorted_set.SortedSet) + locks[keys.ReadKeys[i]] = locked + set, ok := server.GetValue(ctx, keys.ReadKeys[i]).(*sorted_set.SortedSet) if !ok { - return nil, fmt.Errorf("value at %s is not a sorted set", keys[i]) + return nil, fmt.Errorf("value at %s is not a sorted set", keys.ReadKeys[i]) } sets = append(sets, set) } @@ -391,13 +391,13 @@ func handleZDIFF(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(res), nil } -func handleZDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zdiffstoreKeyFunc(cmd) if err != nil { return nil, err } - destination := cmd[1] + destination := keys.WriteKeys[0] locks := make(map[string]bool) defer func() { @@ -409,29 +409,29 @@ func handleZDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, }() // Extract base set - if !server.KeyExists(ctx, keys[0]) { + if !server.KeyExists(ctx, keys.ReadKeys[0]) { // If base set does not exist, return 0 return []byte(":0\r\n"), nil } - if _, err = server.KeyRLock(ctx, keys[0]); err != nil { + if _, err = server.KeyRLock(ctx, keys.ReadKeys[0]); err != nil { return nil, err } - defer server.KeyRUnlock(ctx, keys[0]) - baseSortedSet, ok := server.GetValue(ctx, keys[0]).(*sorted_set.SortedSet) + defer server.KeyRUnlock(ctx, keys.ReadKeys[0]) + baseSortedSet, ok := server.GetValue(ctx, keys.ReadKeys[0]).(*sorted_set.SortedSet) if !ok { - return nil, fmt.Errorf("value at %s is not a sorted set", keys[0]) + return nil, fmt.Errorf("value at %s is not a sorted set", keys.ReadKeys[0]) } var sets []*sorted_set.SortedSet - for i := 1; i < len(keys); i++ { - if server.KeyExists(ctx, keys[i]) { - if _, err = server.KeyRLock(ctx, keys[i]); err != nil { + for i := 1; i < len(keys.ReadKeys); i++ { + if server.KeyExists(ctx, keys.ReadKeys[i]) { + if _, err = server.KeyRLock(ctx, keys.ReadKeys[i]); err != nil { return nil, err } - set, ok := server.GetValue(ctx, keys[i]).(*sorted_set.SortedSet) + set, ok := server.GetValue(ctx, keys.ReadKeys[i]).(*sorted_set.SortedSet) if !ok { - return nil, fmt.Errorf("value at %s is not a sorted set", keys[i]) + return nil, fmt.Errorf("value at %s is not a sorted set", keys.ReadKeys[i]) } sets = append(sets, set) } @@ -457,13 +457,13 @@ func handleZDIFFSTORE(ctx context.Context, cmd []string, server types.EchoVault, return []byte(fmt.Sprintf(":%d\r\n", diff.Cardinality())), nil } -func handleZINCRBY(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZINCRBY(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zincrbyKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] member := sorted_set.Value(cmd[3]) var increment sorted_set.Score @@ -524,8 +524,8 @@ func handleZINCRBY(ctx context.Context, cmd []string, server types.EchoVault, co strconv.FormatFloat(float64(set.Get(member).Score), 'f', -1, 64))), nil } -func handleZINTER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { - keys, err := zinterKeyFunc(cmd) +func handleZINTER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { + _, err := zinterKeyFunc(cmd) if err != nil { return nil, err } @@ -584,13 +584,13 @@ func handleZINTER(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(res), nil } -func handleZINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { - keys, err := zinterstoreKeyFunc(cmd) +func handleZINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { + k, err := zinterstoreKeyFunc(cmd) if err != nil { return nil, err } - destination := keys[0] + destination := k.WriteKeys[0] // Remove the destination keys from the command before parsing it cmd = slices.DeleteFunc(cmd, func(s string) bool { @@ -651,7 +651,7 @@ func handleZINTERSTORE(ctx context.Context, cmd []string, server types.EchoVault return []byte(fmt.Sprintf(":%d\r\n", intersect.Cardinality())), nil } -func handleZMPOP(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZMPOP(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zmpopKeyFunc(cmd) if err != nil { return nil, err @@ -697,22 +697,22 @@ func handleZMPOP(ctx context.Context, cmd []string, server types.EchoVault, conn } } - for i := 0; i < len(keys); i++ { - if server.KeyExists(ctx, keys[i]) { - if _, err = server.KeyLock(ctx, keys[i]); err != nil { + for i := 0; i < len(keys.WriteKeys); i++ { + if server.KeyExists(ctx, keys.WriteKeys[i]) { + if _, err = server.KeyLock(ctx, keys.WriteKeys[i]); err != nil { continue } - v, ok := server.GetValue(ctx, keys[i]).(*sorted_set.SortedSet) + v, ok := server.GetValue(ctx, keys.WriteKeys[i]).(*sorted_set.SortedSet) if !ok || v.Cardinality() == 0 { - server.KeyUnlock(ctx, keys[i]) + server.KeyUnlock(ctx, keys.WriteKeys[i]) continue } popped, err := v.Pop(count, policy) if err != nil { - server.KeyUnlock(ctx, keys[i]) + server.KeyUnlock(ctx, keys.WriteKeys[i]) return nil, err } - server.KeyUnlock(ctx, keys[i]) + server.KeyUnlock(ctx, keys.WriteKeys[i]) res := fmt.Sprintf("*%d", popped.Cardinality()) @@ -729,13 +729,13 @@ func handleZMPOP(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte("*0\r\n"), nil } -func handleZPOP(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZPOP(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zpopKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] count := 1 policy := "min" @@ -782,13 +782,13 @@ func handleZPOP(ctx context.Context, cmd []string, server types.EchoVault, conn return []byte(res), nil } -func handleZMSCORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZMSCORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zmscoreKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("*0\r\n"), nil @@ -824,13 +824,13 @@ func handleZMSCORE(ctx context.Context, cmd []string, server types.EchoVault, co return []byte(res), nil } -func handleZRANDMEMBER(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZRANDMEMBER(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zrandmemberKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] count := 1 if len(cmd) >= 3 { @@ -888,7 +888,7 @@ func handleZRANK(ctx context.Context, cmd []string, server types.EchoVault, _ *n return nil, err } - key := keys[0] + key := keys.ReadKeys[0] member := cmd[2] withscores := false @@ -938,7 +938,7 @@ func handleZREM(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return nil, err } - key := keys[0] + key := keys.WriteKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -964,13 +964,13 @@ func handleZREM(ctx context.Context, cmd []string, server types.EchoVault, _ *ne return []byte(fmt.Sprintf(":%d\r\n", deletedCount)), nil } -func handleZSCORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZSCORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zscoreKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte("$-1\r\n"), nil @@ -993,13 +993,13 @@ func handleZSCORE(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(fmt.Sprintf("$%d\r\n%s\r\n", len(score), score)), nil } -func handleZREMRANGEBYSCORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZREMRANGEBYSCORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zremrangebyscoreKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] deletedCount := 0 @@ -1037,13 +1037,13 @@ func handleZREMRANGEBYSCORE(ctx context.Context, cmd []string, server types.Echo return []byte(fmt.Sprintf(":%d\r\n", deletedCount)), nil } -func handleZREMRANGEBYRANK(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZREMRANGEBYRANK(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zremrangebyrankKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] start, err := strconv.Atoi(cmd[2]) if err != nil { @@ -1102,13 +1102,13 @@ func handleZREMRANGEBYRANK(ctx context.Context, cmd []string, server types.EchoV return []byte(fmt.Sprintf(":%d\r\n", deletedCount)), nil } -func handleZREMRANGEBYLEX(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZREMRANGEBYLEX(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zremrangebylexKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] minimum := cmd[2] maximum := cmd[3] @@ -1149,13 +1149,13 @@ func handleZREMRANGEBYLEX(ctx context.Context, cmd []string, server types.EchoVa return []byte(fmt.Sprintf(":%d\r\n", deletedCount)), nil } -func handleZRANGE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZRANGE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zrangeKeyCount(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] policy := "byscore" scoreStart := math.Inf(-1) // Lower bound if policy is "byscore" scoreStop := math.Inf(1) // Upper bound if policy is "byscore" @@ -1289,14 +1289,14 @@ func handleZRANGE(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(res), nil } -func handleZRANGESTORE(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZRANGESTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := zrangeStoreKeyFunc(cmd) if err != nil { return nil, err } - destination := keys[0] - source := keys[1] + destination := keys.WriteKeys[0] + source := keys.ReadKeys[0] policy := "byscore" scoreStart := math.Inf(-1) // Lower bound if policy is "byscore" scoreStop := math.Inf(1) // Upper bound if policy is "byfloat" @@ -1431,7 +1431,7 @@ func handleZRANGESTORE(ctx context.Context, cmd []string, server types.EchoVault return []byte(fmt.Sprintf(":%d\r\n", newSortedSet.Cardinality())), nil } -func handleZUNION(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleZUNION(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { if _, err := zunionKeyFunc(cmd); err != nil { return nil, err } @@ -1486,12 +1486,12 @@ func handleZUNION(ctx context.Context, cmd []string, server types.EchoVault, con } func handleZUNIONSTORE(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { - keys, err := zunionstoreKeyFunc(cmd) + k, err := zunionstoreKeyFunc(cmd) if err != nil { return nil, err } - destination := keys[0] + destination := k.WriteKeys[0] // Remove destination key from list of keys cmd = slices.DeleteFunc(cmd, func(s string) bool { diff --git a/pkg/modules/sorted_set/key_funcs.go b/pkg/modules/sorted_set/key_funcs.go index cbee3f7..0a65583 100644 --- a/pkg/modules/sorted_set/key_funcs.go +++ b/pkg/modules/sorted_set/key_funcs.go @@ -17,34 +17,47 @@ package sorted_set import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" "slices" "strings" ) -func zaddKeyFunc(cmd []string) ([]string, error) { +func zaddKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zcardKeyFunc(cmd []string) ([]string, error) { +func zcardKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } -func zcountKeyFunc(cmd []string) ([]string, error) { +func zcountKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zdiffKeyFunc(cmd []string) ([]string, error) { +func zdiffKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } withscoresIndex := slices.IndexFunc(cmd, func(s string) bool { @@ -52,29 +65,45 @@ func zdiffKeyFunc(cmd []string) ([]string, error) { }) if withscoresIndex == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } - return cmd[1:withscoresIndex], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:withscoresIndex], + WriteKeys: make([]string, 0), + }, nil } -func zdiffstoreKeyFunc(cmd []string) ([]string, error) { +func zdiffstoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[2:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } -func zincrbyKeyFunc(cmd []string) ([]string, error) { +func zincrbyKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zinterKeyFunc(cmd []string) ([]string, error) { +func zinterKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } endIdx := slices.IndexFunc(cmd[1:], func(s string) bool { if strings.EqualFold(s, "WEIGHTS") || @@ -85,17 +114,25 @@ func zinterKeyFunc(cmd []string) ([]string, error) { return false }) if endIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } if endIdx >= 1 { - return cmd[1:endIdx], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:endIdx], + WriteKeys: make([]string, 0), + }, nil } - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } -func zinterstoreKeyFunc(cmd []string) ([]string, error) { - if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) +func zinterstoreKeyFunc(cmd []string) (types.AccessKeys, error) { + if len(cmd) < 3 { + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } endIdx := slices.IndexFunc(cmd[1:], func(s string) bool { if strings.EqualFold(s, "WEIGHTS") || @@ -106,124 +143,192 @@ func zinterstoreKeyFunc(cmd []string) ([]string, error) { return false }) if endIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } - if endIdx >= 2 { - return cmd[1:endIdx], nil + if endIdx >= 3 { + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:endIdx], + WriteKeys: cmd[1:2], + }, nil } - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } -func zmpopKeyFunc(cmd []string) ([]string, error) { +func zmpopKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } endIdx := slices.IndexFunc(cmd, func(s string) bool { return slices.Contains([]string{"MIN", "MAX", "COUNT"}, strings.ToUpper(s)) }) if endIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:], + }, nil } if endIdx >= 2 { - return cmd[1:endIdx], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:endIdx], + }, nil } - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } -func zmscoreKeyFunc(cmd []string) ([]string, error) { +func zmscoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zpopKeyFunc(cmd []string) ([]string, error) { +func zpopKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 || len(cmd) > 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zrandmemberKeyFunc(cmd []string) ([]string, error) { +func zrandmemberKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 || len(cmd) > 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zrankKeyFunc(cmd []string) ([]string, error) { +func zrankKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 || len(cmd) > 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zremKeyFunc(cmd []string) ([]string, error) { +func zremKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zrevrankKeyFunc(cmd []string) ([]string, error) { +func zrevrankKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zscoreKeyFunc(cmd []string) ([]string, error) { +func zscoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 3 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zremrangebylexKeyFunc(cmd []string) ([]string, error) { +func zremrangebylexKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zremrangebyrankKeyFunc(cmd []string) ([]string, error) { +func zremrangebyrankKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zremrangebyscoreKeyFunc(cmd []string) ([]string, error) { +func zremrangebyscoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func zlexcountKeyFunc(cmd []string) ([]string, error) { +func zlexcountKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zrangeKeyCount(cmd []string) ([]string, error) { +func zrangeKeyCount(cmd []string) (types.AccessKeys, error) { if len(cmd) < 4 || len(cmd) > 10 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:2], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func zrangeStoreKeyFunc(cmd []string) ([]string, error) { +func zrangeStoreKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 5 || len(cmd) > 11 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return cmd[1:3], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:3], + WriteKeys: cmd[1:2], + }, nil } -func zunionKeyFunc(cmd []string) ([]string, error) { +func zunionKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } endIdx := slices.IndexFunc(cmd[1:], func(s string) bool { if strings.EqualFold(s, "WEIGHTS") || @@ -234,17 +339,25 @@ func zunionKeyFunc(cmd []string) ([]string, error) { return false }) if endIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:], + WriteKeys: make([]string, 0), + }, nil } if endIdx >= 1 { - return cmd[1:endIdx], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:endIdx], + WriteKeys: cmd[1:endIdx], + }, nil } - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } -func zunionstoreKeyFunc(cmd []string) ([]string, error) { - if len(cmd) < 2 { - return nil, errors.New(constants.WrongArgsResponse) +func zunionstoreKeyFunc(cmd []string) (types.AccessKeys, error) { + if len(cmd) < 3 { + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } endIdx := slices.IndexFunc(cmd[1:], func(s string) bool { if strings.EqualFold(s, "WEIGHTS") || @@ -255,10 +368,18 @@ func zunionstoreKeyFunc(cmd []string) ([]string, error) { return false }) if endIdx == -1 { - return cmd[1:], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:], + WriteKeys: cmd[1:2], + }, nil } if endIdx >= 1 { - return cmd[1:endIdx], nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[2:endIdx], + WriteKeys: cmd[1:2], + }, nil } - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } diff --git a/pkg/modules/string/commands.go b/pkg/modules/string/commands.go index d498e81..b1586a8 100644 --- a/pkg/modules/string/commands.go +++ b/pkg/modules/string/commands.go @@ -24,13 +24,13 @@ import ( "net" ) -func handleSetRange(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSetRange(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := setRangeKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.WriteKeys[0] offset, ok := internal.AdaptType(cmd[2]).(int) if !ok { @@ -105,7 +105,7 @@ func handleStrLen(ctx context.Context, cmd []string, server types.EchoVault, con return nil, err } - key := keys[0] + key := keys.ReadKeys[0] if !server.KeyExists(ctx, key) { return []byte(":0\r\n"), nil @@ -125,13 +125,13 @@ func handleStrLen(ctx context.Context, cmd []string, server types.EchoVault, con return []byte(fmt.Sprintf(":%d\r\n", len(value))), nil } -func handleSubStr(ctx context.Context, cmd []string, server types.EchoVault, conn *net.Conn) ([]byte, error) { +func handleSubStr(ctx context.Context, cmd []string, server types.EchoVault, _ *net.Conn) ([]byte, error) { keys, err := subStrKeyFunc(cmd) if err != nil { return nil, err } - key := keys[0] + key := keys.ReadKeys[0] start, startOk := internal.AdaptType(cmd[2]).(int) end, endOk := internal.AdaptType(cmd[3]).(int) diff --git a/pkg/modules/string/key_funcs.go b/pkg/modules/string/key_funcs.go index 97cb380..92e5736 100644 --- a/pkg/modules/string/key_funcs.go +++ b/pkg/modules/string/key_funcs.go @@ -17,25 +17,38 @@ package str import ( "errors" "github.com/echovault/echovault/pkg/constants" + "github.com/echovault/echovault/pkg/types" ) -func setRangeKeyFunc(cmd []string) ([]string, error) { +func setRangeKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: make([]string, 0), + WriteKeys: cmd[1:2], + }, nil } -func strLenKeyFunc(cmd []string) ([]string, error) { +func strLenKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 2 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil } -func subStrKeyFunc(cmd []string) ([]string, error) { +func subStrKeyFunc(cmd []string) (types.AccessKeys, error) { if len(cmd) != 4 { - return nil, errors.New(constants.WrongArgsResponse) + return types.AccessKeys{}, errors.New(constants.WrongArgsResponse) } - return []string{cmd[1]}, nil + return types.AccessKeys{ + Channels: make([]string, 0), + ReadKeys: cmd[1:2], + WriteKeys: make([]string, 0), + }, nil }