Skip to content

Commit 591ed57

Browse files
miaobyteclaude
andcommitted
refactor: CLI layer cleanup — help, kvspace, load, main, serve, util
Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 7beb8c9 commit 591ed57

6 files changed

Lines changed: 63 additions & 47 deletions

File tree

cmd/kvlang/help.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,41 @@ func showHelp() {
99
fmt.Fprintln(os.Stderr, "kvlang — KV language VM interpreter")
1010
fmt.Fprintln(os.Stderr)
1111
fmt.Fprintln(os.Stderr, "usage:")
12-
fmt.Fprintln(os.Stderr, " kvlang [<file.kv|dir>] 加载并执行(文件/目录)")
13-
fmt.Fprintln(os.Stderr, " kvlang -c \"code\" 加载并执行内联代码")
14-
fmt.Fprintln(os.Stderr, " echo \"code\" | kvlang 加载并执行管道代码")
15-
fmt.Fprintln(os.Stderr, " kvlang serve 启动 VM daemon")
16-
fmt.Fprintln(os.Stderr, " kvlang load <file.kv|dir> 只加载到 kvspace,不执行")
17-
fmt.Fprintln(os.Stderr, " kvlang vet <file.kv> 语法检查")
18-
fmt.Fprintln(os.Stderr, " kvlang format <file.kv> 格式化源文件")
19-
fmt.Fprintln(os.Stderr, " kvlang kvspace <cmd> [args] KV 空间操作")
20-
fmt.Fprintln(os.Stderr, " kvlang help 显示此帮助")
12+
fmt.Fprintln(os.Stderr, " kvlang <file.kv|dir> [--debug] 加载并执行(目录递归收集 *.kv)")
13+
fmt.Fprintln(os.Stderr, " kvlang -c \"code\" [--debug] 加载并执行内联代码")
14+
fmt.Fprintln(os.Stderr, " echo \"code\" | kvlang 执行管道代码(stdin 非终端时)")
15+
fmt.Fprintln(os.Stderr, " kvlang 无参数且 stdin 为终端 → 等价 kvlang serve")
16+
fmt.Fprintln(os.Stderr, " kvlang serve 启动 VM daemon")
17+
fmt.Fprintln(os.Stderr, " kvlang load <file.kv|dir> 只加载到 kvspace,不执行")
18+
fmt.Fprintln(os.Stderr, " kvlang vet [--dump] [--lower] [-c code | <file.kv>] 语法检查")
19+
fmt.Fprintln(os.Stderr, " kvlang format [-w] [-c code | <file.kv>] 格式化(别名 fmt;默认打印,-w 原地写回)")
20+
fmt.Fprintln(os.Stderr, " kvlang kvspace <cmd> [args] KV 空间操作")
21+
fmt.Fprintln(os.Stderr, " kvlang help 显示此帮助")
2122
fmt.Fprintln(os.Stderr)
2223
fmt.Fprintln(os.Stderr, "kvspace 子命令:")
2324
fmt.Fprintln(os.Stderr, " get <key> 读取单个 key")
2425
fmt.Fprintln(os.Stderr, " mget <key1> <key2> ... 批量读取")
25-
fmt.Fprintln(os.Stderr, " set <key> <value> 写入 key")
26+
fmt.Fprintln(os.Stderr, " set <key> <value> 写入 key;value 为 kind:repr 格式")
27+
fmt.Fprintln(os.Stderr, " (int:42、float:3.14、bool:true、string:hi;无冒号视为字符串)")
2628
fmt.Fprintln(os.Stderr, " del <key1> [key2 ...] 删除 key")
2729
fmt.Fprintln(os.Stderr, " list <prefix> 列出直接子项")
2830
fmt.Fprintln(os.Stderr, " tree <prefix> 递归树形结构")
2931
fmt.Fprintln(os.Stderr, " dump <prefix> 递归 key=value")
30-
fmt.Fprintln(os.Stderr, " watch <key> [--timeout 5s] 阻塞等待通知")
32+
fmt.Fprintln(os.Stderr, " watch [--timeout <dur>] <key> 阻塞等待通知(如 --timeout 5s;0 永久,flag 须在 key 前)")
3133
fmt.Fprintln(os.Stderr, " notify <key> <value> 推送通知")
3234
fmt.Fprintln(os.Stderr, " clear 清空所有 kvspace 数据")
3335
fmt.Fprintln(os.Stderr, " trace <vtid> 追踪 vthread 单步执行,输出 NDJSON")
3436
fmt.Fprintln(os.Stderr)
35-
fmt.Fprintln(os.Stderr, "全局选项:")
36-
fmt.Fprintln(os.Stderr, " --addr host:port Redis 地址(默认 127.0.0.1:6379)")
37+
fmt.Fprintln(os.Stderr, "选项:")
38+
fmt.Fprintln(os.Stderr, " --kvspace <dsn> kvspace 地址(默认 redis://127.0.0.1:6379,KVLANG_KVSPACE 可覆盖默认;")
39+
fmt.Fprintln(os.Stderr, " 裸 host:port 视为 redis;run/serve/load/kvspace 支持)")
40+
fmt.Fprintln(os.Stderr, " --debug 单步调试模式(run 模式,交互式逐指令暂停)")
3741
fmt.Fprintln(os.Stderr)
3842
fmt.Fprintln(os.Stderr, "示例:")
39-
fmt.Fprintln(os.Stderr, " kvlang file.kv 执行文件")
40-
fmt.Fprintln(os.Stderr, " kvlang -c 'print(\"hi\")' 内联执行")
41-
fmt.Fprintln(os.Stderr, " echo 'print(\"hi\")' | kvlang 管道执行")
42-
fmt.Fprintln(os.Stderr, " kvlang load file.kv 加载不执行")
43-
fmt.Fprintln(os.Stderr, " kvlang serve 启动 daemon")
44-
fmt.Fprintln(os.Stderr, " kvlang kvspace dump /src 查看已加载函数源码")
43+
fmt.Fprintln(os.Stderr, " kvlang file.kv 执行文件")
44+
fmt.Fprintln(os.Stderr, " kvlang -c 'x = 40 + 2; print(x)' 内联执行(= 等价于 <-)")
45+
fmt.Fprintln(os.Stderr, " echo 'print(\"hi\")' | kvlang 管道执行")
46+
fmt.Fprintln(os.Stderr, " kvlang vet -c 'a = { k=1 }' 语法检查内联代码")
47+
fmt.Fprintln(os.Stderr, " kvlang kvspace dump /src 查看已加载函数源码")
4548
os.Exit(0)
4649
}

