started implementing bert in golang, prepared cli interface

This commit is contained in:
Jan Halfar 2015-12-13 14:56:32 +01:00
parent 8685d37bee
commit 0218dde7d3
3 changed files with 175 additions and 0 deletions

136
foomo-bert.go Normal file
View File

@ -0,0 +1,136 @@
package main
import (
"errors"
"flag"
"fmt"
"net/url"
"os"
"path"
"github.com/foomo/gofoomo/foomo"
"github.com/foomo/gofoomo/utils"
)
type foomoFlagsPrepare struct {
runMode *string
dir *string
}
type foomoFlagsReset struct {
foomoFlagsPrepare
address *string
mainModule *string
}
func getFlagRunMode(fs *flag.FlagSet) *string {
return fs.String("run-mode", "", "foomo run mode test | development | production")
}
func getFlagDir(fs *flag.FlagSet) *string {
return fs.String("dir", "", "path/to/your/foomo/root")
}
func foomoFlagsetReset() (fs *flag.FlagSet, f *foomoFlagsReset) {
f = &foomoFlagsReset{}
fs = flag.NewFlagSet(os.Args[0]+" foomo-prepare", flag.ContinueOnError)
f.runMode = getFlagRunMode(fs)
f.dir = getFlagDir(fs)
f.address = fs.String("addr", "", "address of the foomo server")
f.mainModule = fs.String("main-module", "Foomo", "name of main module")
return fs, f
}
func foomoFlagsetPrepare() (fs *flag.FlagSet, f *foomoFlagsPrepare) {
f = &foomoFlagsPrepare{}
fs = flag.NewFlagSet(os.Args[0]+" prepare", flag.ContinueOnError)
f.runMode = getFlagRunMode(fs)
f.dir = getFlagDir(fs)
return fs, f
}
func validateFlagsReset(f *foomoFlagsReset) (err error) {
fp := &foomoFlagsPrepare{
runMode: f.runMode,
dir: f.dir,
}
prepareErr := validateFlagsPrepare(fp)
if prepareErr != nil {
return prepareErr
}
// main module
if len(*f.mainModule) == 0 {
return errors.New("main module must be set missing -main-module")
}
moduleDir := path.Join(*f.dir, "modules", *f.mainModule)
_, dirErr := utils.IsDir(moduleDir)
if dirErr != nil {
return errors.New("main module dir error: " + dirErr.Error())
}
// addr
if len(*f.address) == 0 {
return errors.New("missing address -addr")
}
_, err = url.Parse(*f.address)
if err != nil {
return errors.New(fmt.Sprint("could not parse address"))
}
return nil
}
func validateFlagsPrepare(f *foomoFlagsPrepare) (err error) {
// run mode
switch *f.runMode {
case foomo.RunModeTest, foomo.RunModeProduction, foomo.RunModeDevelopment:
default:
return errors.New(fmt.Sprintln("invalid run mode", "\""+*f.runMode+"\"", "must be one of", []string{foomo.RunModeTest, foomo.RunModeProduction, foomo.RunModeDevelopment}))
}
// foomo dir
_, dirErr := utils.IsDir(*f.dir)
if err != nil {
return errors.New("dir is not a directory: " + dirErr.Error())
}
return nil
}
func usage() {
fmt.Println("usage:", os.Args[0], "<command>")
fsPrepare, _ := foomoFlagsetPrepare()
fsReset, _ := foomoFlagsetReset()
for command, fs := range map[string]*flag.FlagSet{
"prepare": fsPrepare,
"reset": fsReset,
} {
fmt.Println(os.Args[0], command, ":")
fs.PrintDefaults()
}
}
func flagErr(fs *flag.FlagSet, comment string, err error) {
if err != nil {
fmt.Println(comment, err.Error())
usage()
os.Exit(1)
}
}
func main() {
if len(os.Args) > 1 {
switch os.Args[1] {
case "prepare":
fs, flagsPrepare := foomoFlagsetPrepare()
fs.Parse(os.Args[2:])
err := validateFlagsPrepare(flagsPrepare)
flagErr(fs, "prepare", err)
fmt.Println("preparing foomo", *flagsPrepare.runMode, *flagsPrepare.dir)
case "reset":
//foomoFlags, err := validateFlags(true, true)
//flagErr("reset", err)
//fmt.Println("resetting foomo", foomoFlags)
default:
usage()
}
} else {
usage()
}
}

21
foomo/bert/bert.go Normal file
View File

@ -0,0 +1,21 @@
package bert
import (
"github.com/foomo/gofoomo/foomo"
)
type Bert struct {
foomo *foomo.Foomo
}
func NewBert(f *foomo.Foomo) *Bert {
return &Bert{
foomo: f,
}
}
func (b *Bert) Hiccup() (report string, err error) {
report = ""
b.foomo.GetVarDir()
return report, err
}

18
utils/utils.go Normal file
View File

@ -0,0 +1,18 @@
package utils
import (
"errors"
"os"
)
// IsDir tells you is it a dir or not
func IsDir(filename string) (isDir bool, err error) {
i, err := os.Stat(filename)
if err != nil {
return false, err
}
if !i.IsDir() {
return false, errors.New("not a dir")
}
return true, nil
}