Skip to content

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 时 acc
10+d 越域
即双臂确定性 panic(如 9223372036854775808;仅查 > 的窗在请求路径可达,
P4 先例 = 可达实例就地修)