The Go Formatter library implements replacement fields surrounded by curly braces {}
format strings.
[[TOC]]
- Format string by providing arguments without using placeholders or format verbs
%
- Format string using automatic placeholder
{p}
- Format string using positional placeholders
{pN}
- Format string using named placeholders
{name}
- Format string using object placeholders
{.Field}
,{p.Field}
and{pN.Field}
whereField
is an exportedstruct
field or method - Use custom placeholder string. Default is
p
- Use custom replacement delimiters. Default are
{
and}
- Use custom replacement functions with transformation using pipeline
|
- Many different handy built-in functions
{name}
- Support for text colorization using
{color}
,{rgb}
,{bright}
,{background}
and so on - Support for setting text attributes like bold, italic,
strike, blink and so on - Support for getting OS values like
{ip}
,{user}
,{hostname}
,{cwd}
,{pid}
,{env}
and so on - Support for getting and formatting time using
{now}
,{rfc3339}
,{iso8601}
and so on - Support for string transformation using
{lower}
,{upper}
,{capitalize}
and so on - Support for path transformation using
{absolute}
,{base}
,{directory}
,{clean}
,{extension}
and so on - Support for object formatting using
{fields}
,{json}
,{indent}
and so on - Auto ANSI escape sequences detection and forcing it using the
FORCE_ESCAPE_SEQUENCES
environment variable - Under the hood it uses the standard text/template package
Import formatter
package:
import "gitlab.com/tymonx/go-formatter/formatter"
formatted, err := formatter.Format("Without arguments")
fmt.Println(formatted)
Output:
Without arguments
formatted, err := formatter.Format("With arguments", 3, nil, 4.5, true, "arg1", []byte{}, Error("error"))
fmt.Println(formatted)
Output:
With arguments 3 <nil> 4.5 true arg1 [] error
formatted, err := formatter.Format("Automatic placeholder {p}:{p}:{p}():", "dir/file", 1, "func1")
fmt.Println(formatted)
Output:
Automatic placeholder dir/file:1:func1():
formatted, err := formatter.Format("Positional placeholders {p1}:{p0}:{p2}():", 2, "dir/file", "func1")
fmt.Println(formatted)
Output:
Positional placeholders dir/file:2:func1():
formatted, err := formatter.Format("Named placeholders {file}:{line}:{function}():", formatter.Named{
"line": 3,
"function": "func1",
"file": "dir/file",
})
fmt.Println(formatted)
Output:
Named placeholders dir/file:3:func1():
It handles exported struct
fields and methods. First letter must be capitalized.
Transformation using pipeline |
also works with exported struct
fields and struct
methods.
For more information about pipelines please see the Pipelines
section from the standard text/template package.
object := struct {
Line int
Function string
File string
}{
Line: 4,
Function: "func1",
File: "dir/file",
}
formatted, err := formatter.Format("Object placeholders {.File}:{.Line}:{.Function}():", object)
fmt.Println(formatted)
Output:
Object placeholders dir/file:4:func1():
It handles exported struct
fields and methods. First letter must be capitalized.
Transformation using pipeline |
also works with exported struct
fields and struct
methods.
For more information about pipelines please see the Pipelines
section from the standard text/template package.
object1 := struct {
Message string
}{
Message: "object1",
}
object2 := struct {
X int
}{
X: 2,
}
formatted, err := formatter.Format("Object with automatic placeholder {p.Message} {p.X}", object1, object2)
fmt.Println(formatted)
Output:
Object with automatic placeholder object1 2
It handles exported struct
fields and methods. First letter must be capitalized.
Transformation using pipeline |
also works with exported struct
fields and struct
methods.
For more information about pipelines please see the Pipelines
section from the standard text/template package.
object1 := struct {
Message string
}{
Message: "object1",
}
object2 := struct {
X int
}{
X: 2,
}
formatted, err := formatter.Format("Object with positional placeholders {p1.X} {p0.Message}", object1, object2)
fmt.Println(formatted)
Output:
Object with positional placeholders 2 object1
objectPointer := &struct {
X int
Y int
Z int
}{
X: 2,
Z: 6,
Y: 3,
}
formatted, err := formatter.Format("Mixed placeholders {.X}.{p}.{.Y}.{.Z} {p1} {p0}", objectPointer, "b", "c", nil)
fmt.Println(formatted)
Output:
Mixed placeholders 2.{2 3 6}.3.6 b {2 3 6} c <nil>
var buffer bytes.Buffer
err := formatter.FormatWriter(&buffer, "Writer {p2}", 3, "foo", "bar")
fmt.Println(buffer.String())
Output:
Writer bar 3 foo
Transformation using pipeline |
also works with exported struct
fields and struct
methods.
For more information about pipelines please see the Pipelines
section from the standard text/template package.
functions := formatter.Functions{
"str": func() string {
return "text"
},
"number": func() int {
return 3
},
"boolean": func() bool {
return true
},
"floating": func() float64 {
return 4.5
},
"transform": func(value int) int {
return value + 3
},
}
formatted, err := formatter.New().SetFunctions(functions).
Format("Custom functions {str} {p} {number} {boolean} {floating} {number | transform}", 5)
fmt.Println(formatted)
Output:
Custom functions text 5 3 true 4.5 6
formatted, err := formatter.New().SetPlaceholder("arg").Format("Custom placeholder {arg1} {arg0}", "2", 3)
fmt.Println(formatted)
Output:
Custom placeholder 3 2
formatted, err := formatter.New().SetDelimiters("<", ">").Format("Custom delimiters <p1> <p0>", "4", 3)
fmt.Println(formatted)
Output:
Custom delimiters 3 4
fmt.Println(formatter.MustFormat("With arguments", 3, nil, false, 4.5, "text", []byte{}, Error("error")))
Output:
With arguments 3 <nil> false 4.5 text [] error
Standard:
formatted, err := formatter.Format("With colors {red}red{normal} {green}green{normal} {blue}blue{normal}")
fmt.Println(formatted)
Bright:
formatted, err := formatter.Format("With bright colors {magenta | bright}magenta{normal}")
fmt.Println(formatted)
Background:
formatted, err := formatter.Format("With background colors {yellow | background}yellow{normal}")
fmt.Println(formatted)
Background + bright:
formatted, err := formatter.Format("With background bright colors {cyan | bright | background}cyan{normal}")
fmt.Println(formatted)
RGB:
formatted, err := formatter.Format("With RGB {rgb 255 165 0}funky{normal}")
fmt.Println(formatted)
Background RGB:
formatted, err := formatter.Format("With background RGB {rgb 255 165 0 | background}funky{normal}")
fmt.Println(formatted)
For more details please see the formatter
package
documentation.
Run example:
go run ./examples/functions/
Output:
By default, the formatter
package determines whether or not to use
ANSI escape sequences based
on whether it's connected to a TTY or not. This works for most use cases,
but may not behave as expected if you use the formatter
package in a pipeline
of commands, where STDOUT is being piped to another command.
To force it, add FORCE_ESCAPE_SEQUENCES=1
to the environment
you're running in. For example:
FORCE_ESCAPE_SEQUENCES=1 ./app | tee output.log
Supported values for the FORCE_ESCAPE_SEQUENCES
environment variable:
- To force enable:
1
,true
,enable
,on
,yes
,y
- To force disable:
0
,false
,disable
,off
,no
,n
- Auto detection when variable is unset, empty or contains other values