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 }