package main import ( "encoding/json" "golang.org/x/crypto/ssh/terminal" "os" "strings" "syscall" ) type ServerSettings struct { URL string Username string Password string } type Settings struct { EWS ServerSettings CalDAV ServerSettings Anonymize struct { Title string } } func ensurePassword(password *string, name string) { if *password != "" { // Nothing to do. Password already set. return } print(name + " password: ") b, err := terminal.ReadPassword(int(syscall.Stdin)) println() if err != nil { panic(err) } *password = string(b) } func LoadSettings() Settings { f, err := os.Open("calanonsync.json") if err != nil { panic(err) } settings := Settings{} err = json.NewDecoder(f).Decode(&settings) if err != nil { panic(err) } if settings.CalDAV.URL != "" && !strings.HasSuffix(settings.CalDAV.URL, "/") { settings.CalDAV.URL += "/" } ensurePassword(&settings.EWS.Password, "EWS") ensurePassword(&settings.CalDAV.Password, "CalDAV") return settings }