cmd/kvlang/kvspace.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ import (
1414
"strconv")
1515

1616
func cmdKVSpace(args []string) {
17-
// 全局 FlagSet:解析 --addr 及子命令
17+
// 全局 FlagSet:解析 --kvspace 及子命令
1818
fs := flag.NewFlagSet("kvspace", flag.ExitOnError)
19-
addr := fs.String("addr", "127.0.0.1:6379", "Redis 地址 (host:port)")
19+
dsn := fs.String("kvspace", defaultKVSpace(), kvspaceFlagDesc)
2020
fs.Usage = func() {
21-
fmt.Fprintln(os.Stderr, "usage: kvlang kvspace [--addr host:port] <subcommand> [args]")
21+
fmt.Fprintln(os.Stderr, "usage: kvlang kvspace [--kvspace dsn] <subcommand> [args]")
2222
fmt.Fprintln(os.Stderr, "subcommands: get mget set del list tree dump watch notify clear trace")
2323
fs.PrintDefaults()
2424
}
@@ -30,7 +30,7 @@ func cmdKVSpace(args []string) {
3030
os.Exit(1)
3131
}
3232

33-
kv := kvspace.Conn(*addr)
33+
kv := kvspace.Conn(*dsn)
3434
defer kv.DisConn()
3535

3636
switch sub[0] {
@@ -96,7 +96,8 @@ func cmdKVSpace(args []string) {
9696
kvTrace(kv, sub[1])
9797

9898
default:
99-
fmt.Fprintf(os.Stderr, "unknown kvspace subcommand: %s\n", sub[0])
99+
fmt.Fprintf(os.Stderr, "unknown kvspace subcommand: %s\n\n", sub[0])
100+
fs.Usage()
100101
os.Exit(1)
101102
}
102103
}

cmd/kvlang/load.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ import (
2020
// cmdLoad 将 .kv 文件加载进 kvspace,不执行。
2121
func cmdLoad(args []string) {
2222
fs := flag.NewFlagSet("load", flag.ExitOnError)
23-
addr := fs.String("addr", "127.0.0.1:6379", "Redis 地址 (host:port)")
23+
dsn := fs.String("kvspace", defaultKVSpace(), kvspaceFlagDesc)
2424
fs.Usage = func() {
25-
fmt.Fprintln(os.Stderr, "usage: kvlang load [--addr host:port] <file.kv|dir>")
25+
fmt.Fprintln(os.Stderr, "usage: kvlang load [--kvspace dsn] <file.kv|dir>")
2626
fs.PrintDefaults()
2727
}
2828
fs.Parse(args)
@@ -32,7 +32,7 @@ func cmdLoad(args []string) {
3232
os.Exit(1)
3333
}
3434

35-
kv := kvspace.Conn(*addr)
35+
kv := kvspace.Conn(*dsn)
3636
defer kv.DisConn()
3737

3838
files, err := collectKVFiles(fs.Arg(0))
@@ -46,30 +46,30 @@ func cmdLoad(args []string) {
4646
// cmdRun 解析参数并路由到对应执行路径:内联 / 文件 / 管道 / serve。
4747
func cmdRun(args []string) {
4848
fs := flag.NewFlagSet("run", flag.ExitOnError)
49-
addr := fs.String("addr", "127.0.0.1:6379", "Redis 地址 (host:port)")
49+
dsn := fs.String("kvspace", defaultKVSpace(), kvspaceFlagDesc)
5050
code := fs.String("c", "", "内联代码(直接执行字符串)")
5151
debug := fs.Bool("debug", false, "单步调试模式(交互式,每条指令暂停)")
5252
fs.Usage = func() {
53-
fmt.Fprintln(os.Stderr, "usage: kvlang [--addr host:port] [--debug] [-c code | <file.kv>]")
53+
fmt.Fprintln(os.Stderr, "usage: kvlang [--kvspace dsn] [--debug] [-c code | <file.kv|dir>]")
5454
fs.PrintDefaults()
5555
}
5656
fs.Parse(args)
5757

5858
switch {
5959
case *code != "":
60-
runCode("inline", strings.NewReader(*code), *addr, *debug)
60+
runCode("inline", strings.NewReader(*code), *dsn, *debug)
6161
case fs.NArg() > 0:
62-
runFile(*addr, fs.Arg(0), *debug)
62+
runFile(*dsn, fs.Arg(0), *debug)
6363
case !isTerminal():
64-
runCode("stdin", os.Stdin, *addr, *debug)
64+
runCode("stdin", os.Stdin, *dsn, *debug)
6565
default:
6666
runServe(nil)
6767
}
6868
}
6969

7070
// runFile 加载 .kv 文件后单次执行。
71-
func runFile(addr, path string, debug bool) {
72-
kv := kvspace.Conn(addr)
71+
func runFile(dsn, path string, debug bool) {
72+
kv := kvspace.Conn(dsn)
7373
defer kv.DisConn()
7474
registerDefaultTerm(kv)
7575

@@ -82,8 +82,8 @@ func runFile(addr, path string, debug bool) {
8282
}
8383

8484
// runCode 从 io.Reader 加载代码后单次执行(内联 / 管道模式)。
85-
func runCode(name string, rc io.Reader, addr string, debug bool) {
86-
kv := kvspace.Conn(addr)
85+
func runCode(name string, rc io.Reader, dsn string, debug bool) {
86+
kv := kvspace.Conn(dsn)
8787
defer kv.DisConn()
8888
registerDefaultTerm(kv)
8989

cmd/kvlang/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
// kvlang — KV 语言 VM 解释器 CLI。
22
//
3-
// kvlang 启动 daemon(serve 模式)
4-
// kvlang serve 启动 daemon(显式)
5-
// kvlang <file.kv> 加载并执行文件
3+
// kvlang <file.kv|dir> 加载并执行(目录递归收集 *.kv)
64
// kvlang -c "code" 加载并执行内联代码
7-
// echo "code" | kvlang 加载并执行管道代码
5+
// echo "code" | kvlang 执行管道代码(stdin 非终端)
6+
// kvlang 无参数且 stdin 为终端 → 等价 serve
7+
// kvlang serve 启动 daemon
88
// kvlang load <file.kv|dir> 只加载到 kvspace,不执行
99
// kvlang vet <file.kv> 语法检查
10-
// kvlang format <file.kv> 格式化
10+
// kvlang format <file.kv> 格式化(别名 fmt)
1111
// kvlang kvspace <cmd> KV 空间操作
1212
// kvlang help 帮助
1313
package main
1414

1515
import (
1616
"os"
1717

18-
// 注册 KVSpace 实现;KVLANG_KV 环境变量选择后端(默认 "redis")。
18+
// 注册 KVSpace 实现;--kvspace DSN 的 scheme 选择后端(默认 redis://)。
1919
_ "kvlang/internal/kvspace/redis"
2020
)
2121

cmd/kvlang/serve.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ func executeEntry(kv kvspace.KVSpace, debug bool) {
5656
// args 为 serve 子命令的剩余参数(nil 或空切片均可)。
5757
func runServe(args []string) {
5858
fs := flag.NewFlagSet("serve", flag.ExitOnError)
59-
addr := fs.String("addr", "127.0.0.1:6379", "Redis 地址 (host:port)")
59+
dsn := fs.String("kvspace", defaultKVSpace(), kvspaceFlagDesc)
6060
fs.Usage = func() {
61-
fmt.Fprintln(os.Stderr, "usage: kvlang serve [--addr host:port]")
61+
fmt.Fprintln(os.Stderr, "usage: kvlang serve [--kvspace dsn]")
6262
fs.PrintDefaults()
6363
}
6464
fs.Parse(args)
@@ -71,9 +71,9 @@ func runServe(args []string) {
7171
workers := runtime.GOMAXPROCS(0)
7272
// 每个 worker 最多占用 1 个连接做 BLPOP,额外 16 用于 mainWatcher/heartbeat/syscmd 等。
7373
poolSize := workers + 16
74-
logx.Info("VM-%s starting with %d workers, kv=%s pool=%d", vmID, workers, *addr, poolSize)
74+
logx.Info("VM-%s starting with %d workers, kv=%s pool=%d", vmID, workers, *dsn, poolSize)
7575

76-
kv := kvspace.ConnPool(*addr, poolSize)
76+
kv := kvspace.ConnPool(*dsn, poolSize)
7777
defer kv.DisConn()
7878
// serve 是 daemon,不注册 kvlangrun 终端——
7979
// 各 vthread 的终端由 agent 通过 entry.Term 显式绑定。

cmd/kvlang/util.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,23 @@ package main
22

33
import (
44
"fmt"
5+
"os"
6+
"strconv"
7+
58
"kvlang/internal/keytree"
69
"kvlang/internal/kvspace"
7-
"strconv"
810
)
911

12+
// defaultKVSpace 返回 kvspace DSN 默认值:KVLANG_KVSPACE 环境变量覆盖,否则本机 redis。
13+
func defaultKVSpace() string {
14+
if v := os.Getenv("KVLANG_KVSPACE"); v != "" {
15+
return v
16+
}
17+
return "redis://127.0.0.1:6379"
18+
}
19+
20+
const kvspaceFlagDesc = "kvspace 地址(DSN,如 redis://host:port;裸 host:port 视为 redis;默认可由 KVLANG_KVSPACE 覆盖)"
21+
1022
func incrVtid(kv kvspace.KVSpace) string {
1123
valV, _ := kv.Get(keytree.VthreadSeq)
1224
n, _ := strconv.ParseInt(valV.Str(), 10, 64)

0 commit comments

Comments
 (0)