feat: add output flag #13

Merged
mvhutz merged 2 commits from feat/output-flag into main 2026-01-11 22:14:49 +00:00
5 changed files with 49 additions and 10 deletions

View File

@@ -20,13 +20,13 @@ build:
chmod +x ${BINARY_NAME}
run: build
./${BINARY_NAME} -f ./samples/$(TEST).txt > program.out
./${BINARY_NAME} -f ./samples/$(TEST).txt -o program.out
profile: build
./${BINARY_NAME} -p profile/cpu.prof -f ./samples/$(TEST).txt > program.out
./${BINARY_NAME} -p profile/cpu.prof -f ./samples/$(TEST).txt -o program.out
explain: build
./${BINARY_NAME} -x -p profile/cpu.prof -f ./samples/$(TEST).txt > program.out
./${BINARY_NAME} -x -p profile/cpu.prof -f ./samples/$(TEST).txt -o program.out
graph:
go tool pprof -raw -output=profile/cpu.raw profile/cpu.prof

View File

@@ -1,7 +1,6 @@
package main
import (
"fmt"
"os"
"git.maximhutz.com/max/lambda/internal/cli"
@@ -72,5 +71,7 @@ func main() {
process.Run()
// Return the final reduced result.
fmt.Println(lambda.Stringify(compiled))
result := lambda.Stringify(compiled)
err = options.Destination.Write(result)
cli.HandleError(err)
}

View File

@@ -3,9 +3,10 @@ package config
// Configuration settings for the program.
type Config struct {
Source Source // The source code given to the program.
Verbose bool // Whether or not to print debug logs.
Explanation bool // Whether or not to print an explanation of the reduction.
Profile string // If not nil, print a CPU profile during execution.
Statistics bool // Whether or not to print statistics.
Source Source // The source code given to the program.
Destination Destination // The destination for the final result.
Verbose bool // Whether or not to print debug logs.
Explanation bool // Whether or not to print an explanation of the reduction.
Profile string // If not nil, print a CPU profile during execution.
Statistics bool // Whether or not to print statistics.
}

View File

@@ -0,0 +1,27 @@
package config
import (
"fmt"
"os"
)
// A method of writing output to the user.
type Destination interface {
// Write data to this destination.
Write(data string) error
}
// A destination writing to stdout.
type StdoutDestination struct{}
func (d StdoutDestination) Write(data string) error {
fmt.Println(data)
return nil
}
// A destination writing to a file.
type FileDestination struct{ Path string }
func (d FileDestination) Write(data string) error {
return os.WriteFile(d.Path, []byte(data+"\n"), 0644)
}

View File

@@ -13,6 +13,7 @@ func FromArgs() (*Config, error) {
statistics := flag.Bool("s", false, "Statistics. If set, the process will print various statistics about the run.")
profile := flag.String("p", "", "CPU profiling. If an output file is defined, the program will profile its execution and dump its results into it.")
file := flag.String("f", "", "File. If set, read source from the specified file.")
output := flag.String("o", "", "Output. If set, write result to the specified file. Use '-' for stdout (default).")
flag.Parse()
// Parse source type.
@@ -36,8 +37,17 @@ func FromArgs() (*Config, error) {
}
}
// Parse destination type.
var destination Destination
if *output == "" || *output == "-" {
destination = StdoutDestination{}
} else {
destination = FileDestination{Path: *output}
}
return &Config{
Source: source,
Destination: destination,
Verbose: *verbose,
Explanation: *explanation,
Profile: *profile,