CLIアプリテンプレート
This commit is contained in:
parent
075c3a83ca
commit
ba12476800
@ -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())
|
||||
os.Exit(cli.Run(os.Args))
|
||||
}
|
||||
2
go.mod
2
go.mod
@ -1,3 +1,3 @@
|
||||
module gitea.pglikers.com/tools/slacksen
|
||||
module gitea.pglikers.com/tools/slacksend
|
||||
|
||||
go 1.25.5
|
||||
|
||||
70
internal/cli/cli.go
Normal file
70
internal/cli/cli.go
Normal file
@ -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
|
||||
}
|
||||
|
||||
27
internal/cli/usage.go
Normal file
27
internal/cli/usage.go
Normal file
@ -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] <message...>
|
||||
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
|
||||
`)
|
||||
}
|
||||
16
internal/version/version.go
Normal file
16
internal/version/version.go
Normal file
@ -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 + ")"
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user