91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
const version = "1.0.1"
|
|
|
|
func printHelp() {
|
|
helpText := fmt.Sprintf(`
|
|
Usage: %s [OPTIONS]
|
|
|
|
This program reads a text template from stdin and uses environment variables to render it.
|
|
|
|
Options:
|
|
-v Prints the version of the program.
|
|
-h Prints this help message.
|
|
|
|
Example:
|
|
echo "Hello, {{.USER}}" | %s
|
|
`, os.Args[0], os.Args[0])
|
|
fmt.Print(helpText)
|
|
}
|
|
|
|
func main() {
|
|
// Define and parse flags
|
|
versionFlag := flag.Bool("v", false, "Prints the version of the program")
|
|
helpFlag := flag.Bool("h", false, "Prints the help message")
|
|
flag.Parse()
|
|
|
|
// Handle version flag
|
|
if *versionFlag {
|
|
fmt.Println("Version:", version)
|
|
os.Exit(0)
|
|
}
|
|
|
|
// Handle help flag
|
|
if *helpFlag {
|
|
printHelp()
|
|
os.Exit(0)
|
|
}
|
|
|
|
// Define custom functions
|
|
customFunctions := template.FuncMap{
|
|
"title": func(s string) string { return strings.Title(s) },
|
|
}
|
|
|
|
// Create a new template.
|
|
tmpl, err := template.New("template").Funcs(customFunctions).Parse(readInput())
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error parsing template: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Create a map to hold environment variables.
|
|
envVars := make(map[string]string)
|
|
|
|
// Populate the map with the current environment variables.
|
|
for _, env := range os.Environ() {
|
|
pair := strings.SplitN(env, "=", 2)
|
|
if len(pair) == 2 {
|
|
envVars[pair[0]] = pair[1]
|
|
}
|
|
}
|
|
|
|
// Execute the template with the environment variables map.
|
|
if err := tmpl.Execute(os.Stdout, envVars); err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error executing template: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// readInput reads from stdin until EOF and returns the input as a string.
|
|
func readInput() string {
|
|
scanner := bufio.NewScanner(os.Stdin)
|
|
var input string
|
|
for scanner.Scan() {
|
|
input += scanner.Text() + "\n"
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "Error reading input: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
return input
|
|
}
|