Skip to content

Commit

Permalink
Update: DeepL client
Browse files Browse the repository at this point in the history
  • Loading branch information
candy12t committed Nov 13, 2021
1 parent c6ee559 commit 04315d5
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 101 deletions.
52 changes: 0 additions & 52 deletions api/client.go

This file was deleted.

45 changes: 0 additions & 45 deletions api/translate.go

This file was deleted.

64 changes: 64 additions & 0 deletions internal/deepl/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package deepl

import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"net/url"
"path"
)

type Client struct {
BaseURL *url.URL
HTTPClient *http.Client
AuthKey string
}

func NewClient(rawBaseURL, authKey string) (*Client, error) {
if len(authKey) == 0 {
return nil, errors.New("missing DeepL authkey")
}

baseURL, err := url.ParseRequestURI(rawBaseURL)
if err != nil {
return nil, err
}

return &Client{
BaseURL: baseURL,
HTTPClient: http.DefaultClient,
AuthKey: authKey,
}, nil
}

func (c *Client) newRequest(ctx context.Context, method, _path string, body io.Reader) (*http.Request, error) {
u := *c.BaseURL
u.Path = path.Join(c.BaseURL.Path, _path)

req, err := http.NewRequest(method, u.String(), body)
if err != nil {
return nil, err
}

req = req.WithContext(ctx)
req.Header.Set("Authorization", fmt.Sprintf("DeepL-Auth-Key %s", c.AuthKey))

return req, nil
}

func decodeBody(resp *http.Response, out interface{}) error {
success := resp.StatusCode >= 200 && resp.StatusCode < 300
if !success {
return HandleHTTPError(resp)
}

if resp.StatusCode == http.StatusNoContent {
return nil
}

decoder := json.NewDecoder(resp.Body)
return decoder.Decode(out)
}
2 changes: 1 addition & 1 deletion api/error.go → internal/deepl/error.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package api
package deepl

import (
"encoding/json"
Expand Down
42 changes: 42 additions & 0 deletions internal/deepl/translate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package deepl

import (
"context"
"net/url"
"strings"
)

const TRANSLATE = "/translate"

type TranslateResponse struct {
Translations []struct {
DetectedSourceLanguage string `json:"detected_source_language"`
Text string `json:"text"`
} `json:"translations"`
}

func (c *Client) Translate(ctx context.Context, text, sourceLang, targetLang string) (string, error) {
values := url.Values{
"text": {text},
"source_lang": {sourceLang},
"target_lang": {targetLang},
}
req, err := c.newRequest(ctx, "POST", TRANSLATE, strings.NewReader(values.Encode()))
if err != nil {
return "", err
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

resp, err := c.HTTPClient.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()

transalted := new(TranslateResponse)
if err := decodeBody(resp, transalted); err != nil {
return "", err
}

return transalted.Translations[0].Text, nil
}
14 changes: 11 additions & 3 deletions internal/repl/repl.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,24 @@ package repl

import (
"bufio"
"context"
"fmt"
"os"
"strings"

"github.com/candy12t/deepl-cli/api"
"github.com/candy12t/deepl-cli/internal/config"
"github.com/candy12t/deepl-cli/internal/deepl"
)

const PROMPT = ">> "

func Repl(sourceLang, targetLang string) {
scanner := bufio.NewScanner(os.Stdin)
client, err := deepl.NewClient(config.BaseURL(), config.AuthKey())
if err != nil {
fmt.Println(err)
return
}
for {
fmt.Printf(PROMPT)
if scanned := scanner.Scan(); !scanned {
Expand All @@ -23,12 +30,13 @@ func Repl(sourceLang, targetLang string) {
if validedText, err := validText(text); err != nil {
fmt.Println(err)
} else {
tr, err := api.Translate(validedText, sourceLang, targetLang)
ctx := context.Background()
tr, err := client.Translate(ctx, validedText, sourceLang, targetLang)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(tr.TranslatedText())
fmt.Println(tr)
}
}
}
Expand Down

0 comments on commit 04315d5

Please sign in to comment.