package pgservicefile
import (
"bufio"
"errors"
"fmt"
"io"
"os"
"strings"
)
type Service struct {
Name string
Settings map [string ]string
}
type Servicefile struct {
Services []*Service
servicesByName map [string ]*Service
}
func (sf *Servicefile ) GetService (name string ) (*Service , error ) {
service , present := sf .servicesByName [name ]
if !present {
return nil , errors .New ("not found" )
}
return service , nil
}
func ReadServicefile (path string ) (*Servicefile , error ) {
f , err := os .Open (path )
if err != nil {
return nil , err
}
defer f .Close ()
return ParseServicefile (f )
}
func ParseServicefile (r io .Reader ) (*Servicefile , error ) {
servicefile := &Servicefile {}
var service *Service
scanner := bufio .NewScanner (r )
lineNum := 0
for scanner .Scan () {
lineNum += 1
line := scanner .Text ()
line = strings .TrimSpace (line )
if line == "" || strings .HasPrefix (line , "#" ) {
} else if strings .HasPrefix (line , "[" ) && strings .HasSuffix (line , "]" ) {
service = &Service {Name : line [1 : len (line )-1 ], Settings : make (map [string ]string )}
servicefile .Services = append (servicefile .Services , service )
} else {
parts := strings .SplitN (line , "=" , 2 )
if len (parts ) != 2 {
return nil , fmt .Errorf ("unable to parse line %d" , lineNum )
}
key := strings .TrimSpace (parts [0 ])
value := strings .TrimSpace (parts [1 ])
service .Settings [key ] = value
}
}
servicefile .servicesByName = make (map [string ]*Service , len (servicefile .Services ))
for _ , service := range servicefile .Services {
servicefile .servicesByName [service .Name ] = service
}
return servicefile , scanner .Err ()
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .