mirror of
https://github.com/sbrow/thor.git
synced 2026-08-26 11:23:32 -04:00
feat: Pipes now have access to the full template context.
This commit is contained in:
@@ -2,6 +2,7 @@ package mustache
|
|||||||
|
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import "core:log"
|
import "core:log"
|
||||||
|
import "core:reflect"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -556,7 +557,7 @@ render_nodes :: proc(
|
|||||||
warn_unknown_key(current, ctx[:], node)
|
warn_unknown_key(current, ctx[:], node)
|
||||||
}
|
}
|
||||||
if len(node.filters) > 0 {
|
if len(node.filters) > 0 {
|
||||||
transformed, perr := apply_pipeline(val, node.filters[:], node.pos)
|
transformed, perr := apply_pipeline(val, node.filters[:], node.pos, ctx[:])
|
||||||
if perr != nil {
|
if perr != nil {
|
||||||
return perr
|
return perr
|
||||||
}
|
}
|
||||||
@@ -598,7 +599,7 @@ render_nodes :: proc(
|
|||||||
warn_unknown_key(current, ctx[:], node)
|
warn_unknown_key(current, ctx[:], node)
|
||||||
}
|
}
|
||||||
if len(node.filters) > 0 {
|
if len(node.filters) > 0 {
|
||||||
transformed, perr := apply_pipeline(val, node.filters[:], node.pos)
|
transformed, perr := apply_pipeline(val, node.filters[:], node.pos, ctx[:])
|
||||||
if perr != nil {
|
if perr != nil {
|
||||||
return perr
|
return perr
|
||||||
}
|
}
|
||||||
@@ -636,7 +637,7 @@ render_nodes :: proc(
|
|||||||
warn_unknown_key(current, ctx[:], node)
|
warn_unknown_key(current, ctx[:], node)
|
||||||
}
|
}
|
||||||
if len(node.filters) > 0 {
|
if len(node.filters) > 0 {
|
||||||
transformed, perr := apply_pipeline(val, node.filters[:], node.pos)
|
transformed, perr := apply_pipeline(val, node.filters[:], node.pos, ctx[:])
|
||||||
if perr != nil {
|
if perr != nil {
|
||||||
return perr
|
return perr
|
||||||
}
|
}
|
||||||
@@ -692,7 +693,7 @@ render_nodes :: proc(
|
|||||||
warn_unknown_key(current, ctx[:], node)
|
warn_unknown_key(current, ctx[:], node)
|
||||||
}
|
}
|
||||||
if len(node.filters) > 0 {
|
if len(node.filters) > 0 {
|
||||||
transformed, perr := apply_pipeline(val, node.filters[:], node.pos)
|
transformed, perr := apply_pipeline(val, node.filters[:], node.pos, ctx[:])
|
||||||
if perr != nil {
|
if perr != nil {
|
||||||
return perr
|
return perr
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-10
@@ -99,26 +99,31 @@ parse_pipeline :: proc(
|
|||||||
return key, nil
|
return key, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_pipeline :: proc(value: any, filters: []Pipe_Filter, pos: int) -> (any, Error) {
|
apply_pipeline :: proc(
|
||||||
current := value
|
value: any,
|
||||||
|
filters: []Pipe_Filter,
|
||||||
|
pos: int,
|
||||||
|
ctx: []any,
|
||||||
|
) -> (
|
||||||
|
current: any,
|
||||||
|
err: Error,
|
||||||
|
) {
|
||||||
|
current = value
|
||||||
for &filter in filters {
|
for &filter in filters {
|
||||||
result, err := apply_filter(current, &filter, pos)
|
current = apply_filter(current, &filter, pos, ctx) or_return
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
current = result
|
|
||||||
}
|
}
|
||||||
return current, nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_filter :: proc(value: any, filter: ^Pipe_Filter, pos: int) -> (any, Error) {
|
// TODO: diagnostics don't show anything relevent
|
||||||
|
apply_filter :: proc(value: any, filter: ^Pipe_Filter, pos: int, ctx: []any) -> (any, Error) {
|
||||||
switch filter.op {
|
switch filter.op {
|
||||||
case "group_by":
|
case "group_by":
|
||||||
return apply_group_by(value, filter.args[:], pos)
|
return apply_group_by(value, filter.args[:], pos)
|
||||||
case "format":
|
case "format":
|
||||||
str, ok := reflect.as_string(value)
|
str, ok := reflect.as_string(value)
|
||||||
if !ok {
|
if !ok {
|
||||||
return value, Error_Body{
|
return value, Error_Body {
|
||||||
msg = "format may only be used on dates",
|
msg = "format may only be used on dates",
|
||||||
pos = pos,
|
pos = pos,
|
||||||
kind = .Data,
|
kind = .Data,
|
||||||
|
|||||||
Reference in New Issue
Block a user