Skip to content

Commit

Permalink
Refactor code into package
Browse files Browse the repository at this point in the history
  • Loading branch information
ChrisTerBeke committed Feb 20, 2024
1 parent 6280cc3 commit 0b4eb6d
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 52 deletions.
55 changes: 3 additions & 52 deletions cmd/list.go
Original file line number Diff line number Diff line change
@@ -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 (
Expand All @@ -27,9 +22,9 @@ var (
Example: listExample,
Run: func(cmd *cobra.Command, args []string) {
if installed {
execListInstalled()
list.ListInstalledVersions()
} else {
execList()
list.ListAvailableVersions()
}
},
}
Expand All @@ -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())
}
}
59 changes: 59 additions & 0 deletions pkg/list/list.go
Original file line number Diff line number Diff line change
@@ -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 <a> 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
}

0 comments on commit 0b4eb6d

Please sign in to comment.