diff --git a/cmd/slacksend/main.go b/cmd/slacksend/main.go index f7dc3df..26604ba 100644 --- a/cmd/slacksend/main.go +++ b/cmd/slacksend/main.go @@ -1,11 +1,16 @@ package main -import "fmt" +import ( + "os" + + "gitea.pglikers.com/tools/slacksend/internal/cli" +) func hello() string { return "hello" } + func main() { - fmt.Println(hello()) -} \ No newline at end of file + os.Exit(cli.Run(os.Args)) +} diff --git a/go.mod b/go.mod index 250cc7f..46ed05c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module gitea.pglikers.com/tools/slacksen +module gitea.pglikers.com/tools/slacksend go 1.25.5 diff --git a/internal/cli/cli.go b/internal/cli/cli.go new file mode 100644 index 0000000..d702db4 --- /dev/null +++ b/internal/cli/cli.go @@ -0,0 +1,70 @@ +package cli + +import ( + "flag" + "fmt" + "io" + "os" + "strings" + + "gitea.pglikers.com/tools/slacksend/internal/version" +) + +type Options struct { + ShowVersion bool +} + +func Run(args []string) int { + return run(args, os.Stdin, os.Stdout, os.Stderr) +} + +func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int { + fs := flag.NewFlagSet("slacksend", flag.ContinueOnError) + fs.SetOutput(stderr) + fs.Usage = func() { Usage(stdout) } + + var opt Options + fs.BoolVar(&opt.ShowVersion, "version", false, "show version") + fs.BoolVar(&opt.ShowVersion, "V", false, "show version (short)") + + if err := fs.Parse(args[1:]); err != nil { + if err == flag.ErrHelp { + Usage(stdout) + return 0 + } + fmt.Fprintln(stderr, err) + Usage(stderr) + return 2 + } + + if opt.ShowVersion { + fmt.Fprintln(stdout, version.String()) + return 0 + } + + msg, err := message(fs.Args(), stdin) + if err != nil { + fmt.Fprintln(stderr, "read message error:", err) + return 1 + } + if msg == "" { + Usage(stderr) + return 2 + } + + // TODO: Slack送信(ここはあとで internal/slack に逃がす) + fmt.Fprintln(stdout, msg) + return 0 +} + +func message(args []string, stdin io.Reader) (string, error) { + if len(args) > 0 { + return strings.Join(args, " "), nil + } + b, err := io.ReadAll(stdin) + if err != nil { + return "", err + } + return strings.TrimSpace(string(b)), nil +} + diff --git a/internal/cli/usage.go b/internal/cli/usage.go new file mode 100644 index 0000000..9a6b89d --- /dev/null +++ b/internal/cli/usage.go @@ -0,0 +1,27 @@ +package cli + +import ( + "fmt" + "io" +) + +func Usage(w io.Writer) { + fmt.Fprint(w, `slacksend - send a message to Slack (Incoming Webhook) + +Usage: + slacksend [options] + echo "message" | slacksend [options] + +Options: + -V, --version show version + -h, --help show this help + +Environment: + SLACK_WEBHOOK_URL Slack Incoming Webhook URL + +Examples: + export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/XXX/YYY/ZZZ" + slacksend "hello slack" + echo "hello from stdin" | slacksend +`) +} diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..cb47f30 --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,16 @@ +package version + +var ( + // Version is the application version. + Version = "dev" + + // Commit is the git commit hash. + Commit = "none" + + // Date is the build date. + Date = "unknown" +) + +func String() string { + return Version + " (" + Commit + ", " + Date + ")" +} \ No newline at end of file