feat(ledger): add demo CLI for append/verify/show #2
56
cmd/ledger-demo/main.go
Normal file
56
cmd/ledger-demo/main.go
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"shadowmo/Cognition-OS/runtime/ledger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
path := flag.String("file", "ledger-demo.jsonl", "path to ledger file")
|
||||||
|
op := flag.String("op", "append", "operation: append|verify|show")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
l, err := ledger.Open(*path)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "open error:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
|
switch *op {
|
||||||
|
case "append":
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"msg": fmt.Sprintf("demo event at %s", time.Now().Format(time.RFC3339)),
|
||||||
|
}
|
||||||
|
h, err := l.Append("demo_event", payload)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "append error:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
fmt.Println("appended hash:", h)
|
||||||
|
case "verify":
|
||||||
|
if err := l.Verify(); err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "verify failed:", err)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
fmt.Println("ledger verified ok")
|
||||||
|
case "show":
|
||||||
|
f, err := os.Open(*path)
|
||||||
|
if err != nil { fmt.Fprintln(os.Stderr, "open:", err); os.Exit(1) }
|
||||||
|
defer f.Close()
|
||||||
|
dec := json.NewDecoder(f)
|
||||||
|
for {
|
||||||
|
var e map[string]interface{}
|
||||||
|
if err := dec.Decode(&e); err != nil { break }
|
||||||
|
b, _ := json.MarshalIndent(e, "", " ")
|
||||||
|
fmt.Println(string(b))
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
fmt.Fprintln(os.Stderr, "unknown op")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user