package main
import (
"encoding/csv"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
"git.tilde.institute/knezzle/mycovidcli/renderfloat"
"github.com/olekukonko/tablewriter"
)
func main() {
var bodydata string
maxloops := 3
currentTime := time.Now() //get current time/date
for i := 0; i < maxloops; i++ {
strcurrentdate := currentTime.Format("01-02-2006") //reformat for URL format
COVIDurl := "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/" + strcurrentdate + ".csv"
//fmt.Println(COVIDurl)
resp, err := http.Get(COVIDurl)
if err != nil {
panic(err)
}
defer resp.Body.Close()
//fmt.Println(resp.StatusCode)
if resp.StatusCode == 200 {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
bodydata = string(body)
fmt.Println("Last Updated: " + strcurrentdate)
break
}
currentTime = currentTime.AddDate(0, 0, -1) //go to yesterday, this source updates only daily
}
//fmt.Println(bodydata)
reader := csv.NewReader(strings.NewReader(bodydata))
// Initialize variables.
var (
usconfirmed,
usdeaths,
usrecovered int
region,
state,
confirmed,
deaths,
recovered string
)
data := [][]string{}
for {
line, error := reader.Read() //read in a line
if error == io.EOF {
break
} else if error != nil {
log.Fatal(error)
}
region = line[3]
state = line[1]
confirmed = line[7]
deaths = line[8]
recovered = line[9]
if region == "US" {
confirmed, err := strconv.Atoi(line[7]) //convert confirmed to int
if err != nil {
// handle error
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
deaths, err := strconv.Atoi(line[8]) //convert deaths to int
if err != nil {
// handle error
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
recovered, err := strconv.Atoi(line[9]) //convert recovered to int
if err != nil {
// handle error
fmt.Fprintln(os.Stderr, err)
os.Exit(2)
}
usconfirmed = usconfirmed + confirmed
usdeaths = usdeaths + deaths
usrecovered = usrecovered + recovered
}
//create array for table output
if state == "New York City" || region == "Israel" || region == "Estonia" {
f_confirmed, _ := strconv.ParseFloat(confirmed, 8)
f_deaths, _ := strconv.ParseFloat(deaths, 8)
f_recovered, _ := strconv.ParseFloat(recovered, 8)
data = append(data, []string{region, state,
renderfloat.RenderFloat("#,###.", f_confirmed),
renderfloat.RenderFloat("#,###.", f_deaths),
renderfloat.RenderFloat("#,###.", f_recovered),
renderfloat.RenderFloat("#,###.", f_confirmed-f_recovered-f_deaths)})
//fmt.Println(state + " Deaths: " + deaths + " Confirmed: " + confirmed )
}
}
f_confirmed, _ := strconv.ParseFloat(strconv.Itoa(usconfirmed), 8)
f_deaths, _ := strconv.ParseFloat(strconv.Itoa(usdeaths), 8)
f_recovered, _ := strconv.ParseFloat(strconv.Itoa(usdeaths), 8)
data = append(data, []string{"US", "Total",
renderfloat.RenderFloat("#,###.", f_confirmed),
renderfloat.RenderFloat("#,###.", f_deaths),
renderfloat.RenderFloat("#,###.", f_recovered),
renderfloat.RenderFloat("#,###.", f_confirmed-f_recovered-f_deaths)})
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Region", "Area", "Confirmed", "Deaths", "Recovered", "Still sick"})
for _, v := range data {
table.Append(v)
}
table.Render() // Send output
}