diff --git a/proto/anki/backend.proto b/proto/anki/backend.proto index b69fb2120..6613737fb 100644 --- a/proto/anki/backend.proto +++ b/proto/anki/backend.proto @@ -24,6 +24,7 @@ enum ServiceIndex { SERVICE_INDEX_I18N = 12; SERVICE_INDEX_COLLECTION = 13; SERVICE_INDEX_CARDS = 14; + SERVICE_INDEX_LINKS = 15; } message BackendInit { diff --git a/proto/anki/links.proto b/proto/anki/links.proto new file mode 100644 index 000000000..da2c567a5 --- /dev/null +++ b/proto/anki/links.proto @@ -0,0 +1,38 @@ +// Copyright: Ankitects Pty Ltd and contributors +// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +syntax = "proto3"; + +package anki.links; + +import "anki/generic.proto"; + +service LinksService { + rpc HelpPageLink(HelpPageLinkRequest) returns (generic.String); +} + +message HelpPageLinkRequest { + enum HelpPage { + NOTE_TYPE = 0; + BROWSING = 1; + BROWSING_FIND_AND_REPLACE = 2; + BROWSING_NOTES_MENU = 3; + KEYBOARD_SHORTCUTS = 4; + EDITING = 5; + ADDING_CARD_AND_NOTE = 6; + ADDING_A_NOTE_TYPE = 7; + LATEX = 8; + PREFERENCES = 9; + INDEX = 10; + TEMPLATES = 11; + FILTERED_DECK = 12; + IMPORTING = 13; + CUSTOMIZING_FIELDS = 14; + DECK_OPTIONS = 15; + EDITING_FEATURES = 16; + } + oneof page { + HelpPage variant = 1; + string literal = 2; + } +} diff --git a/rslib/src/backend/links.rs b/rslib/src/backend/links.rs new file mode 100644 index 000000000..09246db5f --- /dev/null +++ b/rslib/src/backend/links.rs @@ -0,0 +1,46 @@ +// Copyright: Ankitects Pty Ltd and contributors +// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html + +use super::Backend; +pub(super) use crate::backend_proto::links_service::Service as LinksService; +use crate::{ + backend_proto as pb, + backend_proto::links::help_page_link_request::{HelpPage as ProtoHelpPage, Page}, + links::{help_page_link, help_page_link_from_str, HelpPage}, + prelude::*, +}; + +impl LinksService for Backend { + fn help_page_link(&self, input: pb::HelpPageLinkRequest) -> Result { + Ok(match input.page { + Some(Page::Variant(var)) => help_page_link(var.into()), + Some(Page::Literal(s)) => help_page_link_from_str(&s), + None => help_page_link_from_str(""), + } + .into()) + } +} + +impl From for HelpPage { + fn from(page: i32) -> Self { + match ProtoHelpPage::from_i32(page).unwrap_or(ProtoHelpPage::Index) { + ProtoHelpPage::NoteType => HelpPage::Notetype, + ProtoHelpPage::Browsing => HelpPage::Browsing, + ProtoHelpPage::BrowsingFindAndReplace => HelpPage::BrowsingFindAndReplace, + ProtoHelpPage::BrowsingNotesMenu => HelpPage::BrowsingNotesMenu, + ProtoHelpPage::KeyboardShortcuts => HelpPage::KeyboardShortcuts, + ProtoHelpPage::Editing => HelpPage::Editing, + ProtoHelpPage::AddingCardAndNote => HelpPage::AddingCardAndNote, + ProtoHelpPage::AddingANoteType => HelpPage::AddingNotetype, + ProtoHelpPage::Latex => HelpPage::Latex, + ProtoHelpPage::Preferences => HelpPage::Preferences, + ProtoHelpPage::Index => HelpPage::Index, + ProtoHelpPage::Templates => HelpPage::Templates, + ProtoHelpPage::FilteredDeck => HelpPage::FilteredDeck, + ProtoHelpPage::Importing => HelpPage::Importing, + ProtoHelpPage::CustomizingFields => HelpPage::CustomizingFields, + ProtoHelpPage::DeckOptions => HelpPage::DeckOptions, + ProtoHelpPage::EditingFeatures => HelpPage::EditingFeatures, + } + } +} diff --git a/rslib/src/backend/mod.rs b/rslib/src/backend/mod.rs index 013d5104d..ad1557e8b 100644 --- a/rslib/src/backend/mod.rs +++ b/rslib/src/backend/mod.rs @@ -15,6 +15,7 @@ mod decks; mod error; mod generic; mod i18n; +mod links; mod media; mod notes; mod notetypes; @@ -44,6 +45,7 @@ use self::{ deckconfig::DeckConfigService, decks::DecksService, i18n::I18nService, + links::LinksService, media::MediaService, notes::NotesService, notetypes::NotetypesService, @@ -132,6 +134,7 @@ impl Backend { pb::ServiceIndex::Stats => StatsService::run_method(self, method, input), pb::ServiceIndex::Search => SearchService::run_method(self, method, input), pb::ServiceIndex::I18n => I18nService::run_method(self, method, input), + pb::ServiceIndex::Links => LinksService::run_method(self, method, input), pb::ServiceIndex::Collection => CollectionService::run_method(self, method, input), pb::ServiceIndex::Cards => CardsService::run_method(self, method, input), }) diff --git a/rslib/src/backend_proto.rs b/rslib/src/backend_proto.rs index 0fc6be831..ec9f2da43 100644 --- a/rslib/src/backend_proto.rs +++ b/rslib/src/backend_proto.rs @@ -22,6 +22,7 @@ protobuf!(deckconfig); protobuf!(decks); protobuf!(generic); protobuf!(i18n); +protobuf!(links); protobuf!(media); protobuf!(notes); protobuf!(notetypes);