Route inline templates to FakeTemplate at the CLI

This commit is contained in:
2026-09-03 17:29:07 +02:00
parent 4399b8b89f
commit 3a9f3a4758
+31 -5
View File
@@ -20,21 +20,28 @@ import (
"gitea.larvit.se/larvit/fejkdata" "gitea.larvit.se/larvit/fejkdata"
) )
const usage = `Usage: fejkdata [flags] <path> const usage = `Usage: fejkdata [flags] <path|template>
<path> a category, or a dotted path into one (person, person.last) <path> a category, or a dotted path into one (person, person.last)
<template> a format string or JSON value to render inline, e.g.
'name: {/sv_SE.person.last}' or '{"format":"{x}","x":[1,2]}'
An argument containing a { token, or a JSON object or array, is a template; any
other argument is a path (a path never contains a brace). Templates reach the data
with a reference: {/sv_SE.person.first} from the root, whether the data is shipped
or layered with --data-path.
-d, --data-path D a data directory to layer over the shipped data (repeatable; last wins on a clash) -d, --data-path D a data directory to layer over the shipped data (repeatable; last wins on a clash)
-h, --help print this help, then exit -h, --help print this help, then exit
--list list the paths the data offers, then exit --list list the paths the data offers, then exit
--no-shipped-data load only the --data-path directories --no-shipped-data load only the --data-path directories
-n, --repeat N render the path N times, 1..1048576 (default 1) -n, --repeat N render the value N times, 1..1048576 (default 1)
-s, --seed N seed for reproducible output -s, --seed N seed for reproducible output
--separator S string between repeated values (default newline) --separator S string between repeated values (default newline)
--version print the version, then exit --version print the version, then exit
Flags may come before or after <path>; -- ends the flags. A short flag's value Flags may come before or after <path|template>; -- ends the flags. A short flag's
attaches or follows (-n3, -n 3); short flags bundle (-hn 3). value attaches or follows (-n3, -n 3); short flags bundle (-hn 3).
` `
type invocation struct { type invocation struct {
@@ -221,7 +228,8 @@ func (in invocation) options() []fejkdata.Option {
func (in invocation) write(f *fejkdata.Generator, w io.Writer) error { func (in invocation) write(f *fejkdata.Generator, w io.Writer) error {
out := bufio.NewWriter(w) out := bufio.NewWriter(w)
for i := 0; i < in.repeat; i++ { for i := 0; i < in.repeat; i++ {
v, err := f.Fake(in.paths[0]) arg := in.paths[0]
v, err := renderArg(f, arg)
if err != nil { if err != nil {
return err return err
} }
@@ -234,6 +242,24 @@ func (in invocation) write(f *fejkdata.Generator, w io.Writer) error {
return out.Flush() return out.Flush()
} }
// isTemplate reports whether an argument is an inline template rather than a
// path: a JSON object or array, or a format string carrying a { token. A path can
// never contain a brace, so the two never collide.
func isTemplate(arg string) bool {
if strings.ContainsRune(arg, '{') {
return true
}
return strings.HasPrefix(arg, "[")
}
// renderArg renders one positional argument: an inline template, or a path.
func renderArg(f *fejkdata.Generator, arg string) (string, error) {
if isTemplate(arg) {
return f.FakeTemplate(arg)
}
return f.Fake(arg)
}
func main() { os.Exit(run(os.Args[1:], os.Stdout, os.Stderr)) } func main() { os.Exit(run(os.Args[1:], os.Stdout, os.Stderr)) }
// run returns the exit code: 0 ok, 1 runtime error, 2 misuse. // run returns the exit code: 0 ok, 1 runtime error, 2 misuse.