75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
package output
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"git.wisehodl.dev/jay/aicli/config"
|
|
)
|
|
|
|
// WriteOutput orchestrates complete output delivery based on configuration.
|
|
func WriteOutput(response, model string, duration time.Duration, cfg config.ConfigData) error {
|
|
if cfg.Output == "" {
|
|
// Write to stdout with optional metadata
|
|
formatted := formatOutput(response, model, duration, cfg.Quiet)
|
|
return writeStdout(formatted)
|
|
}
|
|
|
|
// Write raw response to file
|
|
if err := writeFile(response, cfg.Output); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Write metadata to stderr unless quiet
|
|
if !cfg.Quiet {
|
|
metadata := fmt.Sprintf("Used model: %s\nQuery duration: %.1fs\nWrote response to: %s\n",
|
|
model, duration.Seconds(), cfg.Output)
|
|
return writeStderr(metadata)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// formatOutput constructs the final output string with optional metadata header.
|
|
func formatOutput(response, model string, duration time.Duration, quiet bool) string {
|
|
if quiet {
|
|
return response
|
|
}
|
|
|
|
return fmt.Sprintf(`--- aicli ---
|
|
|
|
Used model: %s
|
|
Query duration: %.1fs
|
|
|
|
--- response ---
|
|
|
|
%s`, model, duration.Seconds(), response)
|
|
}
|
|
|
|
// writeStdout writes content to stdout.
|
|
func writeStdout(content string) error {
|
|
_, err := fmt.Println(content)
|
|
if err != nil {
|
|
return fmt.Errorf("write stdout: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// writeStderr writes logs to stderr.
|
|
func writeStderr(content string) error {
|
|
_, err := fmt.Fprint(os.Stderr, content)
|
|
if err != nil {
|
|
return fmt.Errorf("write stderr: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// writeFile writes content to the specified path with permissions 0644.
|
|
func writeFile(content, path string) error {
|
|
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
|
|
return fmt.Errorf("write output file: %w", err)
|
|
}
|
|
return nil
|
|
}
|