anki_bridge 0.10.2

AnkiBridge is a Rust library that provides a bridge between your Rust code and the Anki application, enabling HTTP communication and seamless data transmission.
Documentation
/*
* The MIT License (MIT)
*
* Copyright (c) 2025 DaniƩl Kerkmann <daniel@kerkmann.dev>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
use serde::Serialize;

use crate::AnkiRequest;
use crate::entities::NoteId;
use crate::note_actions::add_note;

/// Parameters for the "addNotes" action.
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize)]
pub struct AddNotesRequest {
    /// List of notes being created.
    pub notes: Vec<add_note::AddNoteEntry>,
}

impl AnkiRequest for AddNotesRequest {
    type Response = Vec<NoteId>;

    const ACTION: &'static str = "addNotes";
    const VERSION: u8 = 6;
}

#[cfg(test)]
mod tests {
    use super::add_note::AddNoteEntry;
    use super::*;
    use std::collections::HashMap;

    #[test]
    fn test_serialize() {
        let request = AddNotesRequest {
            notes: vec![
                AddNoteEntry {
                    deck_name: "College::PluginDev".to_string(),
                    model_name: "non_existent_model".to_string(),
                    fields: HashMap::from([
                        (
                            "Front".to_string(),
                            "What is the capital of France?".to_string(),
                        ),
                        ("Back".to_string(), "Paris".to_string()),
                    ]),
                    ..Default::default()
                },
                AddNoteEntry {
                    deck_name: "College::PluginDev".to_string(),
                    model_name: "Basic".to_string(),
                    fields: HashMap::from([
                        (
                            "Front".to_string(),
                            "What is the capital of Germany?".to_string(),
                        ),
                        ("Back".to_string(), "Berlin".to_string()),
                    ]),
                    ..Default::default()
                },
            ],
        };

        let json = serde_json::to_string_pretty(&request).unwrap();
        assert_eq!(
            json,
            r#"{
  "notes": [
    {
      "deckName": "College::PluginDev",
      "modelName": "non_existent_model",
      "fields": {
        "Back": "Paris",
        "Front": "What is the capital of France?"
      },
      "options": {
        "allowDuplicate": false,
        "duplicateScope": "deck",
        "duplicateScopeOptions": {
          "deckName": null,
          "checkChildren": false,
          "checkAllModels": false
        }
      },
      "tags": [],
      "audio": [],
      "video": [],
      "picture": []
    },
    {
      "deckName": "College::PluginDev",
      "modelName": "Basic",
      "fields": {
        "Back": "Berlin",
        "Front": "What is the capital of Germany?"
      },
      "options": {
        "allowDuplicate": false,
        "duplicateScope": "deck",
        "duplicateScopeOptions": {
          "deckName": null,
          "checkChildren": false,
          "checkAllModels": false
        }
      },
      "tags": [],
      "audio": [],
      "video": [],
      "picture": []
    }
  ]
}"#
        );
    }

    #[test]
    fn test_deserialize() {
        let json = "[1496198395707, 1496198395708]";
        let response: <AddNotesRequest as AnkiRequest>::Response =
            serde_json::from_str(json).unwrap();

        assert_eq!(response, vec![1496198395707, 1496198395708]);
    }
}