From 0b4eb6d3d6c3467f0932900f3477a5bdf6e2c050 Mon Sep 17 00:00:00 2001 From: Chris ter Beke <1134120+ChrisTerBeke@users.noreply.github.com> Date: Tue, 20 Feb 2024 10:50:26 +0100 Subject: [PATCH] Refactor code into package --- cmd/list.go | 55 +++----------------------------------------- pkg/list/list.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 pkg/list/list.go diff --git a/cmd/list.go b/cmd/list.go index ac33d82..93356ae 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -1,13 +1,8 @@ package cmd import ( - "fmt" - "net/http" - "os" - - "github.com/bschaatsbergen/tfversion/pkg/download" + "github.com/bschaatsbergen/tfversion/pkg/list" "github.com/spf13/cobra" - "golang.org/x/net/html" ) const ( @@ -27,9 +22,9 @@ var ( Example: listExample, Run: func(cmd *cobra.Command, args []string) { if installed { - execListInstalled() + list.ListInstalledVersions() } else { - execList() + list.ListAvailableVersions() } }, } @@ -39,47 +34,3 @@ func init() { rootCmd.AddCommand(listCmd) listCmd.Flags().BoolVar(&installed, "installed", false, "list the installed Terraform versions") } - -func execList() { - resp, err := http.Get(download.TerraformReleasesUrl) - if err != nil { - fmt.Printf("failed to download Terraform: %s", err) - os.Exit(1) - } - defer resp.Body.Close() - - doc, err := html.Parse(resp.Body) - if err != nil { - fmt.Printf("failed to parse available versions: %s", err) - os.Exit(1) - } - - var availableVersions []string - var processAllVersions func(*html.Node) - processAllVersions = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - availableVersions = append(availableVersions, n.FirstChild.Data) - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - processAllVersions(c) - } - } - - processAllVersions(doc) - - for _, v := range availableVersions { - fmt.Println(v) - } -} - -func execListInstalled() { - installLocation := download.GetDownloadLocation() - installedVersions, err := os.ReadDir(installLocation) - if err != nil { - fmt.Printf("error listing installation directory: %s", err) - os.Exit(1) - } - for _, v := range installedVersions { - fmt.Println(v.Name()) - } -} diff --git a/pkg/list/list.go b/pkg/list/list.go new file mode 100644 index 0000000..bd794d1 --- /dev/null +++ b/pkg/list/list.go @@ -0,0 +1,59 @@ +package list + +import ( + "fmt" + "net/http" + "os" + "strings" + + "github.com/bschaatsbergen/tfversion/pkg/download" + "golang.org/x/net/html" +) + +func ListInstalledVersions() { + installLocation := download.GetDownloadLocation() + installedVersions, err := os.ReadDir(installLocation) + if err != nil { + fmt.Printf("error listing installation directory: %s", err) + os.Exit(1) + } + for _, v := range installedVersions { + fmt.Println(v.Name()) + } +} + +func ListAvailableVersions() { + resp, err := http.Get(download.TerraformReleasesUrl) + if err != nil { + fmt.Printf("failed to download Terraform: %s", err) + os.Exit(1) + } + defer resp.Body.Close() + + doc, err := html.Parse(resp.Body) + if err != nil { + fmt.Printf("failed to parse available versions: %s", err) + os.Exit(1) + } + + availableVersions := parseAvailableVersions(doc) + for _, v := range availableVersions { + fmt.Println(v) + } +} + +func parseAvailableVersions(n *html.Node) []string { + var availableVersions []string + + // find available verions in elements + if n.Type == html.ElementNode && n.Data == "a" && strings.Contains(n.FirstChild.Data, "terraform") { + availableVersions = append(availableVersions, strings.Split(n.FirstChild.Data, "_")[1]) + } + + // recursively parse DOM elements + for c := n.FirstChild; c != nil; c = c.NextSibling { + availableVersions = append(availableVersions, parseAvailableVersions(c)...) + } + + return availableVersions +}