Browse Source

Use Cobra for command parsing.

Frederic G. MARAND 6 years ago
parent
commit
23641875e3
7 changed files with 158 additions and 70 deletions
  1. 3 3
      cmd/kurz/kurz.go
  2. 19 0
      cmd/kurzd/export.go
  3. 66 0
      cmd/kurzd/export_content.go
  4. 5 67
      cmd/kurzd/kurzd.go
  5. 32 0
      cmd/kurzd/rootCmd.go
  6. 4 0
      go.mod
  7. 29 0
      go.sum

+ 3 - 3
cmd/kurz/kurz.go

@@ -1,5 +1,5 @@
 // Package kurz contains the Kurz client command.
-package kurz
+package main
 
 /*
 kurz
@@ -24,7 +24,7 @@ kurz
 A Kurz URL created for a Kurz URL
 	- for the same user: the same URL.
 	- for a different user: a different URL.
- */
+*/
 func main() {
-	
+
 }

+ 19 - 0
cmd/kurzd/export.go

@@ -0,0 +1,19 @@
+package main
+
+import (
+	"fmt"
+	"github.com/spf13/cobra"
+)
+
+var cmdExport = &cobra.Command{
+	Use:   "export",
+	Short: "Export configuration or content",
+	Long:  "Provides subcommands to export configuration as Kurz gets it or content found in the database",
+	Run: func(cmd *cobra.Command, args []string) {
+		fmt.Println("Please use one of the export subcommands")
+	},
+}
+
+func init() {
+	cmd.AddCommand(cmdExport)
+}

+ 66 - 0
cmd/kurzd/export_content.go

@@ -0,0 +1,66 @@
+package main
+
+import (
+	"database/sql"
+	"fmt"
+
+	"github.com/spf13/cobra"
+	"gopkg.in/yaml.v2"
+)
+
+var cmdExportContent = &cobra.Command{
+	Use:   "content",
+	Short: "Export the database contents",
+	Long:  "Export the whole list of Kurz URLs in the database",
+	Run:   exportContentHandler,
+}
+
+func init() {
+	cmdExport.AddCommand(cmdExportContent)
+}
+
+func exportContentLoader(db *sql.DB) ([]MapEntry, error) {
+	stmt, err := db.Prepare(`
+SELECT Hash, url, Date1, Date2, Date3, RefCount
+FROM map
+ORDER BY url`)
+	if err != nil {
+		panic(err.Error())
+	}
+	defer stmt.Close()
+
+	rows, err := stmt.Query()
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	entry := MapEntry{}
+	var entries []MapEntry
+	for rows.Next() {
+		err = rows.Scan(&entry.Hash, &entry.Url, &entry.Date1, &entry.Date2, &entry.Date3, &entry.RefCount)
+		if err != nil {
+			return nil, err
+		}
+		entries = append(entries, entry)
+	}
+
+	return entries, nil
+}
+
+func exportContentHandler(cmd *cobra.Command, args []string) {
+	dbDriver, dbDsn := parseDbCred()
+	db, err := dbDial(dbDriver, dbDsn)
+	if err != nil {
+		panic("Could not open database")
+	}
+	defer db.Close()
+	entries, err := exportContentLoader(db)
+	if err != nil {
+		panic(err.Error())
+	}
+	y, err := yaml.Marshal(&entries)
+	if err != nil {
+		panic(err.Error())
+	}
+	fmt.Println(string(y))
+}

+ 5 - 67
cmd/kurzd/kurzd.go

@@ -2,12 +2,11 @@
 package main
 
 import (
-	"fmt"
-	"gopkg.in/yaml.v2"
 	"os"
 	"time"
 
 	"database/sql"
+
 	_ "github.com/go-sql-driver/mysql"
 )
 
@@ -30,38 +29,12 @@ kurzd
 		schema							Uninstall the curz database schema.
 	status                          Report on kurzd status
 	stop                            Stop all instances of kurzd on the current server (restricted)
