diff --git a/coverage/coverage.out b/coverage/coverage.out index 85c6aaa6..16195ee3 100644 --- a/coverage/coverage.out +++ b/coverage/coverage.out @@ -21,9 +21,9 @@ github.com/echovault/echovault/internal/aof/log/store.go:98.17,100.4 1 0 github.com/echovault/echovault/internal/aof/log/store.go:101.3,101.15 1 1 github.com/echovault/echovault/internal/aof/log/store.go:106.2,106.51 1 1 github.com/echovault/echovault/internal/aof/log/store.go:106.51,107.13 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 1 -github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 1 -github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 1 +github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 0 +github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 0 +github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 0 github.com/echovault/echovault/internal/aof/log/store.go:115.5,116.41 2 0 github.com/echovault/echovault/internal/aof/log/store.go:121.2,121.19 1 1 github.com/echovault/echovault/internal/aof/log/store.go:124.55,126.21 1 1 @@ -54,6 +54,54 @@ github.com/echovault/echovault/internal/aof/log/store.go:191.2,191.47 1 0 github.com/echovault/echovault/internal/aof/log/store.go:191.47,193.3 1 0 github.com/echovault/echovault/internal/aof/log/store.go:194.2,194.12 1 0 github.com/echovault/echovault/internal/aof/log/store.go:197.41,201.2 3 1 +github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1 +github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1 +github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0 +github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0 +github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0 +github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0 +github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0 +github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1 +github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1 +github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1 +github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1 +github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1 +github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1 +github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1 +github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0 +github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1 +github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1 +github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1 +github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1 +github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1 +github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1 +github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1 +github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0 +github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1 github.com/echovault/echovault/internal/config/config.go:64.34,70.24 3 0 github.com/echovault/echovault/internal/config/config.go:70.24,72.35 2 0 github.com/echovault/echovault/internal/config/config.go:72.35,74.5 1 0 @@ -95,13 +143,6 @@ github.com/echovault/echovault/internal/config/config.go:247.2,249.45 2 0 github.com/echovault/echovault/internal/config/config.go:249.45,251.3 1 0 github.com/echovault/echovault/internal/config/config.go:253.2,253.18 1 0 github.com/echovault/echovault/internal/config/default.go:8.29,38.2 1 0 -github.com/echovault/echovault/internal/clock/clock.go:14.23,16.43 1 0 -github.com/echovault/echovault/internal/clock/clock.go:16.43,18.3 1 0 -github.com/echovault/echovault/internal/clock/clock.go:19.2,19.20 1 0 -github.com/echovault/echovault/internal/clock/clock.go:24.34,26.2 1 0 -github.com/echovault/echovault/internal/clock/clock.go:28.58,30.2 1 0 -github.com/echovault/echovault/internal/clock/clock.go:34.34,37.2 2 0 -github.com/echovault/echovault/internal/clock/clock.go:39.58,41.2 1 0 github.com/echovault/echovault/internal/aof/preamble/store.go:45.62,46.36 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:46.36,48.3 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:51.71,52.36 1 0 @@ -157,6 +198,13 @@ github.com/echovault/echovault/internal/aof/preamble/store.go:185.43,187.4 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:189.2,189.35 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:189.35,191.3 1 1 github.com/echovault/echovault/internal/aof/preamble/store.go:192.2,192.14 1 1 +github.com/echovault/echovault/internal/clock/clock.go:14.23,16.43 1 0 +github.com/echovault/echovault/internal/clock/clock.go:16.43,18.3 1 0 +github.com/echovault/echovault/internal/clock/clock.go:19.2,19.20 1 0 +github.com/echovault/echovault/internal/clock/clock.go:24.34,26.2 1 0 +github.com/echovault/echovault/internal/clock/clock.go:28.58,30.2 1 0 +github.com/echovault/echovault/internal/clock/clock.go:34.34,37.2 2 0 +github.com/echovault/echovault/internal/clock/clock.go:39.58,41.2 1 0 github.com/echovault/echovault/internal/eviction/lfu.go:35.29,42.2 3 1 github.com/echovault/echovault/internal/eviction/lfu.go:44.34,46.2 1 1 github.com/echovault/echovault/internal/eviction/lfu.go:48.44,50.54 1 1 @@ -191,119 +239,6 @@ github.com/echovault/echovault/internal/eviction/lru.go:92.73,94.3 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.2,95.19 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.19,97.3 1 0 github.com/echovault/echovault/internal/eviction/lru.go:100.50,103.2 2 1 -github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1 -github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1 -github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0 -github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0 -github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0 -github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0 -github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0 -github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1 -github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1 -github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1 -github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1 -github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1 -github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1 -github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1 -github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0 -github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1 -github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1 -github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1 -github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1 -github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1 -github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1 -github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1 -github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0 -github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1 -github.com/echovault/echovault/internal/memberlist/broadcast.go:32.88,35.9 2 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:35.9,37.3 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:39.2,39.33 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:40.18,42.56 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:43.20,45.62 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:46.10,47.15 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:52.60,55.16 2 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:55.16,58.3 2 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:60.2,60.12 1 0 -github.com/echovault/echovault/internal/memberlist/broadcast.go:64.55,66.2 0 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:42.47,46.2 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:49.54,59.16 3 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:59.16,61.3 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:63.2,63.10 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:67.54,70.55 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:70.55,73.3 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:75.2,75.20 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:76.18,78.39 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:78.39,81.4 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:82.3,83.17 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:83.17,85.4 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:87.19,89.39 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:89.39,92.4 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:94.3,100.67 3 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:100.67,102.4 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:104.20,106.39 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:106.39,109.4 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:111.3,116.17 3 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:116.17,119.4 2 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:121.3,121.67 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:121.67,123.4 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:128.71,130.2 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:133.56,136.2 1 0 -github.com/echovault/echovault/internal/memberlist/delegate.go:139.68,141.2 0 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:33.62,37.2 1 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:40.71,42.2 1 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:45.72,52.16 4 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:52.16,55.3 2 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:57.2,59.16 2 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:59.16,61.3 1 0 -github.com/echovault/echovault/internal/memberlist/event_delegate.go:65.74,67.2 0 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:54.43,60.2 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:62.58,77.28 7 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:77.28,77.49 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:78.28,78.49 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:82.2,83.41 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:83.41,85.3 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:87.2,90.16 3 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:90.16,92.3 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:94.2,94.37 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:94.37,97.70 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:97.70,99.18 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:99.18,101.5 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:102.4,102.14 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:105.3,105.17 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:105.17,107.4 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:109.3,109.27 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:113.45,123.2 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:127.72,140.2 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:144.75,157.2 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:159.43,162.16 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:162.16,164.3 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:166.2,167.16 2 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:167.16,169.3 1 0 -github.com/echovault/echovault/internal/memberlist/memberlist.go:171.2,171.49 1 0 github.com/echovault/echovault/internal/modules/acl/acl.go:52.40,57.24 3 1 github.com/echovault/echovault/internal/modules/acl/acl.go:57.24,65.3 2 1 github.com/echovault/echovault/internal/modules/acl/acl.go:68.2,68.28 1 1 @@ -1069,7 +1004,7 @@ github.com/echovault/echovault/internal/modules/hash/commands.go:301.38,303.17 2 github.com/echovault/echovault/internal/modules/hash/commands.go:303.17,304.41 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:304.41,306.13 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:308.4,308.42 1 1 -github.com/echovault/echovault/internal/modules/hash/commands.go:308.42,311.13 3 0 +github.com/echovault/echovault/internal/modules/hash/commands.go:308.42,311.13 3 1 github.com/echovault/echovault/internal/modules/hash/commands.go:313.4,313.38 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:313.38,315.13 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:320.2,320.25 1 1 @@ -1389,99 +1324,6 @@ github.com/echovault/echovault/internal/modules/list/key_funcs.go:115.2,119.8 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:122.75,123.19 1 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:123.19,125.3 1 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:126.2,130.8 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:361.86,365.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:366.75,367.35 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:367.35,369.8 1 0 -github.com/echovault/echovault/internal/modules/admin/commands.go:370.7,371.47 2 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:380.86,384.7 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:385.75,388.38 3 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:388.38,390.8 1 1 -github.com/echovault/echovault/internal/modules/admin/commands.go:391.7,391.30 1 1 github.com/echovault/echovault/internal/modules/pubsub/channel.go:34.51,35.32 1 1 github.com/echovault/echovault/internal/modules/pubsub/channel.go:35.32,37.3 1 1 github.com/echovault/echovault/internal/modules/pubsub/channel.go:41.57,42.32 1 1 @@ -1925,6 +1767,99 @@ github.com/echovault/echovault/internal/modules/set/set.go:184.31,185.19 1 1 github.com/echovault/echovault/internal/modules/set/set.go:186.9,187.17 1 1 github.com/echovault/echovault/internal/modules/set/set.go:188.9,191.15 3 1 github.com/echovault/echovault/internal/modules/set/set.go:192.10,195.28 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:361.86,365.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:366.75,367.35 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:367.35,369.8 1 0 +github.com/echovault/echovault/internal/modules/admin/commands.go:370.7,371.47 2 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:380.86,384.7 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:385.75,388.38 3 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:388.38,390.8 1 1 +github.com/echovault/echovault/internal/modules/admin/commands.go:391.7,391.30 1 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:29.68,31.16 2 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:31.16,33.3 1 0 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:35.2,45.43 8 1 @@ -2748,6 +2683,69 @@ github.com/echovault/echovault/internal/modules/sorted_set/utils.go:162.3,162.13 github.com/echovault/echovault/internal/modules/sorted_set/utils.go:163.12,164.16 1 1 github.com/echovault/echovault/internal/modules/sorted_set/utils.go:164.16,166.4 1 1 github.com/echovault/echovault/internal/modules/sorted_set/utils.go:167.3,167.13 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:24.72,26.16 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:26.16,28.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:30.2,34.9 4 1 +github.com/echovault/echovault/internal/modules/string/commands.go:34.9,36.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:38.2,40.16 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:40.16,42.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:44.2,45.9 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:45.9,47.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:50.2,50.24 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:50.24,52.94 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:52.94,54.4 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:55.3,55.58 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:59.2,59.16 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:59.16,61.94 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:61.94,63.4 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:64.3,64.58 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:67.2,69.35 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:69.35,71.24 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:71.24,74.12 3 1 +github.com/echovault/echovault/internal/modules/string/commands.go:77.3,78.8 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:81.2,81.103 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:81.103,83.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:85.2,85.59 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:88.70,90.16 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:90.16,92.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:94.2,97.16 3 1 +github.com/echovault/echovault/internal/modules/string/commands.go:97.16,99.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:101.2,103.9 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:103.9,105.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:107.2,107.56 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:110.70,112.16 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:112.16,114.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:116.2,123.24 6 1 +github.com/echovault/echovault/internal/modules/string/commands.go:123.24,125.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:127.2,127.16 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:127.16,129.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:131.2,132.9 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:132.9,134.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:136.2,136.15 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:136.15,138.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:139.2,139.13 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:139.13,141.3 1 0 +github.com/echovault/echovault/internal/modules/string/commands.go:143.2,143.30 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:143.30,145.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:147.2,147.22 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:147.22,149.3 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:151.2,151.17 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:151.17,154.3 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:156.2,158.14 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:158.14,160.38 2 1 +github.com/echovault/echovault/internal/modules/string/commands.go:160.38,162.4 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:163.3,163.12 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:166.2,166.65 1 1 +github.com/echovault/echovault/internal/modules/string/commands.go:169.36,209.2 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:23.78,24.19 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:24.19,26.3 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:27.2,31.8 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:34.76,35.19 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:35.19,37.3 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:38.2,42.8 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:45.76,46.19 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:46.19,48.3 1 1 +github.com/echovault/echovault/internal/modules/string/key_funcs.go:49.2,53.8 1 1 github.com/echovault/echovault/internal/snapshot/snapshot.go:55.56,56.30 1 1 github.com/echovault/echovault/internal/snapshot/snapshot.go:56.30,58.3 1 1 github.com/echovault/echovault/internal/snapshot/snapshot.go:61.59,62.30 1 1 @@ -2850,225 +2848,82 @@ github.com/echovault/echovault/internal/snapshot/snapshot.go:354.94,356.3 1 1 github.com/echovault/echovault/internal/snapshot/snapshot.go:358.2,360.12 2 1 github.com/echovault/echovault/internal/snapshot/snapshot.go:363.46,365.2 1 0 github.com/echovault/echovault/internal/snapshot/snapshot.go:367.42,369.2 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:24.72,26.16 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:26.16,28.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:30.2,34.9 4 1 -github.com/echovault/echovault/internal/modules/string/commands.go:34.9,36.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:38.2,40.16 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:40.16,42.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:44.2,45.9 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:45.9,47.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:50.2,50.24 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:50.24,52.94 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:52.94,54.4 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:55.3,55.58 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:59.2,59.16 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:59.16,61.94 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:61.94,63.4 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:64.3,64.58 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:67.2,69.35 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:69.35,71.24 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:71.24,74.12 3 1 -github.com/echovault/echovault/internal/modules/string/commands.go:77.3,78.8 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:81.2,81.103 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:81.103,83.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:85.2,85.59 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:88.70,90.16 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:90.16,92.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:94.2,97.16 3 1 -github.com/echovault/echovault/internal/modules/string/commands.go:97.16,99.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:101.2,103.9 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:103.9,105.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:107.2,107.56 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:110.70,112.16 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:112.16,114.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:116.2,123.24 6 1 -github.com/echovault/echovault/internal/modules/string/commands.go:123.24,125.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:127.2,127.16 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:127.16,129.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:131.2,132.9 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:132.9,134.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:136.2,136.15 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:136.15,138.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:139.2,139.13 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:139.13,141.3 1 0 -github.com/echovault/echovault/internal/modules/string/commands.go:143.2,143.30 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:143.30,145.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:147.2,147.22 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:147.22,149.3 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:151.2,151.17 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:151.17,154.3 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:156.2,158.14 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:158.14,160.38 2 1 -github.com/echovault/echovault/internal/modules/string/commands.go:160.38,162.4 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:163.3,163.12 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:166.2,166.65 1 1 -github.com/echovault/echovault/internal/modules/string/commands.go:169.36,209.2 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:23.78,24.19 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:24.19,26.3 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:27.2,31.8 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:34.76,35.19 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:35.19,37.3 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:38.2,42.8 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:45.76,46.19 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:46.19,48.3 1 1 -github.com/echovault/echovault/internal/modules/string/key_funcs.go:49.2,53.8 1 1 -github.com/echovault/echovault/internal/raft/fsm.go:48.36,52.2 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:55.50,56.18 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:57.10,57.10 0 0 -github.com/echovault/echovault/internal/raft/fsm.go:59.23,62.60 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:62.60,67.4 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:69.3,72.40 3 0 -github.com/echovault/echovault/internal/raft/fsm.go:73.11,77.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:79.21,80.61 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:80.61,85.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:86.4,89.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:91.18,94.18 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:94.18,99.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:101.4,104.18 3 0 -github.com/echovault/echovault/internal/raft/fsm.go:104.18,109.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:110.4,111.10 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:111.10,113.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:115.4,115.96 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:115.96,120.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:120.10,125.5 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:129.2,129.12 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:133.54,141.2 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:144.55,147.16 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:147.16,150.3 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:152.2,157.48 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:157.48,160.3 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:163.2,164.71 2 0 -github.com/echovault/echovault/internal/raft/fsm.go:164.71,165.87 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:165.87,167.4 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:168.3,168.51 1 0 -github.com/echovault/echovault/internal/raft/fsm.go:171.2,173.12 2 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:39.50,43.2 1 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:46.58,50.16 3 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:50.16,53.3 2 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:55.2,62.16 3 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:62.16,65.3 2 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:67.2,67.40 1 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:67.40,70.3 2 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:72.2,74.12 2 0 -github.com/echovault/echovault/internal/raft/fsm_snapshot.go:78.30,80.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:52.31,56.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:58.46,70.19 9 0 -github.com/echovault/echovault/internal/raft/raft.go:70.19,74.3 3 0 -github.com/echovault/echovault/internal/raft/raft.go:74.8,76.17 2 0 -github.com/echovault/echovault/internal/raft/raft.go:76.17,78.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:80.3,81.17 2 0 -github.com/echovault/echovault/internal/raft/raft.go:81.17,83.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:85.3,88.17 3 0 -github.com/echovault/echovault/internal/raft/raft.go:88.17,90.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:93.2,96.16 3 0 -github.com/echovault/echovault/internal/raft/raft.go:96.16,98.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:100.2,108.16 2 0 -github.com/echovault/echovault/internal/raft/raft.go:108.16,110.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:113.2,133.16 2 0 -github.com/echovault/echovault/internal/raft/raft.go:133.16,135.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:137.2,137.27 1 0 -github.com/echovault/echovault/internal/raft/raft.go:137.27,148.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:150.2,150.21 1 0 -github.com/echovault/echovault/internal/raft/raft.go:153.74,155.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:157.36,159.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:161.38,163.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:165.40,172.2 4 0 -github.com/echovault/echovault/internal/raft/raft.go:179.9,180.22 1 0 -github.com/echovault/echovault/internal/raft/raft.go:180.22,182.44 2 0 -github.com/echovault/echovault/internal/raft/raft.go:182.44,184.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:186.3,186.56 1 0 -github.com/echovault/echovault/internal/raft/raft.go:186.56,188.42 1 0 -github.com/echovault/echovault/internal/raft/raft.go:188.42,190.5 1 0 -github.com/echovault/echovault/internal/raft/raft.go:193.3,194.17 2 0 -github.com/echovault/echovault/internal/raft/raft.go:194.17,196.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:199.2,199.12 1 0 -github.com/echovault/echovault/internal/raft/raft.go:202.61,203.23 1 0 -github.com/echovault/echovault/internal/raft/raft.go:203.23,205.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:207.2,207.73 1 0 -github.com/echovault/echovault/internal/raft/raft.go:207.73,209.3 1 0 -github.com/echovault/echovault/internal/raft/raft.go:211.2,211.12 1 0 -github.com/echovault/echovault/internal/raft/raft.go:214.37,216.2 1 0 -github.com/echovault/echovault/internal/raft/raft.go:218.31,220.22 1 0 -github.com/echovault/echovault/internal/raft/raft.go:220.22,222.17 2 0 -github.com/echovault/echovault/internal/raft/raft.go:222.17,224.4 1 0 -github.com/echovault/echovault/internal/raft/raft.go:225.3,225.49 1 0 -github.com/echovault/echovault/echovault/api_acl.go:126.71,128.23 2 0 -github.com/echovault/echovault/echovault/api_acl.go:128.23,130.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:131.2,132.16 2 0 +github.com/echovault/echovault/echovault/api_acl.go:126.71,128.23 2 1 +github.com/echovault/echovault/echovault/api_acl.go:128.23,130.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:131.2,132.16 2 1 github.com/echovault/echovault/echovault/api_acl.go:132.16,134.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:135.2,135.45 1 0 -github.com/echovault/echovault/echovault/api_acl.go:139.55,141.16 2 0 +github.com/echovault/echovault/echovault/api_acl.go:135.2,135.45 1 1 +github.com/echovault/echovault/echovault/api_acl.go:139.55,141.16 2 1 github.com/echovault/echovault/echovault/api_acl.go:141.16,143.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:144.2,144.45 1 0 -github.com/echovault/echovault/echovault/api_acl.go:155.62,158.18 2 0 -github.com/echovault/echovault/echovault/api_acl.go:158.18,160.3 1 0 +github.com/echovault/echovault/echovault/api_acl.go:144.2,144.45 1 1 +github.com/echovault/echovault/echovault/api_acl.go:155.62,158.18 2 1 +github.com/echovault/echovault/echovault/api_acl.go:158.18,160.3 1 1 github.com/echovault/echovault/echovault/api_acl.go:160.8,162.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:164.2,164.21 1 0 -github.com/echovault/echovault/echovault/api_acl.go:164.21,166.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:168.2,168.17 1 0 -github.com/echovault/echovault/echovault/api_acl.go:168.17,170.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:172.2,172.21 1 0 -github.com/echovault/echovault/echovault/api_acl.go:172.21,174.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:176.2,176.20 1 0 +github.com/echovault/echovault/echovault/api_acl.go:164.2,164.21 1 1 +github.com/echovault/echovault/echovault/api_acl.go:164.21,166.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:168.2,168.17 1 1 +github.com/echovault/echovault/echovault/api_acl.go:168.17,170.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:172.2,172.21 1 1 +github.com/echovault/echovault/echovault/api_acl.go:172.21,174.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:176.2,176.20 1 1 github.com/echovault/echovault/echovault/api_acl.go:176.20,178.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:180.2,180.20 1 0 +github.com/echovault/echovault/echovault/api_acl.go:180.2,180.20 1 1 github.com/echovault/echovault/echovault/api_acl.go:180.20,182.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:184.2,184.24 1 0 +github.com/echovault/echovault/echovault/api_acl.go:184.2,184.24 1 1 github.com/echovault/echovault/echovault/api_acl.go:184.24,186.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:188.2,188.50 1 0 -github.com/echovault/echovault/echovault/api_acl.go:188.50,190.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:192.2,192.53 1 0 +github.com/echovault/echovault/echovault/api_acl.go:188.2,188.50 1 1 +github.com/echovault/echovault/echovault/api_acl.go:188.50,190.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:192.2,192.53 1 1 github.com/echovault/echovault/echovault/api_acl.go:192.53,194.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:196.2,196.49 1 0 -github.com/echovault/echovault/echovault/api_acl.go:196.49,198.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:200.2,200.52 1 0 +github.com/echovault/echovault/echovault/api_acl.go:196.2,196.49 1 1 +github.com/echovault/echovault/echovault/api_acl.go:196.49,198.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:200.2,200.52 1 1 github.com/echovault/echovault/echovault/api_acl.go:200.52,202.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:204.2,204.50 1 0 -github.com/echovault/echovault/echovault/api_acl.go:204.50,206.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:208.2,208.50 1 0 -github.com/echovault/echovault/echovault/api_acl.go:208.50,210.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:212.2,212.47 1 0 -github.com/echovault/echovault/echovault/api_acl.go:212.47,214.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:216.2,216.47 1 0 -github.com/echovault/echovault/echovault/api_acl.go:216.47,218.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:220.2,220.48 1 0 -github.com/echovault/echovault/echovault/api_acl.go:220.48,222.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:224.2,224.43 1 0 -github.com/echovault/echovault/echovault/api_acl.go:224.43,226.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:228.2,228.44 1 0 -github.com/echovault/echovault/echovault/api_acl.go:228.44,230.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:232.2,232.47 1 0 -github.com/echovault/echovault/echovault/api_acl.go:232.47,234.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:236.2,236.47 1 0 -github.com/echovault/echovault/echovault/api_acl.go:236.47,238.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:240.2,241.16 2 0 +github.com/echovault/echovault/echovault/api_acl.go:204.2,204.50 1 1 +github.com/echovault/echovault/echovault/api_acl.go:204.50,206.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:208.2,208.50 1 1 +github.com/echovault/echovault/echovault/api_acl.go:208.50,210.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:212.2,212.47 1 1 +github.com/echovault/echovault/echovault/api_acl.go:212.47,214.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:216.2,216.47 1 1 +github.com/echovault/echovault/echovault/api_acl.go:216.47,218.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:220.2,220.48 1 1 +github.com/echovault/echovault/echovault/api_acl.go:220.48,222.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:224.2,224.43 1 1 +github.com/echovault/echovault/echovault/api_acl.go:224.43,226.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:228.2,228.44 1 1 +github.com/echovault/echovault/echovault/api_acl.go:228.44,230.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:232.2,232.47 1 1 +github.com/echovault/echovault/echovault/api_acl.go:232.47,234.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:236.2,236.47 1 1 +github.com/echovault/echovault/echovault/api_acl.go:236.47,238.3 1 1 +github.com/echovault/echovault/echovault/api_acl.go:240.2,241.16 2 1 github.com/echovault/echovault/echovault/api_acl.go:241.16,243.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:245.2,246.40 2 0 -github.com/echovault/echovault/echovault/api_acl.go:293.83,295.16 2 0 +github.com/echovault/echovault/echovault/api_acl.go:245.2,246.40 2 1 +github.com/echovault/echovault/echovault/api_acl.go:293.83,295.16 2 1 github.com/echovault/echovault/echovault/api_acl.go:295.16,297.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:299.2,301.16 3 0 +github.com/echovault/echovault/echovault/api_acl.go:299.2,301.16 3 1 github.com/echovault/echovault/echovault/api_acl.go:301.16,303.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:305.2,308.35 3 0 -github.com/echovault/echovault/echovault/api_acl.go:308.35,314.35 4 0 -github.com/echovault/echovault/echovault/api_acl.go:314.35,316.4 1 0 -github.com/echovault/echovault/echovault/api_acl.go:319.2,319.20 1 0 -github.com/echovault/echovault/echovault/api_acl.go:329.72,332.16 3 0 -github.com/echovault/echovault/echovault/api_acl.go:332.16,334.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:335.2,336.40 2 0 -github.com/echovault/echovault/echovault/api_acl.go:340.54,342.16 2 0 -github.com/echovault/echovault/echovault/api_acl.go:342.16,344.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:345.2,345.45 1 0 -github.com/echovault/echovault/echovault/api_acl.go:356.72,358.9 2 0 -github.com/echovault/echovault/echovault/api_acl.go:359.21,360.29 1 0 -github.com/echovault/echovault/echovault/api_acl.go:361.23,362.31 1 0 -github.com/echovault/echovault/echovault/api_acl.go:363.10,364.31 1 0 -github.com/echovault/echovault/echovault/api_acl.go:367.2,368.16 2 0 -github.com/echovault/echovault/echovault/api_acl.go:368.16,370.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:372.2,373.40 2 0 -github.com/echovault/echovault/echovault/api_acl.go:379.50,381.16 2 0 -github.com/echovault/echovault/echovault/api_acl.go:381.16,383.3 1 0 -github.com/echovault/echovault/echovault/api_acl.go:384.2,385.40 2 0 +github.com/echovault/echovault/echovault/api_acl.go:305.2,309.35 3 1 +github.com/echovault/echovault/echovault/api_acl.go:309.35,315.35 4 1 +github.com/echovault/echovault/echovault/api_acl.go:315.35,317.4 1 1 +github.com/echovault/echovault/echovault/api_acl.go:320.2,320.20 1 1 +github.com/echovault/echovault/echovault/api_acl.go:330.72,333.16 3 1 +github.com/echovault/echovault/echovault/api_acl.go:333.16,335.3 1 0 +github.com/echovault/echovault/echovault/api_acl.go:336.2,337.40 2 1 +github.com/echovault/echovault/echovault/api_acl.go:341.54,343.16 2 1 +github.com/echovault/echovault/echovault/api_acl.go:343.16,345.3 1 0 +github.com/echovault/echovault/echovault/api_acl.go:346.2,346.45 1 1 +github.com/echovault/echovault/echovault/api_acl.go:357.72,359.9 2 0 +github.com/echovault/echovault/echovault/api_acl.go:360.21,361.29 1 0 +github.com/echovault/echovault/echovault/api_acl.go:362.23,363.31 1 0 +github.com/echovault/echovault/echovault/api_acl.go:364.10,365.31 1 0 +github.com/echovault/echovault/echovault/api_acl.go:368.2,369.16 2 0 +github.com/echovault/echovault/echovault/api_acl.go:369.16,371.3 1 0 +github.com/echovault/echovault/echovault/api_acl.go:373.2,374.40 2 0 +github.com/echovault/echovault/echovault/api_acl.go:380.50,382.16 2 1 +github.com/echovault/echovault/echovault/api_acl.go:382.16,384.3 1 0 +github.com/echovault/echovault/echovault/api_acl.go:385.2,386.40 2 1 github.com/echovault/echovault/echovault/api_admin.go:142.84,145.9 2 0 github.com/echovault/echovault/echovault/api_admin.go:146.28,147.71 1 0 github.com/echovault/echovault/echovault/api_admin.go:148.29,149.73 1 0 @@ -3639,7 +3494,7 @@ github.com/echovault/echovault/echovault/echovault.go:162.48,163.52 1 0 github.com/echovault/echovault/echovault/echovault.go:163.52,165.12 2 0 github.com/echovault/echovault/echovault/echovault.go:167.3,167.41 1 0 github.com/echovault/echovault/echovault/echovault.go:171.2,171.52 1 1 -github.com/echovault/echovault/echovault/echovault.go:171.52,173.3 1 0 +github.com/echovault/echovault/echovault/echovault.go:171.52,173.3 1 1 github.com/echovault/echovault/echovault/echovault.go:176.2,176.42 1 1 github.com/echovault/echovault/echovault/echovault.go:176.42,178.3 1 1 github.com/echovault/echovault/echovault/echovault.go:181.2,182.40 2 1 @@ -4000,7 +3855,8 @@ github.com/echovault/echovault/echovault/plugin.go:181.61,183.4 1 1 github.com/echovault/echovault/echovault/plugin.go:183.6,185.4 1 1 github.com/echovault/echovault/echovault/plugin.go:187.2,187.16 1 1 github.com/echovault/echovault/echovault/test_helpers.go:9.35,16.2 2 1 -github.com/echovault/echovault/echovault/test_helpers.go:18.95,19.82 1 1 -github.com/echovault/echovault/echovault/test_helpers.go:19.82,21.3 1 0 -github.com/echovault/echovault/echovault/test_helpers.go:22.2,22.12 1 1 -github.com/echovault/echovault/echovault/test_helpers.go:25.95,28.2 2 1 +github.com/echovault/echovault/echovault/test_helpers.go:18.63,23.2 2 1 +github.com/echovault/echovault/echovault/test_helpers.go:25.95,26.82 1 1 +github.com/echovault/echovault/echovault/test_helpers.go:26.82,28.3 1 0 +github.com/echovault/echovault/echovault/test_helpers.go:29.2,29.12 1 1 +github.com/echovault/echovault/echovault/test_helpers.go:32.95,35.2 2 1 diff --git a/echovault/api_acl.go b/echovault/api_acl.go index 2a88631b..d56e43fb 100644 --- a/echovault/api_acl.go +++ b/echovault/api_acl.go @@ -303,7 +303,8 @@ func (server *EchoVault) ACLGetUser(username string) (map[string][]string, error } arr := v.Array() - result := make(map[string][]string, len(arr)/2) + + result := make(map[string][]string) for i := 0; i < len(arr); i += 2 { key := arr[i].String() @@ -312,7 +313,7 @@ func (server *EchoVault) ACLGetUser(username string) (map[string][]string, error result[key] = make([]string, len(value)) for j := 0; j < len(value); j++ { - result[key][i] = value[i].String() + result[key][j] = value[j].String() } } diff --git a/echovault/api_acl_test.go b/echovault/api_acl_test.go index f6598c81..0763f93c 100644 --- a/echovault/api_acl_test.go +++ b/echovault/api_acl_test.go @@ -13,3 +13,266 @@ // limitations under the License. package echovault + +import ( + "crypto/sha256" + "fmt" + "github.com/echovault/echovault/internal/constants" + "slices" + "strings" + "testing" +) + +func TestEchoVault_ACLCat(t *testing.T) { + server := createEchoVault() + + getCategoryCommands := func(category string) []string { + var commands []string + for _, command := range server.commands { + if slices.Contains(command.Categories, category) && (command.SubCommands == nil || len(command.SubCommands) == 0) { + commands = append(commands, strings.ToLower(command.Command)) + continue + } + for _, subcommand := range command.SubCommands { + if slices.Contains(subcommand.Categories, category) { + commands = append(commands, strings.ToLower(fmt.Sprintf("%s|%s", command.Command, subcommand.Command))) + } + } + } + return commands + } + + tests := []struct { + name string + args []string + want []string + wantErr bool + }{ + { + name: "1. Get all ACL categories loaded on the server", + args: make([]string, 0), + want: []string{ + constants.AdminCategory, constants.ConnectionCategory, constants.DangerousCategory, + constants.HashCategory, constants.FastCategory, constants.KeyspaceCategory, constants.ListCategory, + constants.PubSubCategory, constants.ReadCategory, constants.WriteCategory, constants.SetCategory, + constants.SortedSetCategory, constants.SlowCategory, constants.StringCategory, + }, + wantErr: false, + }, + { + name: "2. Get all commands within the admin category", + args: []string{constants.AdminCategory}, + want: getCategoryCommands(constants.AdminCategory), + wantErr: false, + }, + { + name: "3. Get all commands within the connection category", + args: []string{constants.ConnectionCategory}, + want: getCategoryCommands(constants.ConnectionCategory), + wantErr: false, + }, + { + name: "4. Get all the commands within the dangerous category", + args: []string{constants.DangerousCategory}, + want: getCategoryCommands(constants.DangerousCategory), + wantErr: false, + }, + { + name: "5. Get all the commands within the hash category", + args: []string{constants.HashCategory}, + want: getCategoryCommands(constants.HashCategory), + wantErr: false, + }, + { + name: "6. Get all the commands within the fast category", + args: []string{constants.FastCategory}, + want: getCategoryCommands(constants.FastCategory), + wantErr: false, + }, + { + name: "7. Get all the commands within the keyspace category", + args: []string{constants.KeyspaceCategory}, + want: getCategoryCommands(constants.KeyspaceCategory), + wantErr: false, + }, + { + name: "8. Get all the commands within the list category", + args: []string{constants.ListCategory}, + want: getCategoryCommands(constants.ListCategory), + wantErr: false, + }, + { + name: "9. Get all the commands within the pubsub category", + args: []string{constants.PubSubCategory}, + want: getCategoryCommands(constants.PubSubCategory), + wantErr: false, + }, + { + name: "10. Get all the commands within the read category", + args: []string{constants.ReadCategory}, + want: getCategoryCommands(constants.ReadCategory), + wantErr: false, + }, + { + name: "11. Get all the commands within the write category", + args: []string{constants.WriteCategory}, + want: getCategoryCommands(constants.WriteCategory), + wantErr: false, + }, + { + name: "12. Get all the commands within the set category", + args: []string{constants.SetCategory}, + want: getCategoryCommands(constants.SetCategory), + wantErr: false, + }, + { + name: "13. Get all the commands within the sortedset category", + args: []string{constants.SortedSetCategory}, + want: getCategoryCommands(constants.SortedSetCategory), + wantErr: false, + }, + { + name: "14. Get all the commands within the slow category", + args: []string{constants.SlowCategory}, + want: getCategoryCommands(constants.SlowCategory), + wantErr: false, + }, + { + name: "15. Get all the commands within the string category", + args: []string{constants.StringCategory}, + want: getCategoryCommands(constants.StringCategory), + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := server.ACLCat(tt.args...) + if (err != nil) != tt.wantErr { + t.Errorf("ACLCat() error = %v, wantErr %v", err, tt.wantErr) + return + } + if len(got) != len(tt.want) { + t.Errorf("ACLCat() got length = %d, want length %d", len(got), len(tt.want)) + } + for _, item := range got { + if !slices.Contains(tt.want, item) { + t.Errorf("ACLCat() got unexpected element = %s, want %v", item, tt.want) + } + } + }) + } +} + +func TestEchoVault_ACLUsers(t *testing.T) { + server := createEchoVault() + + // Set Users + users := []User{ + { + Username: "user1", + Enabled: true, + NoPassword: true, + NoKeys: true, + NoCommands: true, + AddPlainPasswords: []string{}, + AddHashPasswords: []string{}, + IncludeCategories: []string{}, + IncludeReadWriteKeys: []string{}, + IncludeReadKeys: []string{}, + IncludeWriteKeys: []string{}, + IncludeChannels: []string{}, + ExcludeChannels: []string{}, + }, + { + Username: "user2", + Enabled: true, + NoPassword: false, + NoKeys: false, + NoCommands: false, + AddPlainPasswords: []string{"password1", "password2"}, + AddHashPasswords: []string{ + func() string { + h := sha256.New() + h.Write([]byte("password1")) + return string(h.Sum(nil)) + }(), + }, + IncludeCategories: []string{constants.FastCategory, constants.SlowCategory, constants.HashCategory}, + ExcludeCategories: []string{constants.AdminCategory, constants.DangerousCategory}, + IncludeCommands: []string{"*"}, + ExcludeCommands: []string{"acl|load", "acl|save"}, + IncludeReadWriteKeys: []string{"user2-profile-*"}, + IncludeReadKeys: []string{"user2-privileges-*"}, + IncludeWriteKeys: []string{"write-key"}, + IncludeChannels: []string{"posts-*"}, + ExcludeChannels: []string{"actions-*"}, + }, + } + + for _, user := range users { + ok, err := server.ACLSetUser(user) + if err != nil { + t.Errorf("ACLSetUser() err = %v", err) + } + if !ok { + t.Errorf("ACLSetUser() ok = %v", ok) + } + } + + // Get users + aclUsers, err := server.ACLUsers() + if err != nil { + t.Errorf("ACLUsers() err = %v", err) + } + if len(aclUsers) != len(users)+1 { + t.Errorf("ACLUsers() got length %d, want %d", len(aclUsers), len(users)+1) + } + for _, username := range aclUsers { + if !slices.Contains([]string{"default", "user1", "user2"}, username) { + t.Errorf("ACLUsers() unexpected username = %s", username) + } + } + + // Get specific user. + user, err := server.ACLGetUser("user2") + if err != nil { + t.Errorf("ACLGetUser() err = %v", err) + } + if user == nil { + t.Errorf("ACLGetUser() user is nil") + } + + // Delete user + ok, err := server.ACLDelUser("user1") + if err != nil { + t.Errorf("ACLDelUser() err = %v", err) + } + if !ok { + t.Errorf("ACLDelUser() could not delete user user1") + } + aclUsers, err = server.ACLUsers() + if err != nil { + t.Errorf("ACLDelUser() err = %v", err) + } + if slices.Contains(aclUsers, "user1") { + t.Errorf("ACLDelUser() unexpected username user1") + } + + // Get list of currently loaded ACL rules. + list, err := server.ACLList() + if err != nil { + t.Errorf("ACLList() err = %v", err) + } + if len(list) != 2 { + t.Errorf("ACLList() got list length %d, want %d", len(list), 2) + } + + // Save the current ACL rules + ok, err = server.ACLSave() + if err != nil { + t.Errorf("ACLSave() err = %v", err) + } + if !ok { + t.Errorf("ACLSave() could not save ACL file") + } +} diff --git a/echovault/api_admin_test.go b/echovault/api_admin_test.go index 24f38090..76b4d3a4 100644 --- a/echovault/api_admin_test.go +++ b/echovault/api_admin_test.go @@ -300,7 +300,7 @@ func TestEchoVault_RemoveCommand(t *testing.T) { func TestEchoVault_Plugins(t *testing.T) { t.Cleanup(func() { - _ = os.RemoveAll("./testdata") + _ = os.RemoveAll("./testdata/modules") }) server := createEchoVault() diff --git a/echovault/test_helpers.go b/echovault/test_helpers.go index 6be0ca4d..2c33a861 100644 --- a/echovault/test_helpers.go +++ b/echovault/test_helpers.go @@ -15,6 +15,13 @@ func createEchoVault() *EchoVault { return ev } +func createEchoVaultWithConfig(conf config.Config) *EchoVault { + ev, _ := NewEchoVault( + WithConfig(conf), + ) + return ev +} + func presetValue(server *EchoVault, ctx context.Context, key string, value interface{}) error { if err := server.setValues(ctx, map[string]interface{}{key: value}); err != nil { return err