summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.go116
-rw-r--r--setup.go1
2 files changed, 113 insertions, 4 deletions
diff --git a/main.go b/main.go
index fa0cd20..c1dd369 100644
--- a/main.go
+++ b/main.go
@@ -3,18 +3,128 @@
package main
import (
+ "bytes"
+ "encoding/json"
+ "io"
"log"
+ "net/http"
+ "os"
+ "time"
_ "github.com/mattn/go-sqlite3"
)
-const rawDictionary = "/home/david/work/french-wiktionary-flashcards/raw-wiktextract-data.jsonl"
-const dictionary = "/home/david/work/french-wiktionary-flashcards/raw-wiktextract-data.sqlite3"
+const (
+ rawDictionary = "/home/david/work/french-wiktionary-flashcards/raw-wiktextract-data.jsonl"
+ dictionary = "/home/david/work/french-wiktionary-flashcards/raw-wiktextract-data.sqlite3"
+
+ apiURL = "http://localhost:8765"
+ deckName = "Français"
+ modelName = "Basic-830ae"
+)
+
+type addNote struct {
+ Action string `json:"action"`
+ Version int `json:"version"`
+ Params addNoteParams `json:"params"`
+}
+
+type addNoteParams struct {
+ Note note `json:"note"`
+}
+
+type note struct {
+ DeckName string `json:"deckName"`
+ ModelName string `json:"modelName"`
+ // Fields will not be trivial to generalize
+ Fields fields `json:"fields"`
+ Options options `json:"options"`
+}
+
+type fields struct {
+ Front string `json:"Front"`
+ Back string `json:"Back"`
+}
+
+type options struct {
+ AllowDuplicate bool `json:"allowDuplicate"`
+ DuplicateScope string `json:"duplicateScope"`
+}
func main() {
- _, err := setupDatabase()
+ db, err := setupDatabase()
if err != nil {
log.Fatalf("setting up database: %s", err)
}
+ defer db.Close()
+
+ // We're going to start this app very simply! The first iteration will take
+ // a word as its first command-line argument. We will search for the word in
+ // the dictionary and create a new Anki card using the first exact match.
+ //
+ // In the future, we may make it easy for the user to edit cards (flag?),
+ // and possibly implement a TUI to choose definitions more interactively as
+ // well (e.g. search with partial matches).
+ //
+ // I would also like to make more things less hard-coded.
+ if len(os.Args) < 2 {
+ log.Fatalf("no word was provided")
+ }
+ word := os.Args[1]
+
+ var definition string
+ row := db.QueryRow(`select definition from words where word = ? limit 1`, word)
+ err = row.Scan(&definition)
+ if err != nil {
+ log.Fatalf("looking up '%s': %s", word, err)
+ }
+
+ c := http.DefaultClient
+ c.Timeout = 5 * time.Second
+
+ // Create the card
+ noteRequest := addNote{
+ Action: "addNote",
+ Version: 6,
+ Params: addNoteParams{
+ Note: note{
+ DeckName: deckName,
+ ModelName: modelName,
+ Fields: fields{
+ Front: word,
+ Back: definition,
+ },
+ Options: options{
+ AllowDuplicate: false,
+ DuplicateScope: "deck",
+ },
+ },
+ },
+ }
+
+ jsonBytes, err := json.Marshal(noteRequest)
+ if err != nil {
+ log.Fatalf("marshaling JSON: %s", err)
+ }
+
+ req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(jsonBytes))
+ req.Header.Set("Content-Type", "application/json")
+
+ resp, err := c.Do(req)
+ if err != nil {
+ log.Fatalf("making request: %s", err)
+ }
+ defer resp.Body.Close()
+
+ body, _ := io.ReadAll(resp.Body)
+
+ var jsonResp struct {
+ Error string `json:"error"`
+ }
+
+ json.Unmarshal(body, &jsonResp)
+ if jsonResp.Error != "" {
+ log.Fatalf("creating card: %s", jsonResp.Error)
+ }
}
diff --git a/setup.go b/setup.go
index 4506282..83827c5 100644
--- a/setup.go
+++ b/setup.go
@@ -17,7 +17,6 @@ func setupDatabase() (*sql.DB, error) {
if err != nil {
return nil, fmt.Errorf("opening DB '%s': %s", dictionary, err)
}
- defer db.Close()
_, err = db.Exec("create table IF NOT EXISTS words (word text not null, definition text);")
if err != nil {