Files
suwako/cmd/root.go
yakumo.izuru 7d75398332 すべてを書き直し、3.0.0をリリースします
git-svn-id: file:///srv/svn/repo/suwako/trunk@31 0b558ee1-521d-8b46-a41b-40029c97c055
2025-05-14 15:38:01 +00:00

102 lines
2.2 KiB
Go

/*
Copyright © 2025 Izuru Yakumo <eternal-servant@yakumo.dev>
*/
package cmd
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
"strings"
"github.com/spf13/cobra"
"gopkg.in/ini.v1"
)
var (
cfgFile string
input string
output string
)
var conf struct {
endpoint string
engine string
}
type Translate struct {
Output string `json:"translated_text"`
}
var rootCmd = &cobra.Command{
Use: "suwako",
Short: "A client for SimplyTranslate with illusionary origins",
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
_split := fmt.Sprint(args)
text := fmt.Sprint(strings.Trim(_split, "[]"))
if len(output) == 0 {
log.Fatalf("\033[1;31m%s\033[0m\n", "No target language")
}
var translate Translate
encInput := url.PathEscape(text)
queryURL := conf.endpoint + "/api/translate" + "?engine=" + conf.engine + "&from=" + input + "&to=" + output + "&text=" + encInput
resp, err := http.Get(queryURL)
CheckErr(err)
defer resp.Body.Close()
_ = json.NewDecoder(resp.Body).Decode(&translate)
CheckErr(err)
if len(translate.Output) == 0 {
log.Fatalf("\033[1;31m%s\033[0m\n", "There was no output, maybe the endpoint is down?")
} else {
fmt.Printf("%v\n", translate.Output)
}
},
Version: "3.0.0",
}
func CheckErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $XDG_CONFIG_HOME/suwako.ini)")
rootCmd.PersistentFlags().StringVarP(&input, "from", "f", "auto", "language to translate from (default is auto)")
rootCmd.PersistentFlags().StringVarP(&output, "to", "t", "", "target language")
}
func parseConfig(file string) error {
cfg, err := ini.Load(file)
CheckErr(err)
conf.endpoint = cfg.Section("suwako").Key("endpoint").String()
conf.engine = cfg.Section("suwako").Key("engine").String()
return nil
}
func initConfig() {
if cfgFile != "" {
parseConfig(cfgFile)
} else {
// Find home directory.
xdg, err := os.UserConfigDir()
CheckErr(err)
defaultCfgPath := xdg + "/suwako.ini"
parseConfig(defaultCfgPath)
}
}