package pages
import (
"bytes"
"path"
"fmt"
"html/template"
"math"
"time"
)
var loadingPage = `
Ondemand - Loading
{{ .Name }} is loading...
Your instance is loading, and will be
ready shortly.
Your instance will shutdown automatically after {{ .Timeout }} of
inactivity.
`
type LoadingData struct {
Name string
Timeout string
}
func GetLoadingPage(template_path string, name string, timeout time.Duration) string {
var tpl *template.Template
var err error
if template_path != "" {
tpl, err = template.New(path.Base(template_path)).ParseFiles(template_path)
} else {
tpl, err = template.New("loading").Parse(loadingPage)
}
if err != nil {
return err.Error()
}
b := bytes.Buffer{}
err = tpl.Execute(&b, LoadingData{
Name: name,
Timeout: humanizeDuration(timeout),
})
if err != nil {
return err.Error()
}
return b.String()
}
// humanizeDuration humanizes time.Duration output to a meaningful value,
// golang's default ``time.Duration`` output is badly formatted and unreadable.
func humanizeDuration(duration time.Duration) string {
if duration.Seconds() < 60.0 {
return fmt.Sprintf("%d seconds", int64(duration.Seconds()))
}
if duration.Minutes() < 60.0 {
remainingSeconds := math.Mod(duration.Seconds(), 60)
if remainingSeconds > 0 {
return fmt.Sprintf("%d minutes %d seconds", int64(duration.Minutes()), int64(remainingSeconds))
}
return fmt.Sprintf("%d minutes", int64(duration.Minutes()))
}
if duration.Hours() < 24.0 {
remainingMinutes := math.Mod(duration.Minutes(), 60)
remainingSeconds := math.Mod(duration.Seconds(), 60)
if remainingMinutes > 0 {
if remainingSeconds > 0 {
return fmt.Sprintf("%d hours %d minutes %d seconds", int64(duration.Hours()), int64(remainingMinutes), int64(remainingSeconds))
}
return fmt.Sprintf("%d hours %d minutes", int64(duration.Hours()), int64(remainingMinutes))
}
return fmt.Sprintf("%d hours", int64(duration.Hours()))
}
remainingHours := math.Mod(duration.Hours(), 24)
remainingMinutes := math.Mod(duration.Minutes(), 60)
remainingSeconds := math.Mod(duration.Seconds(), 60)
return fmt.Sprintf("%d days %d hours %d minutes %d seconds",
int64(duration.Hours()/24), int64(remainingHours),
int64(remainingMinutes), int64(remainingSeconds))
}