diff options
| author | Bobby <[email protected]> | 2026-03-07 16:15:34 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-03-07 16:15:34 +0530 |
| commit | 6dd57549df7b6679a1aa9888f4d59edaaec5b3f9 (patch) | |
| tree | 05b37b22e659cfb5f8b97b12abf857f22df4f2be /tags | |
| parent | 1f3a99dcc410f31ac247b55ae9880f6045ab46b4 (diff) | |
| download | dove-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.go | 5 | ||||
| -rw-r--r-- | tags/tags.go | 20 | ||||
| -rw-r--r-- | tags/types.go | 17 | ||||
| -rw-r--r-- | tags/url.go | 76 |
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 +} |
