Files
redmine-tree/domain/ui.go
2026-02-19 20:51:39 +01:00

78 lines
2.4 KiB
Go

package domain
import (
"fmt"
"os"
"redmine_tree/domain/model"
)
// UI represents the user interface output.
type UI struct {
// You can add fields here for more advanced UI customization if needed,
// e.g., output writer (os.Stdout, os.Stderr), log levels, etc.
}
// NewUI creates and returns a new UI instance.
func NewUI() *UI {
return &UI{}
}
// PrintError prints an error message to stderr and exits.
func (ui *UI) PrintError(format string, a ...interface{}) {
fmt.Fprintf(os.Stderr, format, a...)
os.Exit(1)
}
// Printf prints a formatted message to stdout.
func (ui *UI) Printf(format string, a ...interface{}) {
fmt.Printf(format, a...)
}
// Println prints a message to stdout with a newline.
func (ui *UI) Println(a ...interface{}) {
fmt.Println(a...)
}
// PrintProjects lists projects to stdout.
func (ui *UI) PrintProjects(projects []model.Project) {
ui.Printf("No project ID provided. Listing all available projects:\n\n")
if len(projects) == 0 {
ui.Println("No projects found.")
} else {
for _, p := range projects {
ui.Printf(" #%d %s\n", p.ID, p.Name)
}
}
}
// PrintUsage prints the application usage message to stderr and exits.
func (ui *UI) PrintUsage(appName string) {
ui.Printf("Usage: %s <project-id>\n", appName)
ui.Printf(" REDMINE_URL and REDMINE_TOKEN must be set in .env, as environment variables, or in ~/.redmine-tree.json.\n")
ui.Printf("Example: REDMINE_URL=https://redmine.example.com REDMINE_TOKEN=abc123 %s my-project\n", appName)
ui.Printf("Or: %s my-project (if REDMINE_URL, REDMINE_TOKEN are in .env or ~/.redmine-tree.json)\n", appName)
os.Exit(1)
}
// PrintFetchingProjectDetails prints the message when fetching project details.
func (ui *UI) PrintFetchingProjectDetails(projectName, projectID string) {
ui.Printf("Fetching issues for project: %s (%s)\n\n", projectName, projectID)
}
// PrintTotalIssuesFetched prints the total number of issues fetched.
func (ui *UI) PrintTotalIssuesFetched(count int) {
ui.Printf("Total issues fetched: %d\n\n", count)
}
// PrintIssueTreeHeader prints the header for the issue tree.
func (ui *UI) PrintIssueTreeHeader(rootCount int) {
ui.Printf("Issue tree (%d root issues):\n\n", rootCount)
}
// PrintSummary prints the summary of issues.
func (ui *UI) PrintSummary(totalIssues, rootIssues int) {
ui.Printf("\n--- Summary ---\n")
ui.Printf("Total issues : %d\n", totalIssues)
ui.Printf("Root issues : %d\n", rootIssues)
}