this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

make lexgen more independent tool again move packages to file for command line setting mkdir -p outdir

authored by

Brian Olson and committed by
Brian Olson
63d34ffb 67e9a6d7

+125 -44
+5 -5
Makefile
··· 25 25 go build ./cmd/fakermaker 26 26 go build ./cmd/hepa 27 27 go build ./cmd/supercollider 28 - go build -o ./sonar-cli ./cmd/sonar 28 + go build -o ./sonar-cli ./cmd/sonar 29 29 go build ./cmd/palomar 30 30 31 31 .PHONY: all ··· 67 67 68 68 .PHONY: lexgen 69 69 lexgen: ## Run codegen tool for lexicons (lexicon JSON to Go packages) 70 - go run ./cmd/lexgen/ $(LEXDIR) 70 + go run ./cmd/lexgen/ --build-file cmd/lexgen/bsky.json $(LEXDIR) 71 71 72 72 .PHONY: cborgen 73 73 cborgen: ## Run codegen tool for CBOR serialization ··· 87 87 88 88 .PHONY: run-dev-relay 89 89 run-dev-relay: .env ## Runs 'bigsky' Relay for local dev 90 - GOLOG_LOG_LEVEL=info go run ./cmd/bigsky --admin-key localdev 91 - # --crawl-insecure-ws 90 + GOLOG_LOG_LEVEL=info go run ./cmd/bigsky --admin-key localdev 91 + # --crawl-insecure-ws 92 92 93 93 .PHONY: build-relay-image 94 94 build-relay-image: ## Builds 'bigsky' Relay docker image ··· 103 103 .PHONY: run-relay-image 104 104 run-relay-image: 105 105 docker run -p 2470:2470 bigsky /bigsky --admin-key localdev 106 - # --crawl-insecure-ws 106 + # --crawl-insecure-ws 107 107 108 108 .PHONY: run-dev-search 109 109 run-dev-search: .env ## Runs search daemon for local dev
+26
cmd/lexgen/bsky.json
··· 1 + [ 2 + { 3 + "package": "bsky", 4 + "prefix": "app.bsky", 5 + "outdir": "api/bsky", 6 + "import": "github.com/bluesky-social/indigo/api/bsky" 7 + }, 8 + { 9 + "package": "atproto", 10 + "prefix": "com.atproto", 11 + "outdir": "api/atproto", 12 + "import": "github.com/bluesky-social/indigo/api/atproto" 13 + }, 14 + { 15 + "package": "chat", 16 + "prefix": "chat.bsky", 17 + "outdir": "api/chat", 18 + "import": "github.com/bluesky-social/indigo/api/chat" 19 + }, 20 + { 21 + "package": "ozone", 22 + "prefix": "tools.ozone", 23 + "outdir": "api/ozone", 24 + "import": "github.com/bluesky-social/indigo/api/ozone" 25 + } 26 + ]
+41 -2
cmd/lexgen/main.go
··· 1 1 package main 2 2 3 3 import ( 4 + "errors" 4 5 "fmt" 5 6 "io/fs" 6 7 "os" ··· 79 80 Name: "package", 80 81 Value: "schemagen", 81 82 }, 83 + &cli.StringFlag{ 84 + Name: "build", 85 + Value: "", 86 + }, 87 + &cli.StringFlag{ 88 + Name: "build-file", 89 + Value: "", 90 + }, 82 91 } 83 92 app.Action = func(cctx *cli.Context) error { 84 93 paths, err := expandArgs(cctx.Args().Slice()) ··· 100 109 schemas = append(schemas, s) 101 110 } 102 111 112 + buildLiteral := cctx.String("build") 113 + buildPath := cctx.String("build-file") 114 + var packages []lex.Package 115 + if buildLiteral != "" { 116 + if buildPath != "" { 117 + return errors.New("must not set both --build and --build-file") 118 + } 119 + packages, err = lex.ParsePackages([]byte(buildLiteral)) 120 + if err != nil { 121 + return fmt.Errorf("--build error, %w", err) 122 + } 123 + if len(packages) == 0 { 124 + return errors.New("--build must specify at least one Package{}") 125 + } 126 + } else if buildPath != "" { 127 + blob, err := os.ReadFile(buildPath) 128 + if err != nil { 129 + return fmt.Errorf("--build-file error, %w", err) 130 + } 131 + packages, err = lex.ParsePackages(blob) 132 + if err != nil { 133 + return fmt.Errorf("--build-file error, %w", err) 134 + } 135 + if len(packages) == 0 { 136 + return errors.New("--build-file must specify at least one Package{}") 137 + } 138 + } else { 139 + return errors.New("need exactly one of --build or --build-file") 140 + } 141 + 103 142 if cctx.Bool("gen-server") { 104 143 pkgname := cctx.String("package") 105 144 outdir := cctx.String("outdir") 106 145 if outdir == "" { 107 146 return fmt.Errorf("must specify output directory (--outdir)") 108 147 } 109 - defmap := lex.BuildExtDefMap(schemas) 148 + defmap := lex.BuildExtDefMap(schemas, packages) 110 149 _ = defmap 111 150 112 151 paths := cctx.StringSlice("types-import") ··· 123 162 } 124 163 125 164 } else { 126 - return lex.Run(schemas) 165 + return lex.Run(schemas, packages) 127 166 } 128 167 129 168 return nil
+34 -37
lex/gen.go
··· 229 229 230 230 // Build total map of all types defined inside schemas. 231 231 // Return map from fully qualified type name to its *TypeSchema 232 - func BuildExtDefMap(ss []*Schema) map[string]*ExtDef { 232 + func BuildExtDefMap(ss []*Schema, packages []Package) map[string]*ExtDef { 233 233 out := make(map[string]*ExtDef) 234 234 for _, s := range ss { 235 235 for k, d := range s.Defs { ··· 238 238 d.defName = k 239 239 240 240 var pref string 241 - for _, pkg := range Packages { 241 + for _, pkg := range packages { 242 242 if strings.HasPrefix(s.ID, pkg.Prefix) { 243 243 pref = pkg.Prefix 244 244 break ··· 303 303 } 304 304 } 305 305 306 - func GenCodeForSchema(pkg string, prefix string, fname string, reqcode bool, s *Schema, defmap map[string]*ExtDef) error { 306 + func GenCodeForSchema(pkg Package, reqcode bool, s *Schema, packages []Package, defmap map[string]*ExtDef) error { 307 + err := os.MkdirAll(pkg.Outdir, 0755) 308 + if err != nil { 309 + return fmt.Errorf("%s: could not mkdir, %w", pkg.Outdir, err) 310 + } 311 + fname := filepath.Join(pkg.Outdir, s.Name()+".go") 307 312 buf := new(bytes.Buffer) 308 313 pf := printerf(buf) 309 314 310 - s.prefix = prefix 315 + s.prefix = pkg.Prefix 311 316 for _, d := range s.Defs { 312 - d.prefix = prefix 317 + d.prefix = pkg.Prefix 313 318 } 314 319 315 320 // Add the standard Go generated code header as recognized by GitHub, VS Code, etc. 316 321 // See https://golang.org/s/generatedcode. 317 322 pf("// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT.\n\n") 318 323 319 - pf("package %s\n\n", pkg) 324 + pf("package %s\n\n", pkg.GoPackage) 320 325 321 326 pf("// schema: %s\n\n", s.ID) 322 327 ··· 327 332 pf("\tcbg \"github.com/whyrusleeping/cbor-gen\"\n") 328 333 pf("\t\"github.com/bluesky-social/indigo/xrpc\"\n") 329 334 pf("\t\"github.com/bluesky-social/indigo/lex/util\"\n") 330 - for k, v := range prefixToGoImport { 331 - if k != prefix { 332 - pf("\t%s %q\n", importNameForPrefix(k), v) 335 + for _, xpkg := range packages { 336 + if xpkg.Prefix != pkg.Prefix { 337 + pf("\t%s %q\n", importNameForPrefix(xpkg.Prefix), xpkg.Import) 333 338 } 334 339 } 335 340 pf(")\n\n") 336 341 337 - tps := s.AllTypes(prefix, defmap) 342 + tps := s.AllTypes(pkg.Prefix, defmap) 338 343 339 344 if err := writeDecoderRegister(buf, tps); err != nil { 340 345 return err ··· 350 355 } 351 356 } 352 357 358 + // reqcode is always True 353 359 if reqcode { 354 - name := nameFromID(s.ID, prefix) 360 + name := nameFromID(s.ID, pkg.Prefix) 355 361 main, ok := s.Defs["main"] 356 362 if ok { 357 363 if err := writeMethods(name, main, buf); err != nil { ··· 398 404 if werr != nil { 399 405 return werr 400 406 } 401 - return fmt.Errorf("failed to format output of %q with goimports: %w", fname, err) 407 + return fmt.Errorf("failed to format output of %q with goimports: %w (wrote failed file to ./temp)", fname, err) 402 408 } 403 409 404 410 if err := os.WriteFile(fname, fixed, 0664); err != nil { ··· 1475 1481 } 1476 1482 1477 1483 type Package struct { 1478 - GoPackage string 1479 - Prefix string 1480 - Outdir string 1484 + GoPackage string `json:"package"` 1485 + Prefix string `json:"prefix"` 1486 + Outdir string `json:"outdir"` 1487 + Import string `json:"import"` 1481 1488 } 1482 1489 1483 - var Packages []Package = []Package{ 1484 - Package{"bsky", "app.bsky", "api/bsky"}, 1485 - Package{"atproto", "com.atproto", "api/atproto"}, 1486 - Package{"chat", "chat.bsky", "api/chat"}, 1487 - Package{"ozone", "tools.ozone", "api/ozone"}, 1488 - } 1489 - 1490 - var prefixToGoImport map[string]string 1491 - 1492 - func init() { 1493 - prefixToGoImport = map[string]string{ 1494 - "app.bsky": "github.com/bluesky-social/indigo/api/bsky", 1495 - "chat.bsky": "github.com/bluesky-social/indigo/api/chat", 1496 - "com.atproto": "github.com/bluesky-social/indigo/api/atproto", 1497 - "tools.ozone": "github.com/bluesky-social/indigo/api/ozone", 1490 + // ParsePackages reads a json blob which should be an array of Package{} objects. 1491 + func ParsePackages(jsonBytes []byte) ([]Package, error) { 1492 + var packages []Package 1493 + err := json.Unmarshal(jsonBytes, &packages) 1494 + if err != nil { 1495 + return nil, err 1498 1496 } 1497 + return packages, nil 1499 1498 } 1500 1499 1501 - func Run(schemas []*Schema) error { 1502 - defmap := BuildExtDefMap(schemas) 1500 + func Run(schemas []*Schema, packages []Package) error { 1501 + defmap := BuildExtDefMap(schemas, packages) 1503 1502 1504 - for _, pkg := range Packages { 1503 + for _, pkg := range packages { 1505 1504 prefix := pkg.Prefix 1506 1505 FixRecordReferences(schemas, defmap, prefix) 1507 1506 } 1508 1507 1509 - for _, pkg := range Packages { 1508 + for _, pkg := range packages { 1510 1509 for _, s := range schemas { 1511 1510 if !strings.HasPrefix(s.ID, pkg.Prefix) { 1512 1511 continue 1513 1512 } 1514 1513 1515 - fname := filepath.Join(pkg.Outdir, s.Name()+".go") 1516 - 1517 - if err := GenCodeForSchema(pkg.GoPackage, pkg.Prefix, fname, true, s, defmap); err != nil { 1514 + if err := GenCodeForSchema(pkg, true, s, packages, defmap); err != nil { 1518 1515 return fmt.Errorf("failed to process schema %q: %w", s.path, err) 1519 1516 } 1520 1517 }
+19
lex/gen_test.go
··· 1 + package lex 2 + 3 + import "testing" 4 + 5 + func TestParsePackages(t *testing.T) { 6 + text := `[{"package": "bsky", "prefix": "app.bsky", "outdir": "api/bsky", "import": "github.com/bluesky-social/indigo/api/bsky"}]` 7 + parsed, err := ParsePackages([]byte(text)) 8 + if err != nil { 9 + t.Fatalf("error parsing json: %s", err) 10 + } 11 + if len(parsed) != 1 { 12 + t.Fatalf("expected 1, got %d", len(parsed)) 13 + } 14 + expected := Package{"bsky", "app.bsky", "api/bsky", "github.com/bluesky-social/indigo/api/bsky"} 15 + if expected != parsed[0] { 16 + t.Fatalf("expected %#v, got %#v", expected, parsed[0]) 17 + } 18 + 19 + }