I'd like to write a Go template which takes in a URL with a query parameter earliest
which represents a relative time, e.g. earliest=-15m
, and converts it to an absolute time relative to now as a Unix timestamp. So for example, https://search.com?earliest=-15m would be converted to https://search.com?earliest=1646626616.
So far, I've written the following HTML template:
<html>
<p><a href='{{ .URL }}'>Original link</a></p>
<p><a href='{{ regexReplaceAll "earliest=(.+?)&" .URL (list "earliest=" ((now).UTC.Unix | toString) "&" | join "") }}'>Modified link</a></p>
</html>
which, when I render it with this main.go
,
package main
import (
"html/template"
"log"
"os"
"github.com/Masterminds/sprig"
)
type Alert struct {
URL string
}
func main() {
tmpl := template.Must(template.New("base.html").Funcs(sprig.FuncMap()).ParseGlob("*.html"))
if err := tmpl.Execute(os.Stdout, &Alert{
URL: `https://search.com/search?earliest=-5m&latest=now`,
}); err != nil {
log.Fatal(err)
}
}
Shows the following:
<html>
<p><a href='https://search.com/search?earliest=-5m&latest=now'>Original link</a></p>
<p><a href='https://search.com/search?earliest=1646627228&latest=now'>Modified link</a></p>
</html>
This is similar to what I want except that the Unix timestamp represents the current time and not the time 5 minutes ago as intended. I'd actually like to pass now
into the date_modify
function where the argument is the captured group, -15m
. However, if I try to modify the template replacing (now)
with (now | date_modify ${1})
, I get a syntax error, i.e. this template,
<html>
<p><a href='{{ .URL }}'>Original link</a></p>
<p><a href='{{ regexReplaceAll "earliest=(.+?)&" .URL (list "earliest=" ((now | date_modify ${1}).UTC.Unix | toString) "&" | join "") }}'>Modified link</a></p>
</html>
leads to
panic: template: base.html:3: bad character U+007B '{'
How could a pass the captured group in the regular expression as an argument to date_modify
?
I managed to get this to work by defining a variable,
which prints
The code is not DRY and is rather verbose, however, so any suggestions to improve it are welcome.