config: initialize and read config file

pull/7/head
oscar 2022-09-21 17:00:10 +12:00
parent 3bb03bad87
commit 2ab17147fb
2 changed files with 159 additions and 3 deletions

View File

@ -0,0 +1,147 @@
package configs
import (
"encoding/json"
"errors"
"fmt"
"io"
"os"
)
const (
ConfigFileName string = ".devtool"
)
var (
ErrConfigNotInitialized error = errors.New("Config file is not initialized")
)
type Config struct {
// ProjectPath is where all git repositories will be downloaded to
ProjectPath string
// VolumePath is where all the persisitant data will be saved to
VolumePath string
//
LoginCredential LoginCredential
//
RepositoryConfig map[string]RepositoryConfig
}
// LoginCredential stores the user credential for API request
type LoginCredential struct {
Username string
Password string
Address string
}
type RepositoryConfig struct {
Name string
URL string
Directory string
Private bool
GitUsername string
GitPassword string
}
func GetConfig() (*Config, error) {
file, err := getConfigFile(ConfigFileName)
if err != nil {
if err == ErrConfigNotInitialized {
config, err := initializeConfig(file)
if err != nil {
return config, err
}
}
}
return getConfig(file)
}
func initializeConfig(w io.WriteCloser) (*Config, error) {
config := &Config{}
fmt.Printf("Set the project path: ")
fmt.Scanf("%s", &(config.ProjectPath))
fmt.Printf("Set the volume path: ")
fmt.Scanf("%s", &(config.VolumePath))
var loginCredential LoginCredential
fmt.Printf("Set login credential username(admin): ")
fmt.Scanf("%s", &(loginCredential.Username))
if loginCredential.Username == "" {
loginCredential.Username = "admin"
}
for {
fmt.Printf("Set login credential password(******): ")
fmt.Scanf("%s", &(loginCredential.Password))
if loginCredential.Password != "" {
break
}
fmt.Println("Login credential password must be provided")
}
fmt.Printf("Set login address(127.0.0.1): ")
fmt.Scanf("%s", &(loginCredential.Address))
if loginCredential.Address == "" {
loginCredential.Address = "http://127.0.0.1:9000/api/auth"
} else {
loginCredential.Address = fmt.Sprintf("http://%s:9000/api/auth", loginCredential.Address)
}
config.LoginCredential = loginCredential
// able to configure multiple project
// if utils.PromptConfirm("Do you want to configure the repository now?") {
// // configure repository
// }
bytes, err := json.Marshal(config)
if err != nil {
return nil, err
}
_, err = w.Write(bytes)
if err != nil {
return nil, err
}
return config, nil
}
func getConfig(f io.Reader) (*Config, error) {
config := &Config{}
bytes := make([]byte, 0)
_, err := f.Read(bytes)
if err != nil {
return nil, err
}
err = json.Unmarshal(bytes, &config)
if err != nil {
return nil, err
}
return config, nil
}
// getConfigFile get the config file handler
func getConfigFile(name string) (*os.File, error) {
_, err := os.Stat(name)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
//create file
file, err := os.Create(name)
if err != nil {
return nil, fmt.Errorf("fail to create config file: %w", err)
}
// first set up the git project path and volume path
// git credential
return file, err
} else {
return nil, err
}
}
return os.OpenFile(name, os.O_RDWR, 0644)
}

View File

@ -14,11 +14,20 @@ func PromptContinue() bool {
return false
}
func PromptMenu(listMenu func()) int {
func PromptConfirm(question string) bool {
ret := fmt.Sprintf("%s (y/n)?", question)
if ret == "y" || ret == "yes" {
return true
}
return false
}
func PromptMenu(listMenu func()) string {
listMenu()
var option int
fmt.Scanf("%d", &option)
var option string
fmt.Scanf("%s", &option)
return option
}