aboutsummaryrefslogtreecommitdiff
path: root/tags
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-07 16:15:34 +0530
committerBobby <[email protected]>2026-03-07 16:15:34 +0530
commit6dd57549df7b6679a1aa9888f4d59edaaec5b3f9 (patch)
tree05b37b22e659cfb5f8b97b12abf857f22df4f2be /tags
parent1f3a99dcc410f31ac247b55ae9880f6045ab46b4 (diff)
downloaddove-6dd57549df7b6679a1aa9888f4d59edaaec5b3f9.tar.xz
dove-6dd57549df7b6679a1aa9888f4d59edaaec5b3f9.zip
feat: implement request handling and dashboard features with new tags and utilities
Diffstat (limited to 'tags')
-rw-r--r--tags/constants.go5
-rw-r--r--tags/tags.go20
-rw-r--r--tags/types.go17
-rw-r--r--tags/url.go76
4 files changed, 118 insertions, 0 deletions
diff --git a/tags/constants.go b/tags/constants.go
new file mode 100644
index 0000000..f90fdaf
--- /dev/null
+++ b/tags/constants.go
@@ -0,0 +1,5 @@
+package tags
+
+const (
+ LOG_PREFIX = "Tags"
+)
diff --git a/tags/tags.go b/tags/tags.go
new file mode 100644
index 0000000..0b864e5
--- /dev/null
+++ b/tags/tags.go
@@ -0,0 +1,20 @@
+package tags
+
+import (
+ "dove/messages"
+ "dove/utils/logger"
+
+ "github.com/flosch/pongo2/v6"
+)
+
+func Initialize() {
+ tags := []templateTag{
+ {Name: "url", Parser: url},
+ }
+
+ for _, tag := range tags {
+ if registrationError := pongo2.RegisterTag(tag.Name, tag.Parser); registrationError != nil {
+ logger.Errorf(LOG_PREFIX, messages.TagRegistrationFailed, tag.Name)
+ }
+ }
+}
diff --git a/tags/types.go b/tags/types.go
new file mode 100644
index 0000000..b031904
--- /dev/null
+++ b/tags/types.go
@@ -0,0 +1,17 @@
+package tags
+
+import (
+ "dove/utils/collections"
+
+ "github.com/flosch/pongo2/v6"
+)
+
+type templateTag struct {
+ Name string
+ Parser pongo2.TagParser
+}
+
+type urlNode struct {
+ routeName string
+ params collections.Record[pongo2.IEvaluator]
+}
diff --git a/tags/url.go b/tags/url.go
new file mode 100644
index 0000000..3b899c2
--- /dev/null
+++ b/tags/url.go
@@ -0,0 +1,76 @@
+package tags
+
+import (
+ "fmt"
+ "strings"
+
+ "dove/messages"
+ "dove/utils/collections"
+ "dove/utils/errors"
+ "dove/utils/urls"
+
+ "github.com/flosch/pongo2/v6"
+)
+
+func url(document *pongo2.Parser, start *pongo2.Token, arguments *pongo2.Parser) (pongo2.INodeTag, *pongo2.Error) {
+ routeNameToken := arguments.MatchType(pongo2.TokenString)
+ if routeNameToken == nil {
+ return nil, arguments.Error(messages.TagExpectedRouteName, nil)
+ }
+
+ params := make(collections.Record[pongo2.IEvaluator])
+
+ for arguments.Remaining() > 0 {
+ keyToken := arguments.MatchType(pongo2.TokenIdentifier)
+ if keyToken == nil {
+ return nil, arguments.Error(messages.TagExpectedParamKey, nil)
+ }
+
+ if arguments.Match(pongo2.TokenSymbol, "=") == nil {
+ return nil, arguments.Error(messages.TagExpectedEquals, nil)
+ }
+
+ valueExpression, parseError := arguments.ParseExpression()
+ if parseError != nil {
+ return nil, parseError
+ }
+
+ params[keyToken.Val] = valueExpression
+ }
+
+ return &urlNode{
+ routeName: routeNameToken.Val,
+ params: params,
+ }, nil
+}
+
+func (self *urlNode) Execute(executionContext *pongo2.ExecutionContext, writer pongo2.TemplateWriter) *pongo2.Error {
+ path, exists := urls.GetFullPath(self.routeName)
+ if !exists {
+ return &pongo2.Error{
+ Sender: "tag:url",
+ OrigError: errors.Error(messages.TagRouteNotFound, self.routeName),
+ }
+ }
+
+ for key, expression := range self.params {
+ evaluatedValue, evaluationError := expression.Evaluate(executionContext)
+ if evaluationError != nil {
+ return evaluationError
+ }
+
+ placeholder := fmt.Sprintf(":%s", key)
+ replacement := fmt.Sprintf("%v", evaluatedValue.Interface())
+ path = strings.ReplaceAll(path, placeholder, replacement)
+ }
+
+ _, writeError := writer.WriteString(path)
+ if writeError != nil {
+ return &pongo2.Error{
+ Sender: "tag:url",
+ OrigError: errors.Error(messages.TagTemplateWriteFailed),
+ }
+ }
+
+ return nil
+}