http.frm.router
comptime 路由核(P6-A;静态表 + 运行时 match + 类型化参数)
D-P6-1 释义(设计文档 "comptime 路由核" 未钉 handler 绑定形;本文件即登记形):
路由表 = 【消费方侧 comptime 折叠的 const Str 字面量表】(如
const ROUTES: Str = "GET /users|GET /users/:id|POST /users"),运行时
匹配器对本表做线性扫描;派发 = 消费方按命中的 route id 显式
if/match 分支调用具名 handler(静态分发,零反射零注册)。handler 引用
【不】入表(fn 值入 const = ceval 不可折叠面,§8.4 无反射决策一致)。
本释义与 docs/superpowers/plans/2026-09-21-server-p6-framework.md
Architecture 段("const 静态表 + 运行时 match 显式分发")逐字一致。
comptime 构表形态决策(task-1 "Before You Begin" 条款登记): ceval(sem_ceval.ct,E6010 预算求值器;emit 侧 const 折叠同源)仅可折叠 I/6/B/S/D 标量 —— Str 连接、struct/数组构表皆回退不折叠,而 emit 侧 【被引用的】const 必须折叠(driver_emit.ct:414 直出 C 静常量,否则 t_<名> 无定义即 cc 断)。故构表形 = 平面 Str 字面量表(ceval "Str" 纯 Text 折叠档,t_ 直出 C 串常量 —— 表即编译期物,运行时零构表);数值表 事实(计数/版本戳)经 comptime fn 的 I 域递归/循环派生(ceval Call 仅收 I 域实参,04_generics_comptime/04h_comptime_stmt 已证形)。 struct 数组/段预切分归一化表 = CVM 能力外,不采(登记志向:ceval 升级 后可在 comptime 归一化为段表,匹配热路径再省一层切分)。
表语法(作者面,匹配器零宽容): 条目 = "METHOD SP pattern",条目间 '|' 分隔;METHOD = 大写 token (GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS/TRACE;全 token 字节比较, 伪造形 PUTT/POSTX/OPTI0NS → 码 0,见 rm_mcode_str/frm_mcode_buf); pattern 段以 '/' 分,":name" 段 = 参数段(捕获至下一 '/' 或尾); 尾斜杠严格(无隐式归一化,从严即默认);优先级 = 声明序 first-match。 query(?)/fragment(#)不入匹配(零拷贝缩界);参数按捕获序存 4 槽 (v1 上限 4,超 4 参数路由照常命中、溢出槽不捕获 —— 登记上限)。
匹配语义: 逐条目扫描:路径全匹配 + 方法码相等 → rc=1 即刻返回(first-match); 路径匹配而方法不齐 → 记 405 候选(首个)继续扫 —— 后条目方法齐则仍命中 (方法面同样 first-match);扫毕:有 405 候选 → rc=0(405 面),否则 rc=-1(404 面)。未知方法 token 码 = 0,不与任何路由相等 → 405 面 (501 映射归框架后续波次,登记)。
参数提取(类型化访问器;字节面零拷贝,Str 化经 rm 表): :id 面 = frm_param_i64(严格十进制,非数字/空/溢出拒 —— hs_parse_dec 界门同款);:name 面 = frm_param(原始切片 Str)/ frm_param_dec(percent 解码经 std/enc pct_decode,%2F 解 '/' 但【不】重分段 —— 解码只在提取 时发生)。Option[Str] 的 let 绑定 emit 缺口(P6-A 探针实证:int32_t 落出)→ 解码面以 inline 调用 enc_get/enc_some 组成(dft/谓词双出口), 永不绑定 Option 中间值。
派发缺口(消费方面;Task 5 todo_api 落策略):派发 if/match 恒须带缺省 臂 —— 未处理 route id 落 404 面(rc=-1 同形响应),不落空。 frm_slice_str 并集注记(Task 3):非 printable/越域字节 → ""(空串), 与"空输入"不可区分 —— 二进制/非 ASCII 面禁用本助手(body 绑定走 List[I32] 字节道,ws.ct lane 先例)。
缩放注记(≤100ns 门的适用域):线性扫描 O(路由数 × 模式字节);小表 (≤ ~32 条)emit 臂亚百纳秒(x_bench 实测),radix 树/DFA = P9 志向 (表尺寸增长先看 OpenAPI 导出与真实应用规模,不过早设计)。
形态纪律(全 (f)/(g)/(h) 已证形):零 use 纯模块 + 仅 std.enc(消费方 严禁再直 use std.enc —— 加载器严格树 E5020,P4-C 在案;enc 解码面一律 走本模块参数访问器);无闭包/无 Drop 局部/无 match/无方法调用 —— 自由 函数 + 值 struct 进出;while 体仅标量局部;byte_at/byte_slice 入参恒 I32 域((i) 在案);跨模块公开面 = struct 返回 + 标量 getter((h) 缺口绕行,parse.ct 同款)。lane 不入本模块(视图形参索引赋值 emit 拒 (⑦),匹配全程零拷贝读 buf)。
pub struct
struct FrmRoute
| Field | Type |
|---|---|
rc |
I64 |
id |
I64 |
np |
I64 |
p0s |
I64 |
p0l |
I64 |
p1s |
I64 |
p1l |
I64 |
p2s |
I64 |
p2l |
I64 |
p3s |
I64 |
p3l |
I64 |
struct FrmI64
:id 类型化访问器结果(严格十进制;rc = 1 有效)
| Field | Type |
|---|---|
rc |
I64 |
v |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
frm_m_get() |
I64 |
— |
frm_m_post() |
I64 |
— |
frm_m_put() |
I64 |
— |
frm_m_delete() |
I64 |
— |
frm_m_patch() |
I64 |
— |
frm_m_head() |
I64 |
— |
frm_m_options() |
I64 |
— |
frm_m_trace() |
I64 |
— |
frm_rc_match() |
I64 |
匹配结果 rc 码(1 = 命中 / 0 = 405 面 / -1 = 404 面) |
frm_rc_method() |
I64 |
— |
frm_rc_miss() |
I64 |
— |
frm_mcode_buf(buf: &[I64], s: I64, l: I64) |
I64 |
请求侧方法码(lane 切片;parse.ct method 槽直喂;全 token 比较,同上) |
fr_rc(m: FrmRoute) |
I64 |
— |
fr_id(m: FrmRoute) |
I64 |
— |
fr_np(m: FrmRoute) |
I64 |
— |
fr_ps(m: FrmRoute, k: I64) |
I64 |
— |
fr_pl(m: FrmRoute, k: I64) |
I64 |
— |
frm_match(spec: Str, meth: I64, buf: &[I64], ts: I64, tl: I64) |
FrmRoute |
路由匹配:spec(消费方 comptime const 表)× 方法码 × 请求目标 buf 切片 (parse.ct target 槽直喂;query/fragment 零拷贝缩界)。语义见头注。 |
frm_slice_str(src: &[I64], a: I64, b: I64) |
Str |
lane 字节域 → Str(printable ASCII 门,client.ct cx_slice_str 同款已证形; 123 '{' 词法域拒;越域 → "") |
frm_param(buf: &[I64], m: FrmRoute, k: I64) |
Str |
第 k 参数原始切片(未解码;k 越界/无捕获 → "";offsets 绝对指向 buf) |
frm_param_dec(buf: &[I64], m: FrmRoute, k: I64, bad: Str) |
Str |
第 k 参数 percent 解码(经 std/enc;非法 → bad 哨兵 —— Option 中间值 不落 let 绑定,emit 缺口绕行见头注) |
frm_param_dec_ok(buf: &[I64], m: FrmRoute, k: I64) |
I64 |
第 k 参数 percent 解码可解判(1 = 可解 / 0 = 不可解;谓词出口) |
fi_rc(x: FrmI64) |
I64 |
— |
fi_v(x: FrmI64) |
I64 |
— |
frm_param_i64(buf: &[I64], m: FrmRoute, k: I64) |
FrmI64 |
第 k 参数 → I64(严格 1DIGIT,无符号;非数字/空/溢出拒 —— parse.ct hs_parse_dec 界门同款 + C10 宽域惯用法((i) 乘法定宽)。评审修正:阈值 精确命中亦裁 —— acc == 922337203685477580 且位 > 7 时 acc10+d 越域 即双臂确定性 panic(如 9223372036854775808;仅查 > 的窗在请求路径可达, P4 先例 = 可达实例就地修) |