func parseZigUpstream()

in tools/releaser/main.go [493:552]


func parseZigUpstream(defsPath string) (zigUpstream, error) {
	ret := zigUpstream{}

	data, err := os.ReadFile(defsPath)
	if err != nil {
		return zigUpstream{}, err
	}
	parsed, err := bzl.Parse(defsPath, data)
	if err != nil {
		return zigUpstream{}, err
	}

	var nightlyFormat, releaseFormat string
	for _, expr := range parsed.Stmt {
		def, ok := expr.(*bzl.AssignExpr)
		if !ok {
			continue
		}

		key := def.LHS.(*bzl.Ident)
		var to *string

		switch key.Name {
		case "VERSION":
			to = &ret.version
		case "URL_FORMAT_RELEASE":
			to = &releaseFormat
		case "URL_FORMAT_NIGHTLY":
			to = &nightlyFormat
		default:
			continue
		}

		value, ok := def.RHS.(*bzl.StringExpr)
		if !ok {
			return zigUpstream{}, errors.New("got a non-string expression")
		}

		*to = value.Value
	}

	if ret.version == "" {
		return zigUpstream{}, errors.New("VERSION not found")
	}
	if strings.Contains(ret.version, "dev") {
		ret.urlTemplate = nightlyFormat
	} else {
		ret.urlTemplate = releaseFormat
	}
	if ret.urlTemplate == "" {
		return zigUpstream{}, fmt.Errorf("url format for %q not found", ret.version)
	}
	ret.urlTemplate = strings.Replace(ret.urlTemplate,
		"https://ziglang.org/",
		"https://mirror.bazel.build/ziglang.org/",
		1,
	)

	return ret, nil
}