use crate::duocards::models::VocabularyCard;
use anyhow::Result;
use genanki_rs::{Field, Model, Note, Template};
#[derive(Debug)]
pub struct VocabularyNote {
pub word: String,
pub translation: String,
pub example: Option<String>,
pub tags: Vec<String>,
}
impl From<VocabularyCard> for VocabularyNote {
fn from(card: VocabularyCard) -> Self {
let tags = match card.status {
crate::duocards::models::LearningStatus::New => vec!["duoload_new".to_string()],
crate::duocards::models::LearningStatus::Learning => {
vec!["duoload_learning".to_string()]
}
crate::duocards::models::LearningStatus::Known => vec!["duoload_known".to_string()],
};
Self {
word: card.word,
translation: card.translation,
example: card.example,
tags,
}
}
}
impl VocabularyNote {
pub fn to_anki_note(&self, model: &Model) -> Result<Note> {
let fields = vec![
self.word.as_str(),
self.translation.as_str(),
self.example.as_deref().unwrap_or(""),
];
let mut note = Note::new(model.clone(), fields)?;
note = note.tags(self.tags.clone());
Ok(note)
}
}
pub fn create_vocabulary_model() -> Model {
Model::new(
1607392319, "Duoload Vocabulary",
vec![
Field::new("Front"),
Field::new("Back"),
Field::new("Example"),
],
vec![
Template::new("Card 1")
.qfmt("{{Front}}")
.afmt("{{FrontSide}}\n\n<hr id=answer>\n\n{{Back}}\n\n{{#Example}}<div class=\"example\">{{Example}}</div>{{/Example}}"),
],
)
}