package main

import (
	
	
	
	
	
)

type downloadedModule struct {
	Path     string // module path
	Version  string // module version
	Error    string // error loading module
	Info     string // absolute path to cached .info file
	GoMod    string // absolute path to cached .mod file
	Zip      string // absolute path to cached .zip file
	Dir      string // absolute path to cached source root directory
	Sum      string // checksum for path, version (as in go.sum)
	GoModSum string // checksum for go.mod (as in go.sum)
}

func ( string,  []string) ([]downloadedModule, error) {
	 := make([]string, len())
	for ,  := range  {
		[] =  + "@upgrade"
	}

	var  bytes.Buffer
	 := exec.Command("go", append([]string{"mod", "download", "-json"}, ...)...)
	.Stderr = os.Stderr
	.Stdout = &
	.Dir = 
	if  := .Run();  != nil {
		return nil, 
	}

	var  []downloadedModule
	for  := json.NewDecoder(&); ; {
		var  downloadedModule
		 := .Decode(&)
		if  == io.EOF {
			break
		}
		if  != nil {
			return nil, 
		}
		 = append(, )
	}
	return , nil
}