1*105f6285SAndroid Build Coastguard Worker// Copyright 2020 Google LLC 2*105f6285SAndroid Build Coastguard Worker// 3*105f6285SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*105f6285SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*105f6285SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*105f6285SAndroid Build Coastguard Worker// 7*105f6285SAndroid Build Coastguard Worker// https://www.apache.org/licenses/LICENSE-2.0 8*105f6285SAndroid Build Coastguard Worker// 9*105f6285SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*105f6285SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*105f6285SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*105f6285SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*105f6285SAndroid Build Coastguard Worker// limitations under the License. 14*105f6285SAndroid Build Coastguard Worker 15*105f6285SAndroid Build Coastguard Worker// Package config reads and writes hacksaw configuration data to io 16*105f6285SAndroid Build Coastguard Workerpackage config 17*105f6285SAndroid Build Coastguard Worker 18*105f6285SAndroid Build Coastguard Workerimport ( 19*105f6285SAndroid Build Coastguard Worker "encoding/json" 20*105f6285SAndroid Build Coastguard Worker "io" 21*105f6285SAndroid Build Coastguard Worker "io/ioutil" 22*105f6285SAndroid Build Coastguard Worker "os" 23*105f6285SAndroid Build Coastguard Worker "sync" 24*105f6285SAndroid Build Coastguard Worker) 25*105f6285SAndroid Build Coastguard Worker 26*105f6285SAndroid Build Coastguard Workertype Config struct { 27*105f6285SAndroid Build Coastguard Worker DefaultCodebase string 28*105f6285SAndroid Build Coastguard Worker Codebases map[string]string //key: name, value: path 29*105f6285SAndroid Build Coastguard Worker Workspaces map[string]string //key: name, value: codebase 30*105f6285SAndroid Build Coastguard Worker} 31*105f6285SAndroid Build Coastguard Worker 32*105f6285SAndroid Build Coastguard Worker//Read the configuration from an io.Reader 33*105f6285SAndroid Build Coastguard Workerfunc (c *Config) Read(input io.Reader) error { 34*105f6285SAndroid Build Coastguard Worker cfgBytes, err := ioutil.ReadAll(input) 35*105f6285SAndroid Build Coastguard Worker if err != nil { 36*105f6285SAndroid Build Coastguard Worker return err 37*105f6285SAndroid Build Coastguard Worker } 38*105f6285SAndroid Build Coastguard Worker return json.Unmarshal(cfgBytes, &c) 39*105f6285SAndroid Build Coastguard Worker} 40*105f6285SAndroid Build Coastguard Worker 41*105f6285SAndroid Build Coastguard Worker//Write the configuration to an io.Writer 42*105f6285SAndroid Build Coastguard Workerfunc (c Config) Write(output io.Writer) error { 43*105f6285SAndroid Build Coastguard Worker cfgBytes, err := json.MarshalIndent(c, "", " ") 44*105f6285SAndroid Build Coastguard Worker if err != nil { 45*105f6285SAndroid Build Coastguard Worker return err 46*105f6285SAndroid Build Coastguard Worker } 47*105f6285SAndroid Build Coastguard Worker _, err = output.Write(cfgBytes) 48*105f6285SAndroid Build Coastguard Worker return err 49*105f6285SAndroid Build Coastguard Worker} 50*105f6285SAndroid Build Coastguard Worker 51*105f6285SAndroid Build Coastguard Workerfunc (c *Config) ReadConfigFromFile(filePath string) error { 52*105f6285SAndroid Build Coastguard Worker _, err := os.Stat(filePath) 53*105f6285SAndroid Build Coastguard Worker if err != nil { 54*105f6285SAndroid Build Coastguard Worker return err 55*105f6285SAndroid Build Coastguard Worker } 56*105f6285SAndroid Build Coastguard Worker cfgFile, err := os.Open(filePath) 57*105f6285SAndroid Build Coastguard Worker if err != nil { 58*105f6285SAndroid Build Coastguard Worker return err 59*105f6285SAndroid Build Coastguard Worker } 60*105f6285SAndroid Build Coastguard Worker defer cfgFile.Close() 61*105f6285SAndroid Build Coastguard Worker err = c.Read(cfgFile) 62*105f6285SAndroid Build Coastguard Worker return err 63*105f6285SAndroid Build Coastguard Worker} 64*105f6285SAndroid Build Coastguard Worker 65*105f6285SAndroid Build Coastguard Workerfunc (c Config) WriteConfigToFile(filePath string) error { 66*105f6285SAndroid Build Coastguard Worker cfgFile, err := os.Create(filePath) 67*105f6285SAndroid Build Coastguard Worker if err != nil { 68*105f6285SAndroid Build Coastguard Worker return err 69*105f6285SAndroid Build Coastguard Worker } 70*105f6285SAndroid Build Coastguard Worker defer cfgFile.Close() 71*105f6285SAndroid Build Coastguard Worker return c.Write(cfgFile) 72*105f6285SAndroid Build Coastguard Worker} 73*105f6285SAndroid Build Coastguard Worker 74*105f6285SAndroid Build Coastguard Worker//Config gets a copy of the config 75*105f6285SAndroid Build Coastguard Workerfunc (c Config) Copy() Config { 76*105f6285SAndroid Build Coastguard Worker cfgCopy := Config{ 77*105f6285SAndroid Build Coastguard Worker DefaultCodebase: c.DefaultCodebase, 78*105f6285SAndroid Build Coastguard Worker Codebases: map[string]string{}, 79*105f6285SAndroid Build Coastguard Worker Workspaces: map[string]string{}} 80*105f6285SAndroid Build Coastguard Worker for name, path := range c.Codebases { 81*105f6285SAndroid Build Coastguard Worker cfgCopy.Codebases[name] = path 82*105f6285SAndroid Build Coastguard Worker } 83*105f6285SAndroid Build Coastguard Worker for name, codebase := range c.Workspaces { 84*105f6285SAndroid Build Coastguard Worker cfgCopy.Workspaces[name] = codebase 85*105f6285SAndroid Build Coastguard Worker } 86*105f6285SAndroid Build Coastguard Worker return cfgCopy 87*105f6285SAndroid Build Coastguard Worker} 88*105f6285SAndroid Build Coastguard Worker 89*105f6285SAndroid Build Coastguard Worker//Reset sets the config to zero values 90*105f6285SAndroid Build Coastguard Workerfunc (c *Config) Reset() { 91*105f6285SAndroid Build Coastguard Worker *c = Config{ 92*105f6285SAndroid Build Coastguard Worker DefaultCodebase: "", 93*105f6285SAndroid Build Coastguard Worker Codebases: map[string]string{}, 94*105f6285SAndroid Build Coastguard Worker Workspaces: map[string]string{}} 95*105f6285SAndroid Build Coastguard Worker} 96*105f6285SAndroid Build Coastguard Worker 97*105f6285SAndroid Build Coastguard Workervar singleton *Config 98*105f6285SAndroid Build Coastguard Workervar once sync.Once 99*105f6285SAndroid Build Coastguard Worker 100*105f6285SAndroid Build Coastguard Worker//Config gets the singleton config instance 101*105f6285SAndroid Build Coastguard Workerfunc GetConfig() *Config { 102*105f6285SAndroid Build Coastguard Worker once.Do(func() { 103*105f6285SAndroid Build Coastguard Worker singleton = &Config{ 104*105f6285SAndroid Build Coastguard Worker DefaultCodebase: "", 105*105f6285SAndroid Build Coastguard Worker Codebases: map[string]string{}, 106*105f6285SAndroid Build Coastguard Worker Workspaces: map[string]string{}} 107*105f6285SAndroid Build Coastguard Worker }) 108*105f6285SAndroid Build Coastguard Worker return singleton 109*105f6285SAndroid Build Coastguard Worker} 110