Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 34 additions & 10 deletions aspell/remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package aspell
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"strings"
Expand All @@ -14,26 +15,39 @@ func fetchRemoteFile(aspell Aspell) ([]string, error) {
url := aspell.RemoteFile.URL
if aspell.RemoteFile.URLEnv != "" {
url = os.Getenv(aspell.RemoteFile.URLEnv)
log.Printf("aspell remote file: using URL from env %s: %q", aspell.RemoteFile.URLEnv, url)
} else {
log.Printf("aspell remote file: using URL: %q", url)
}

if url == "" {
return nil, fmt.Errorf("aspell remote file: URL is empty")
}

req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
return nil, fmt.Errorf("aspell remote file: failed to build request: %w", err)
}

if aspell.RemoteFile.HeaderFromENV != "" {
envValue := os.Getenv(aspell.RemoteFile.HeaderFromENV)
if envValue == "" {
log.Printf("aspell remote file: warning: header env %s is empty", aspell.RemoteFile.HeaderFromENV)
}
req.Header.Set(aspell.RemoteFile.HeaderFromENV, envValue)
}
if aspell.RemoteFile.PrivateTokenENV != "" {
envValue := os.Getenv(aspell.RemoteFile.PrivateTokenENV)
if envValue == "" {
log.Printf("aspell remote file: warning: private token env %s is empty", aspell.RemoteFile.PrivateTokenENV)
}
req.Header.Set("PRIVATE-TOKEN", envValue)
}

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, err
return nil, fmt.Errorf("aspell remote file: request failed: %w", err)
}
defer resp.Body.Close()

Expand All @@ -44,7 +58,7 @@ func fetchRemoteFile(aspell Aspell) ([]string, error) {
var data map[string]interface{}
err = json.NewDecoder(resp.Body).Decode(&data)
if err != nil {
return nil, err
return nil, fmt.Errorf("aspell remote file: failed to decode JSON: %w", err)
}

var allowedWords []string
Expand All @@ -53,24 +67,34 @@ func fetchRemoteFile(aspell Aspell) ([]string, error) {
if !ok {
content, ok := data[aspell.RemoteFile.AllowedItemsKey].(string)
if !ok {
return nil, nil
return nil, fmt.Errorf("aspell remote file: key %q not found or not a string/array in response", aspell.RemoteFile.AllowedItemsKey)
}
content = strings.TrimRight(content, "\n")
if strings.HasPrefix(content, "```yaml\n") && strings.HasSuffix(content, "\n```") {
content = strings.TrimPrefix(content, "```yaml\n")
content = strings.TrimSuffix(content, "\n```")
err = yaml.Unmarshal([]byte(content), &allowedWords)
if err != nil {
return nil, err
return nil, fmt.Errorf("aspell remote file: failed to parse YAML block: %w", err)
}

log.Printf("aspell remote file: loaded %d words (yaml block): %v", len(allowedWords), wordSample(allowedWords))
return allowedWords, nil
}
allowedWords = strings.Split(content, "\n")
}

for _, item := range items {
allowedWords = append(allowedWords, item.(string))
log.Printf("aspell remote file: loaded %d words (newline-separated): %v", len(allowedWords), wordSample(allowedWords))
} else {
for _, item := range items {
allowedWords = append(allowedWords, item.(string))
}
log.Printf("aspell remote file: loaded %d words (JSON array): %v", len(allowedWords), wordSample(allowedWords))
}

return allowedWords, nil
}

func wordSample(words []string) []string {
if len(words) <= 3 {
return words
}
return []string{words[0], words[1], "...", words[len(words)-1]}
}