diff options
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 116 |
1 files changed, 113 insertions, 3 deletions
@@ -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) + } } |
