From da2255557fa395eeabeff9a4f2949582f8811980 Mon Sep 17 00:00:00 2001 From: Andinus Date: Mon, 6 Apr 2020 22:11:15 +0530 Subject: Initial grus version --- cmd/grus/env.go | 17 ++++++++++++++ cmd/grus/grus.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ cmd/grus/main_openbsd.go | 40 +++++++++++++++++++++++++++++++++ cmd/grus/main_other.go | 7 ++++++ cmd/grus/usage.go | 10 +++++++++ 5 files changed, 132 insertions(+) create mode 100644 cmd/grus/env.go create mode 100644 cmd/grus/grus.go create mode 100644 cmd/grus/main_openbsd.go create mode 100644 cmd/grus/main_other.go create mode 100644 cmd/grus/usage.go (limited to 'cmd') diff --git a/cmd/grus/env.go b/cmd/grus/env.go new file mode 100644 index 0000000..4d72030 --- /dev/null +++ b/cmd/grus/env.go @@ -0,0 +1,17 @@ +package main + +import "os" + +// getEnv will check if the the key exists, if it does then it'll +// return the value otherwise it will return fallback string. +func getEnv(key, fallback string) string { + // We use os.LookupEnv instead of using os.GetEnv and checking + // if the length equals 0 because environment variable can be + // set and be of length 0. User could've set key="" which + // means the variable was set but the length is 0. + value, exists := os.LookupEnv(key) + if !exists { + value = fallback + } + return value +} diff --git a/cmd/grus/grus.go b/cmd/grus/grus.go new file mode 100644 index 0000000..a68db97 --- /dev/null +++ b/cmd/grus/grus.go @@ -0,0 +1,58 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + "os" + + "tildegit.org/andinus/grus/lexical" + "tildegit.org/andinus/grus/search" + "tildegit.org/andinus/grus/storage" +) + +func grus() { + version := "v0.1.0" + + // Early Check: If command was not passed then print usage and + // exit. Later command & service both are checked, this check + // is for version command. If not checked then running grus + // without any args will fail because os.Args[1] will panic + // the program & produce runtime error. + if len(os.Args) == 1 || len(os.Args[1]) == 0 { + printUsage() + os.Exit(0) + } + + // Running just `grus` would've paniced the program here if + // length of os.Args was not checked beforehand because there + // would be no os.Args[1]. + switch os.Args[1] { + case "version", "v", "-version", "--version", "-v": + fmt.Printf("Grus %s\n", version) + os.Exit(0) + case "help", "-help", "--help", "-h": + printUsage() + os.Exit(0) + case "init", "i": + db := storage.Init() + db.Conn.Close() + os.Exit(0) + } + + // Initialize the database connection. + db := storage.InitConn() + defer db.Conn.Close() + + word := os.Args[1] + sorted := lexical.Sort(word) + + out, err := search.Word(sorted, db) + if err == sql.ErrNoRows { + fmt.Println("Word not found in database.") + return + } else if err != nil { + log.Fatalf("grus: Search failed :: %s", err) + } + fmt.Println(out) +} diff --git a/cmd/grus/main_openbsd.go b/cmd/grus/main_openbsd.go new file mode 100644 index 0000000..5222bbe --- /dev/null +++ b/cmd/grus/main_openbsd.go @@ -0,0 +1,40 @@ +// +build openbsd + +package main + +import ( + "log" + "os" + + "golang.org/x/sys/unix" + "tildegit.org/andinus/grus/storage" + "tildegit.org/andinus/lynx" +) + +func main() { + unveil() + grus() +} + +func unveil() { + path := storage.GetDir() + err := os.MkdirAll(path, os.ModePerm) + if err != nil { + log.Fatalf("Unable to create directory: %s", path) + } + + paths := make(map[string]string) + + paths[path] = "rwc" + + err = lynx.UnveilPathsStrict(paths) + if err != nil { + log.Fatal(err) + } + + // Block further unveil calls. + err = unix.UnveilBlock() + if err != nil { + log.Fatal(err) + } +} diff --git a/cmd/grus/main_other.go b/cmd/grus/main_other.go new file mode 100644 index 0000000..88824ad --- /dev/null +++ b/cmd/grus/main_other.go @@ -0,0 +1,7 @@ +// +build !openbsd + +package main + +func main() { + grus() +} diff --git a/cmd/grus/usage.go b/cmd/grus/usage.go new file mode 100644 index 0000000..1749ba7 --- /dev/null +++ b/cmd/grus/usage.go @@ -0,0 +1,10 @@ +package main + +import "fmt" + +func printUsage() { + fmt.Println("Usage: grus / ") + fmt.Println("\nCommands: ") + fmt.Println(" help Print help") + fmt.Println(" version Print Grus version") +} -- cgit 1.4.1-2-gfad0