func AddCatalog()

in cli/api/catalog/catalog.go [219:302]


func AddCatalog(network *net.Network, resource string) (*models.CatalogBundleAddResult, error) {
	urlString := "/v1/catalog"
	urlStringWithDetail := urlString + "?detail=true"
	var result models.CatalogBundleAddResult
	var body []byte

	//Force auto-detect by default
	contentType := "application/octet-stream"
	u, err := url.Parse(resource)
	if err != nil {
		return nil, err
	}

	//If the resource exists as a file, or if the resource-parsed-as-URL as file scheme
	_, err = os.Stat(resource)
	if err == nil || "file" == u.Scheme {
		if "file" == u.Scheme {
			if u.Path == "" {
				return nil, errors.New("No resource in 'file:' URL: " + resource)
			}
			resource = u.Path
		}

		file, err := os.Open(filepath.Clean(resource))
		if err != nil {
			return nil, err
		}

		fileStat, err := file.Stat()
		if err != nil {
			return nil, err
		}

		var dat []byte

		if fileStat.IsDir() {
			//A dir is a special case, we need to zip it up, and call a different network method
			buf, err := ZipResource(resource)
			if err != nil {
				return nil, err
			}
			dat = buf.Bytes()
			contentType = "application/x-zip"
		} else {
			extension := filepath.Ext(resource)
			lowercaseExtension := strings.ToLower(extension)
			if lowercaseExtension == ".zip" {
				contentType = "application/x-zip"
				urlString = urlStringWithDetail
			} else if lowercaseExtension == ".jar" {
				contentType = "application/x-jar"
				urlString = urlStringWithDetail
			} else if lowercaseExtension == ".yaml" || lowercaseExtension == ".bom" {
				contentType = "application/x-yaml"
			}

			dat, err = ioutil.ReadFile(resource)
			if err != nil {
				return nil, err
			}
		}

		body, err = network.SendPostRequestWithContentType(urlStringWithDetail, dat, contentType)
		if err != nil {
			return nil, err
		}

	} else if "http" == u.Scheme || "https" == u.Scheme {
		body, err = network.SendPostResourceRequest(urlString, resource, contentType)
		if err != nil {
			return nil, err
		}

	} else {
		return nil, errors.New("File does not exist or unrecognised URL protocol scheme: " + resource)
	}

	err = json.Unmarshal(body, &result)
	if result.Code == "" {
		// detail API not supported, just store the types
		err = json.Unmarshal(body, &result.Types)
	}
	return &result, err
}