summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cmd/cetus/main.go263
1 files changed, 148 insertions, 115 deletions
diff --git a/cmd/cetus/main.go b/cmd/cetus/main.go
index f73e391..08e7440 100644
--- a/cmd/cetus/main.go
+++ b/cmd/cetus/main.go
@@ -12,6 +12,22 @@ import (
 	"framagit.org/andinus/cetus/pkg/bpod"
 )
 
+var (
+	apodAPI      *string
+	apodKey      *string
+	apodDate     *string
+	apodRand     *bool
+	apodPathOnly *bool
+	apodQuiet    *bool
+	apodDump     *bool
+
+	bpodAPI      *string
+	bpodRand     *bool
+	bpodPathOnly *bool
+	bpodQuiet    *bool
+	bpodDump     *bool
+)
+
 func main() {
 	// Early Check: If command was not passed then print usage and
 	// exit. Later command & service both are checked, this check
@@ -43,22 +59,22 @@ func main() {
 	defDate := time.Now().UTC().Format("2006-01-02")
 
 	// Flags to parse for apod service.
-	apodAPI := apodCmd.String("api", "https://api.nasa.gov/planetary/apod", "APOD API link")
-	apodKey := apodCmd.String("api-key", "DEMO_KEY", "NASA API Key for expanded usage")
-	apodDate := apodCmd.String("date", defDate, "Date of NASA APOD to retrieve")
-	apodRand := apodCmd.Bool("random", false, "Choose a date random starting from 1995-06-16")
-	apodPathOnly := apodCmd.Bool("path-only", false, "Print only the path")
-	apodQuiet := apodCmd.Bool("quiet", false, "Stay quiet")
-	apodDump := apodCmd.Bool("dump", false, "Dump received response")
+	apodAPI = apodCmd.String("api", "https://api.nasa.gov/planetary/apod", "APOD API link")
+	apodKey = apodCmd.String("api-key", "DEMO_KEY", "NASA API Key for expanded usage")
+	apodDate = apodCmd.String("date", defDate, "Date of NASA APOD to retrieve")
+	apodRand = apodCmd.Bool("random", false, "Choose a date random starting from 1995-06-16")
+	apodPathOnly = apodCmd.Bool("path-only", false, "Print only the path")
+	apodQuiet = apodCmd.Bool("quiet", false, "Stay quiet")
+	apodDump = apodCmd.Bool("dump", false, "Dump received response")
 
 	bpodCmd := flag.NewFlagSet("bpod", flag.ExitOnError)
 
 	// Flags to parse for bpod service.
-	bpodAPI := bpodCmd.String("api", "https://www.bing.com/HPImageArchive.aspx", "BPOD API")
-	bpodRand := bpodCmd.Bool("random", false, "Choose a random image from last week's BPOD")
-	bpodPathOnly := bpodCmd.Bool("path-only", false, "Print only the path")
-	bpodQuiet := bpodCmd.Bool("quiet", false, "Stay quiet")
-	bpodDump := bpodCmd.Bool("dump", false, "Dump received response")
+	bpodAPI = bpodCmd.String("api", "https://www.bing.com/HPImageArchive.aspx", "BPOD API")
+	bpodRand = bpodCmd.Bool("random", false, "Choose a random image from last week's BPOD")
+	bpodPathOnly = bpodCmd.Bool("path-only", false, "Print only the path")
+	bpodQuiet = bpodCmd.Bool("quiet", false, "Stay quiet")
+	bpodDump = bpodCmd.Bool("dump", false, "Dump received response")
 
 	// Switching on commands will cause more repetition than
 	// switching on service. If we switch on commands then switch
@@ -82,135 +98,152 @@ func main() {
 	switch os.Args[2] {
 	case "apod", "nasa":
 		apodCmd.Parse(os.Args[3:])
+		if apodCmd.Parsed() {
+			execAPOD()
+		}
 	case "bpod", "bing":
 		bpodCmd.Parse(os.Args[3:])
+		if bpodCmd.Parsed() {
+			execBPOD()
+		}
 	default:
 		fmt.Printf("Invalid service: %q\n", os.Args[2])
 		printUsage()
 		os.Exit(1)
 	}
+}
 
-	if apodCmd.Parsed() {
-		// reqInfo holds all the parameters that needs to be
-		// sent with the request. GetJson() will pack apiKey &
-		// date in params map before sending it to another
-		// function. Adding params here will not change the
-		// behaviour of the function, changes have to be made
-		// in GetJson() too.
-		reqInfo := make(map[string]string)
-		reqInfo["api"] = string(*apodAPI)
-		reqInfo["apiKey"] = string(*apodKey)
-		reqInfo["date"] = string(*apodDate)
-
-		if *apodRand {
-			reqInfo["apiKey"] = apod.RandDate()
-		}
+func printUsage() {
+	fmt.Println("Usage: cetus <command> <service> [<args>]\n")
+	fmt.Println("Commands: ")
+	fmt.Println(" set   Set the latest image as background")
+	fmt.Println(" fetch Fetch the latest image information")
+	fmt.Println(" version Print version")
+	fmt.Println("\nServices: ")
+	fmt.Println(" apod   NASA Astronomy Picture of the Day")
+	fmt.Println(" bpod   Bing Photo of the Day")
+}
 
-		body, err := apod.GetJson(reqInfo)
-		chkErr(err)
+func execAPOD() {
+	// reqInfo holds all the parameters that needs to be
+	// sent with the request. GetJson() will pack apiKey &
+	// date in params map before sending it to another
+	// function. Adding params here will not change the
+	// behaviour of the function, changes have to be made
+	// in GetJson() too.
+	reqInfo := make(map[string]string)
+	reqInfo["api"] = string(*apodAPI)
+	reqInfo["apiKey"] = string(*apodKey)
+	reqInfo["date"] = string(*apodDate)
+
+	if *apodRand {
+		reqInfo["apiKey"] = apod.RandDate()
+	}
 
-		if *apodDump {
-			fmt.Printf(body)
-			os.Exit(0)
-		}
+	body, err := apod.GetJson(reqInfo)
+	chkErr(err)
 
-		res := apod.Res{}
-		err = apod.UnmarshalJson(&res, body)
-		chkErr(err)
+	if *apodDump {
+		fmt.Printf(body)
+		os.Exit(0)
+	}
 
-		// res.Msg will be returned when there is error on
-		// user input or the api server.
-		if len(res.Msg) != 0 {
-			fmt.Printf("Message: %s", res.Msg)
-			os.Exit(1)
-		}
+	res := apod.Res{}
+	err = apod.UnmarshalJson(&res, body)
+	chkErr(err)
 
-		// If path-only is passed then it will only print the
-		// path, even if quiet is passed. If the user wants
-		// the program to be quiet then path-only shouldn't be
-		// passed. If path-only is not passed & quiet is also
-		// not passed then print the response.
-		//
-		// Path is only printed when the media type is an
-		// image because res.HDURL is empty on non image media
-		// type.
-		if *apodPathOnly {
-			fmt.Println(res.HDURL)
-		} else if !*apodQuiet {
-			apod.Print(res)
-		}
+	// res.Msg will be returned when there is error on
+	// user input or the api server.
+	if len(res.Msg) != 0 {
+		fmt.Printf("Message: %s", res.Msg)
+		os.Exit(1)
+	}
 
-		// Proceed only if the command was set because if it
-		// was fetch then it's already finished & should exit
-		// now.
-		if os.Args[1] == "fetch" {
-			os.Exit(0)
-		}
+	// If path-only is passed then it will only print the
+	// path, even if quiet is passed. If the user wants
+	// the program to be quiet then path-only shouldn't be
+	// passed. If path-only is not passed & quiet is also
+	// not passed then print the response.
+	//
+	// Path is only printed when the media type is an
+	// image because res.HDURL is empty on non image media
+	// type.
+	if *apodPathOnly {
+		fmt.Println(res.HDURL)
+	} else if !*apodQuiet {
+		apod.Print(res)
+	}
 
-		// Try to set background only if the media type is an
-		// image.
-		if res.MediaType == "image" {
-			err = background.Set(res.HDURL)
-			chkErr(err)
-		}
+	// Proceed only if the command was set because if it
+	// was fetch then it's already finished & should exit
+	// now.
+	if os.Args[1] == "fetch" {
+		os.Exit(0)
 	}
 
-	if bpodCmd.Parsed() {
-		// reqInfo here works similar to apodCmd block's
-		// reqInfo, refer to explanation there.
-		reqInfo := make(map[string]string)
-		reqInfo["api"] = string(*bpodAPI)
+	// Try to set background only if the media type is an
+	// image.
+	if res.MediaType == "image" {
+		err = background.Set(res.HDURL)
+		chkErr(err)
+	}
+}
 
-		if *bpodRand {
-			reqInfo["random"] = "true"
-		}
+func execBPOD() {
+	// reqInfo holds all the parameters that needs to be
+	// sent with the request. GetJson() will pack apiKey &
+	// date in params map before sending it to another
+	// function. Adding params here will not change the
+	// behaviour of the function, changes have to be made
+	// in GetJson() too.
+	reqInfo := make(map[string]string)
+	reqInfo["api"] = string(*bpodAPI)
+
+	if *bpodRand {
+		reqInfo["random"] = "true"
+	}
 
-		body, err := bpod.GetJson(reqInfo)
-		chkErr(err)
+	body, err := bpod.GetJson(reqInfo)
+	chkErr(err)
 
-		if *bpodDump {
-			fmt.Printf(body)
-			os.Exit(0)
-		}
+	if *bpodDump {
+		fmt.Printf(body)
+		os.Exit(0)
+	}
 
-		res, err := bpod.UnmarshalJson(body)
-		chkErr(err)
+	res, err := bpod.UnmarshalJson(body)
+	chkErr(err)
 
-		// Correct format
-		res.Url = fmt.Sprintf("%s%s", "https://www.bing.com", res.Url)
-		dt, err := time.Parse("20060102", res.StartDate)
-		chkErr(err)
-		res.StartDate = dt.Format("2006-01-02")
-
-		// path-only here works similar to apodCmd block's
-		// path-only, refer to explanation there.
-		if *bpodPathOnly {
-			fmt.Println(res.Url)
-		} else if !*bpodQuiet {
-			bpod.Print(res)
-		}
+	// Correct format
+	res.Url = fmt.Sprintf("%s%s", "https://www.bing.com", res.Url)
+	dt, err := time.Parse("20060102", res.StartDate)
+	chkErr(err)
+	res.StartDate = dt.Format("2006-01-02")
 
-		// Proceed only if the command was set because if it
-		// was fetch then it's already finished & should exit
-		// now.
-		if os.Args[1] == "fetch" {
-			os.Exit(0)
-		}
+	// If path-only is passed then it will only print the
+	// path, even if quiet is passed. If the user wants
+	// the program to be quiet then path-only shouldn't be
+	// passed. If path-only is not passed & quiet is also
+	// not passed then print the response.
+	//
+	// Path is only printed when the media type is an
+	// image because res.HDURL is empty on non image media
+	// type.
+	if *bpodPathOnly {
+		fmt.Println(res.Url)
+	} else if !*bpodQuiet {
+		bpod.Print(res)
+	}
 
-		err = background.Set(res.Url)
-		chkErr(err)
+	// Proceed only if the command was set because if it
+	// was fetch then it's already finished & should exit
+	// now.
+	if os.Args[1] == "fetch" {
+		os.Exit(0)
 	}
-}
 
-func printUsage() {
-	fmt.Println("Usage: cetus <command> <service> [<args>]\n")
-	fmt.Println("Commands: ")
-	fmt.Println(" set   Set the latest image as background")
-	fmt.Println(" fetch Fetch the latest image information")
-	fmt.Println(" version Print version")
-	fmt.Println("Services: ")
-	fmt.Println(" apod   NASA Astronomy Picture of the Day")
-	fmt.Println(" bpod   Bing Photo of the Day")
+	err = background.Set(res.Url)
+	chkErr(err)
 }
 
 func chkErr(err error) {