config.go (1016B)
1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "net/url" 7 "os" 8 "strings" 9 ) 10 11 type Config struct { 12 BaseURL *url.URL 13 Username string 14 Password string 15 } 16 17 func readConfig(name string) (*Config, error) { 18 f, err := os.Open(name) 19 if err != nil { 20 return nil, err 21 } 22 defer f.Close() 23 var conf Config 24 sc := bufio.NewScanner(f) 25 for sc.Scan() { 26 line := strings.TrimSpace(sc.Text()) 27 if strings.HasPrefix(line, "#") { 28 continue 29 } else if line == "" { 30 continue 31 } 32 k, v, ok := strings.Cut(line, " ") 33 if !ok { 34 return nil, fmt.Errorf("key %s: expected whitespace after configuration key", k) 35 } else if v == "" { 36 return nil, fmt.Errorf("key %s: missing parameter", k) 37 } 38 switch k { 39 case "url": 40 u, err := url.Parse(v) 41 if err != nil { 42 return nil, fmt.Errorf("parse base url: %w", err) 43 } 44 conf.BaseURL = u 45 case "username": 46 conf.Username = v 47 case "password": 48 conf.Password = v 49 default: 50 return nil, fmt.Errorf("unknown configuration key %q", k) 51 } 52 } 53 return &conf, sc.Err() 54 }