2026-04-08 21:34:29 +02:00

71 lines
1.6 KiB
Go

package pgservice
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/lib/pq/internal/pqutil"
)
func FindService(path string, service string) (map[string]string, error) {
fp, err := os.Open(path)
if err != nil {
if pqutil.ErrNotExists(err) {
// libpq just returns "definition of service not found" if the
// default file doesn't exist, but IMO that's confusing.
return nil, fmt.Errorf("service file %q not found", path)
}
return nil, err
}
defer fp.Close()
var (
scan = bufio.NewScanner(fp)
i int
)
for scan.Scan() {
i++
line := strings.TrimSpace(scan.Text())
if line == "" || line[0] == '#' {
continue
}
// [service] header that we want.
if line[0] == '[' && line[len(line)-1] == ']' && strings.TrimSpace(line[1:len(line)-1]) == service {
opts := make(map[string]string)
for scan.Scan() {
i++
line := strings.TrimSpace(scan.Text())
if line == "" || line[0] == '#' {
continue
}
// Next header: our work here is done.
if line[0] == '[' && line[len(line)-1] == ']' {
return opts, nil
}
k, v, ok := strings.Cut(line, "=")
if !ok {
return nil, fmt.Errorf("line %d: missing '=' in %q", i, line)
}
k, v = strings.TrimSpace(k), strings.TrimSpace(v)
if k == "" {
return nil, fmt.Errorf("line %d: no value before '=' in %q", i, line)
}
opts[k] = v
}
if scan.Err() != nil {
return nil, scan.Err()
}
return opts, nil
}
}
if scan.Err() != nil {
return nil, scan.Err()
}
return nil, fmt.Errorf("definition of service %q not found", service)
}