github.com/go-goxm/goxm@v0.4.4/config.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  	"path/filepath"
    10  	"regexp"
    11  	"strings"
    12  )
    13  
    14  type RawConfig struct {
    15  	Repos map[string]json.RawMessage `json:"repos"`
    16  }
    17  
    18  type Repository interface {
    19  	Get(ctx context.Context, module, attifact string) (io.ReadCloser, int, error)
    20  	Put(ctx context.Context, module, version string, goModData, goInfoData, goZipData []byte) error
    21  }
    22  
    23  type Config struct {
    24  	Repos map[string]Repository
    25  }
    26  
    27  type RepoTypeConfig struct {
    28  	Type string `json:"type"`
    29  }
    30  
    31  const defaultConfigName = ".goxm.json"
    32  
    33  func LoadDefaultConfig() (*Config, error) {
    34  	var err error
    35  	var configPath string
    36  	var prevConfigPath string
    37  
    38  	for cp := defaultConfigName; ; cp = filepath.Join("..", cp) {
    39  		prevConfigPath = configPath
    40  		configPath, err = filepath.Abs(cp)
    41  		if err != nil || prevConfigPath == configPath {
    42  			return nil, fmt.Errorf("Config file not found: %v", defaultConfigName)
    43  		}
    44  
    45  		configFile, err := os.Open(configPath)
    46  		if err != nil {
    47  			continue
    48  		}
    49  
    50  		config, err := LoadConfig(configFile)
    51  		if err != nil {
    52  			return nil, fmt.Errorf("Error loading default config: %v: %w", configPath, err)
    53  		}
    54  		return config, nil
    55  	}
    56  }
    57  
    58  func LoadConfig(configReader io.Reader) (*Config, error) {
    59  	config := &Config{
    60  		Repos: map[string]Repository{},
    61  	}
    62  
    63  	var rawConfig *RawConfig
    64  	err := json.NewDecoder(configReader).Decode(&rawConfig)
    65  	if err != nil {
    66  		return nil, fmt.Errorf("Error reading file: %w", err)
    67  	}
    68  
    69  	for moduleGlob, rawRepoConfig := range rawConfig.Repos {
    70  		_, err = regexp.Compile(globToRegexp(moduleGlob))
    71  		if err != nil {
    72  			return nil, fmt.Errorf("Malformed module glob: %v: %w", moduleGlob, err)
    73  		}
    74  
    75  		var repoTypeConfig *RepoTypeConfig
    76  		err = json.Unmarshal(rawRepoConfig, &repoTypeConfig)
    77  		if err != nil {
    78  			return nil, fmt.Errorf("Error parsing repo config: %v: %w", moduleGlob, err)
    79  		}
    80  
    81  		switch strings.ToLower(repoTypeConfig.Type) {
    82  		case "codeartifact":
    83  			var codeArtifactRepoConfig *CodeArtifactRepoConfig
    84  			err = json.Unmarshal(rawRepoConfig, &codeArtifactRepoConfig)
    85  			if err != nil {
    86  				return nil, fmt.Errorf("Error parsing repo config: %v: %w", repoTypeConfig.Type, err)
    87  			}
    88  			config.Repos[moduleGlob] = codeArtifactRepoConfig
    89  
    90  		default:
    91  			return nil, fmt.Errorf("Repository type not supported: %v", repoTypeConfig.Type)
    92  		}
    93  	}
    94  
    95  	return config, nil
    96  }
    97  
    98  func globToRegexp(glob string) string {
    99  	return strings.ReplaceAll(regexp.QuoteMeta(glob), "\\*", "(.*)")
   100  }