87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
package cli
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"io"
|
||
"os"
|
||
"strings"
|
||
|
||
"gitea.pglikers.com/tools/slacksend/internal/version"
|
||
)
|
||
|
||
type Options struct {
|
||
ShowVersion bool
|
||
WebhookURL string
|
||
TimeoutSec int
|
||
}
|
||
|
||
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)")
|
||
// other options
|
||
fs.StringVar(&opt.WebhookURL, "webhook", "", "Slack Incoming Webhook URL (or env SLACK_WEBHOOK_URL)")
|
||
fs.IntVar(&opt.TimeoutSec, "timeout", 10, "HTTP timeout seconds")
|
||
|
||
|
||
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
|
||
}
|
||
|
||
// webhook URL の解決: flag > env
|
||
webhookURL := strings.TrimSpace(opt.WebhookURL)
|
||
if webhookURL == "" {
|
||
webhookURL = strings.TrimSpace(os.Getenv("SLACK_WEBHOOK_URL"))
|
||
}
|
||
if webhookURL == "" {
|
||
fmt.Fprintln(stderr, "Slack webhook URL is required. Set --webhook or SLACK_WEBHOOK_URL.")
|
||
return 2
|
||
}
|
||
|
||
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
|
||
}
|
||
|