Changeset 424 in code for trunk/config/config.go


Ignore:
Timestamp:
Oct 25, 2020, 5:10:50 PM (5 years ago)
Author:
contact
Message:

Switch to go-scfg

We don't use child directives yet, but likely will in the future.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/config/config.go

    r371 r424  
    22
    33import (
    4         "bufio"
    54        "fmt"
    6         "io"
    75        "net"
    86        "os"
    97
    10         "github.com/google/shlex"
     8        "git.sr.ht/~emersion/go-scfg"
    119)
    1210
     
    6361
    6462func Load(path string) (*Server, error) {
    65         f, err := os.Open(path)
     63        cfg, err := scfg.Load(path)
    6664        if err != nil {
    6765                return nil, err
    6866        }
    69         defer f.Close()
    70 
    71         return Parse(f)
     67        return parse(cfg)
    7268}
    7369
    74 func Parse(r io.Reader) (*Server, error) {
    75         scanner := bufio.NewScanner(r)
    76 
    77         var directives []directive
    78         for scanner.Scan() {
    79                 words, err := shlex.Split(scanner.Text())
    80                 if err != nil {
    81                         return nil, fmt.Errorf("failed to parse config file: %v", err)
    82                 } else if len(words) == 0 {
    83                         continue
    84                 }
    85 
    86                 name, params := words[0], words[1:]
    87                 directives = append(directives, directive{name, params})
    88         }
    89         if err := scanner.Err(); err != nil {
    90                 return nil, fmt.Errorf("failed to read config file: %v", err)
    91         }
    92 
     70func parse(cfg scfg.Block) (*Server, error) {
    9371        srv := Defaults()
    94         for _, d := range directives {
     72        for _, d := range cfg {
    9573                switch d.Name {
    9674                case "listen":
    9775                        var uri string
    98                         if err := d.parseParams(&uri); err != nil {
     76                        if err := d.ParseParams(&uri); err != nil {
    9977                                return nil, err
    10078                        }
    10179                        srv.Listen = append(srv.Listen, uri)
    10280                case "hostname":
    103                         if err := d.parseParams(&srv.Hostname); err != nil {
     81                        if err := d.ParseParams(&srv.Hostname); err != nil {
    10482                                return nil, err
    10583                        }
    10684                case "tls":
    10785                        tls := &TLS{}
    108                         if err := d.parseParams(&tls.CertPath, &tls.KeyPath); err != nil {
     86                        if err := d.ParseParams(&tls.CertPath, &tls.KeyPath); err != nil {
    10987                                return nil, err
    11088                        }
    11189                        srv.TLS = tls
    11290                case "sql":
    113                         if err := d.parseParams(&srv.SQLDriver, &srv.SQLSource); err != nil {
     91                        if err := d.ParseParams(&srv.SQLDriver, &srv.SQLSource); err != nil {
    11492                                return nil, err
    11593                        }
    11694                case "log":
    117                         if err := d.parseParams(&srv.LogPath); err != nil {
     95                        if err := d.ParseParams(&srv.LogPath); err != nil {
    11896                                return nil, err
    11997                        }
     
    136114        return srv, nil
    137115}
    138 
    139 type directive struct {
    140         Name   string
    141         Params []string
    142 }
    143 
    144 func (d *directive) parseParams(out ...*string) error {
    145         if len(d.Params) != len(out) {
    146                 return fmt.Errorf("directive %q has wrong number of parameters: expected %v, got %v", d.Name, len(out), len(d.Params))
    147         }
    148         for i := range out {
    149                 *out[i] = d.Params[i]
    150         }
    151         return nil
    152 }
Note: See TracChangeset for help on using the changeset viewer.