func getFieldsFilesAndDataStreamType()

in pkg/genlib/fields/load.go [129:231]


func getFieldsFilesAndDataStreamType(ctx context.Context, baseURL, integration, dataStream, version string) ([]byte, string, error) {
	packageURL, err := makePackageURL(baseURL, integration, version)
	if err != nil {
		return nil, "", err
	}

	r, err := getFromURL(ctx, packageURL.String())
	if err != nil {
		return nil, "", err
	}

	var downloadPayload struct {
		Download string `json:"download"`
	}

	body, err := ioutil.ReadAll(r)
	if err = json.Unmarshal(body, &downloadPayload); err != nil {
		return nil, "", err
	}

	downloadURL, err := makeDownloadURL(baseURL, downloadPayload.Download)
	r, err = getFromURL(ctx, downloadURL.String())
	defer func(r io.ReadCloser) {
		if r != nil {
			_ = r.Close()
		}
	}(r)

	if err != nil {
		return nil, "", err
	}

	zipContent, err := ioutil.ReadAll(r)
	if err != nil {
		return nil, "", err
	}

	archive, err := zip.NewReader(bytes.NewReader(zipContent), int64(len(zipContent)))
	if err != nil {
		return nil, "", err
	}

	prefixFieldsPath := path.Join(fmt.Sprintf("%s-%s", integration, version), dataStreamSlug, dataStream, fieldsSlug)
	manifestPath := path.Join(fmt.Sprintf("%s-%s", integration, version), dataStreamSlug, dataStream, manifestSlug)

	var dataStreamType string
	var fieldsContent string
	for _, z := range archive.File {
		if z.FileInfo().IsDir() {
			continue
		}

		if !strings.HasPrefix(z.Name, prefixFieldsPath) && !strings.HasPrefix(z.Name, manifestPath) {
			continue
		}

		fieldsFileName := z.Name
		zr, err := z.Open()
		if err != nil {
			if zr != nil {
				_ = zr.Close()
			}
			return nil, "", err
		}

		fieldsFileContent, err := ioutil.ReadAll(zr)
		if err != nil {
			if zr != nil {
				_ = zr.Close()
			}
			return nil, "", err
		}

		_ = zr.Close()

		if strings.HasPrefix(z.Name, prefixFieldsPath) {
			key := strings.TrimSuffix(filepath.Base(fieldsFileName), filepath.Ext(fieldsFileName))
			keyEntry := fmt.Sprintf("- key: %s\n  fields:\n", key)
			for _, line := range strings.Split(string(fieldsFileContent), "\n") {
				keyEntry += `    ` + line + "\n"
			}

			fieldsContent += keyEntry
		}

		if strings.HasPrefix(z.Name, manifestPath) {
			var manifest yamlManifest

			cfg, err := yaml.NewConfig(fieldsFileContent)
			if err != nil {
				return nil, "", err
			}
			err = cfg.Unpack(&manifest)
			if err != nil {
				return nil, "", err
			}

			dataStreamType = manifest.Type
		}
	}

	return []byte(fieldsContent), dataStreamType, nil
}