получить заголовок из элемента Zotero

#rust #rust-rocket

#Ржавчина #rust-ракета

Вопрос:

Все еще новичок в Rust, пытаюсь понять, как извлечь title из a JournalArticle с помощью ящика Zotero.

Я получил это и могу подтвердить, что элемент успешно извлечен:

 let zc = ZoteroCredentials::new();
let z = ZoteroInit::set_user(amp;zc.api_id, amp;zc.api_key);
let item = z.get_item(item_id, None).unwrap();
 

Отсюда я вижу, что an item.data — это an ItemType , в частности, JournalArticleData . Но я принципиально не совсем понимаю, как либо а) сериализовать это в JSON, либо б) получить доступ .title как свойство.

Для контекста это будет результатом маршрута ракеты GET .

Любая помощь была бы очень признательна!

Ответ №1:

Похоже, что часть, которую вы упускаете, заключается в том, как использовать сопоставление с образцом для перечисления. Я не знаком с zotero so, все это основано на документах, с подробными аннотациями типа, в которых четко указано, что я думаю, что я делаю:

 use zotero::data_structure::item::{Item, ItemType, JournalArticleData};

let item: Item = z.get_item(item_id, None).unwrap();

// Now we must extract the JournalArticle from the ItemType, which is an enum
// and therefore requires pattern matching.
let article: JournalArticleData = match item.data {
    ItemType::JournalArticle(a) => a,
    something_else => todo!("handle wrong type of item"),
}

let title: String = article.title;
 

(Также match может быть записан if let как an).

Вы также можете использовать сопоставление с образцом для просмотра всей структуры, а не только перечисления, которое требует этого:

 match z.get_item(item_id, None).unwrap() {
    Item {
        data: ItemType::JournalArticle(JournalArticleData {
            title,
            ..
        }),
        ..
    } => {
        // Use the `title` variable here
    },
    something_else => todo!("handle wrong type of item"),
}
 

Комментарии:

1. Большое спасибо! Оцените объяснение и предложения по более глубокому сопоставлению с образцом. Похоже, что JournalArticleData структура имеет a Vec<Creator> при синтаксическом анализе JSON из API, что может привести к сбою, если они не firstName включены. Но это проблема для другого дня! Еще раз спасибо.