1.21.8 data
Some checks failed
CodeQL / Analyze (go) (push) Has been cancelled
Go / Test (1.22) (push) Has been cancelled
Go / Test (^1.22) (push) Has been cancelled

This commit is contained in:
2025-08-22 06:17:33 +08:00
parent 133e3fab4a
commit 0958972953
173 changed files with 13782 additions and 406 deletions

View File

@ -47,3 +47,104 @@ func (n Node) WriteTo(w io.Writer) (int64, error) {
},
}.WriteTo(w)
}
func (g *Graph) ReadFrom(r io.Reader) (int64, error) {
var totalBytes int64
// 讀取 nodes 數組
nodesReader := pk.Array(&g.nodes)
n, err := nodesReader.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += n
// 讀取版本號 (VarInt(0))
var version pk.VarInt
n, err = version.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += n
return totalBytes, nil
}
func (n *Node) ReadFrom(r io.Reader) (int64, error) {
var totalBytes int64
// 讀取 flag
var flag pk.Byte
bytes, err := flag.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
// 從 flag 中提取 kind
n.kind = byte(flag) & 0x03
// 讀取 Children 數組
childrenSlice := (*[]pk.VarInt)(unsafe.Pointer(&n.Children))
childrenReader := pk.Array(childrenSlice)
bytes, err = childrenReader.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
// 讀取 redirect 選項
redirectOpt := pk.Opt{
Has: func() bool { return n.kind&hasRedirect != 0 },
Field: nil, // TODO: 實現 redirect node 讀取
}
bytes, err = redirectOpt.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
// 讀取名稱選項 (ArgumentNode 或 LiteralNode)
if n.kind == ArgumentNode || n.kind == LiteralNode {
var nameStr pk.String
nameOpt := pk.Opt{
Has: func() bool { return n.kind == ArgumentNode || n.kind == LiteralNode },
Field: &nameStr,
}
bytes, err = nameOpt.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
n.Name = string(nameStr)
}
// 讀取 Parser 選項 (僅 ArgumentNode)
if n.kind == ArgumentNode {
parserOpt := pk.Opt{
Has: func() bool { return n.kind == ArgumentNode },
Field: &n.Parser,
}
bytes, err = parserOpt.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
}
// 讀取 Suggestions 類型選項
suggestionsOpt := pk.Opt{
Has: func() bool { return byte(flag)&hasSuggestionsType != 0 },
Field: nil, // TODO: 實現 Suggestions 類型讀取
}
bytes, err = suggestionsOpt.ReadFrom(r)
if err != nil {
return totalBytes, err
}
totalBytes += bytes
if byte(flag)&isExecutable != 0 {
}
return totalBytes, nil
}