- */
+*/
 func main() {
-	command, subCommand, options, err := parseCommand()
-	if err != nil {
-		panic(err.Error())
-	}
-
-	switch command {
-	case "export":
-		switch subCommand {
-		case "content":
-			dbDriver, dbDsn := parseDbCred(options)
-			db, err := dbDial(dbDriver, dbDsn)
-			if err != nil {
-				panic("Could not open database")
-			}
-			defer db.Close()
-			entries, err := exportContent(db)
-			if err != nil {
-				panic(err.Error())
-			}
-			y, err := yaml.Marshal(&entries)
-			if err != nil {
-				panic(err.Error())
-			}
-			fmt.Println(string(y))
-		}
-	}
+	Execute()
+	os.Exit(0)
 }
 
-type stringMap map[string]string
-
 type MapEntry struct {
 	Hash                uint64
 	Url                 string
@@ -77,7 +50,7 @@ func dbDial(dbDriver, dbDsn string) (*sql.DB, error) {
 	return db, nil
 }
 
-func parseDbCred(_ stringMap) (driver, dsn string) {
+func parseDbCred() (driver, dsn string) {
 	const DefaultDriver = "mysql"
 	const DefaultDsn = "root:root@tcp(localhost:3306)/kurz"
 
@@ -94,38 +67,3 @@ func parseDbCred(_ stringMap) (driver, dsn string) {
 
 	return envDriver, envDsn
 }
-
-/* parseCommand returns a valid command/subCommand/options triplet and nil, or
-   an error, in which case the values for the other results are not defined.
- */
-func parseCommand() (command, subCommand string, options stringMap, err error) {
-	return "export", "content", stringMap{}, nil
-}
-
-func exportContent(db *sql.DB) ([]MapEntry, error) {
-	stmt, err := db.Prepare(`
-SELECT Hash, url, Date1, Date2, Date3, RefCount
-FROM map
-ORDER BY url`)
-	if err != nil {
-		panic(err.Error())
-	}
-	defer stmt.Close()
-
-	rows, err := stmt.Query()
-	if err != nil {
-		return nil, err
-	}
-	defer rows.Close()
-	entry := MapEntry{}
-	var entries []MapEntry
-	for rows.Next() {
-		err = rows.Scan(&entry.Hash, &entry.Url, &entry.Date1, &entry.Date2, &entry.Date3, &entry.RefCount)
-		if err != nil {
-			return nil, err
-		}
-		entries = append(entries, entry)
-	}
-
-	return entries, nil
-}

+ 32 - 0
cmd/kurzd/rootCmd.go

@@ -0,0 +1,32 @@
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/spf13/cobra"
+)
+
+var cmd = &cobra.Command{
+	Use:   "kurzd",
+	Short: "kurzd is the Kurz daemon and back-office command",
+	Long:  "kurzd is the actual engine for Kurz. Use it as the server for your Kurz clients",
+	Run: func(cmd *cobra.Command, args []string) {
+		panic("Not yet implemented")
+	},
+}
+
+func initConfig() {
+
+}
+
+func init() {
+	cobra.OnInitialize(initConfig)
+}
+
+func Execute() {
+	if err := cmd.Execute(); err != nil {
+		fmt.Println(err)
+		os.Exit(1)
+	}
+}

+ 4 - 0
go.mod

@@ -2,6 +2,10 @@ module code.osinet.fr/fgm/kurz
 
 require (
 	github.com/go-sql-driver/mysql v1.4.0
+	github.com/mitchellh/go-homedir v1.0.0 // indirect
+	github.com/spf13/cobra v0.0.3
+	github.com/spf13/pflag v1.0.3 // indirect
+	github.com/spf13/viper v1.2.1 // indirect
 	google.golang.org/appengine v1.3.0 // indirect
 	gopkg.in/yaml.v2 v2.2.1
 )

+ 29 - 0
go.sum

@@ -1,7 +1,36 @@
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/go-sql-driver/mysql v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
+github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg=
+github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
+github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M=
+github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992 h1:BH3eQWeGbwRU2+wxxuuPOdFBmaiBH81O8BugSjHeTFg=
+golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 google.golang.org/appengine v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk=
 google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=