xref: /aosp_15_r20/tools/treble/hacksaw/config/config.go (revision 105f628577ac4ba0e277a494fbb614ed8c12a994)
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