syntax = "proto3"; package backend_proto; message Empty {} message BackendInit { string collection_path = 1; string media_folder_path = 2; string media_db_path = 3; repeated string preferred_langs = 4; string locale_folder_path = 5; } // 1-15 reserved for future use; 2047 for errors message BackendInput { reserved 2047; oneof value { TemplateRequirementsIn template_requirements = 16; SchedTimingTodayIn sched_timing_today = 17; Empty deck_tree = 18; FindCardsIn find_cards = 19; BrowserRowsIn browser_rows = 20; RenderCardIn render_card = 21; int64 local_minutes_west = 22; string strip_av_tags = 23; ExtractAVTagsIn extract_av_tags = 24; ExtractLatexIn extract_latex = 25; AddMediaFileIn add_media_file = 26; SyncMediaIn sync_media = 27; Empty check_media = 28; TrashMediaFilesIn trash_media_files = 29; } } message BackendOutput { oneof value { TemplateRequirementsOut template_requirements = 16; SchedTimingTodayOut sched_timing_today = 17; DeckTreeOut deck_tree = 18; FindCardsOut find_cards = 19; BrowserRowsOut browser_rows = 20; RenderCardOut render_card = 21; sint32 local_minutes_west = 22; string strip_av_tags = 23; ExtractAVTagsOut extract_av_tags = 24; ExtractLatexOut extract_latex = 25; string add_media_file = 26; Empty sync_media = 27; MediaCheckOut check_media = 28; Empty trash_media_files = 29; BackendError error = 2047; } } message BackendError { oneof value { StringError invalid_input = 1; TemplateParseError template_parse = 2; StringError io_error = 3; StringError db_error = 4; NetworkError network_error = 5; SyncError sync_error = 6; // user interrupted operation Empty interrupted = 8; } } message Progress { oneof value { MediaSyncProgress media_sync = 1; uint32 media_check = 2; } } message StringError { string info = 1; } message TemplateParseError { string info = 1; bool q_side = 2; } message NetworkError { string info = 1; enum NetworkErrorKind { OTHER = 0; OFFLINE = 1; TIMEOUT = 2; PROXY_AUTH = 3; } NetworkErrorKind kind = 2; } message SyncError { string info = 1; enum SyncErrorKind { OTHER = 0; CONFLICT = 1; SERVER_ERROR = 2; CLIENT_TOO_OLD = 3; AUTH_FAILED = 4; SERVER_MESSAGE = 5; MEDIA_CHECK_REQUIRED = 6; RESYNC_REQUIRED = 7; } SyncErrorKind kind = 2; } message MediaSyncProgress { uint32 checked = 1; uint32 downloaded_files = 2; uint32 downloaded_deletions = 3; uint32 uploaded_files = 4; uint32 uploaded_deletions = 5; } message MediaSyncUploadProgress { uint32 files = 1; uint32 deletions = 2; } message TemplateRequirementsIn { repeated string template_front = 1; map field_names_to_ordinals = 2; } message TemplateRequirementsOut { repeated TemplateRequirement requirements = 1; } message TemplateRequirement { oneof value { TemplateRequirementAll all = 1; TemplateRequirementAny any = 2; Empty none = 3; } } message TemplateRequirementAll { repeated uint32 ords = 1; } message TemplateRequirementAny { repeated uint32 ords = 1; } message SchedTimingTodayIn { int64 created_secs = 1; sint32 created_mins_west = 2; int64 now_secs = 3; sint32 now_mins_west = 4; sint32 rollover_hour = 5; } message SchedTimingTodayOut { uint32 days_elapsed = 1; int64 next_day_at = 2; } message DeckTreeOut { DeckTreeNode top = 1; } message DeckTreeNode { // the components of a deck, split on :: repeated string names = 1; int64 deck_id = 2; uint32 review_count = 3; uint32 learn_count = 4; uint32 new_count = 5; repeated DeckTreeNode children = 6; bool collapsed = 7; } message FindCardsIn { string search = 1; } message FindCardsOut { repeated int64 card_ids = 1; } message BrowserRowsIn { repeated int64 card_ids = 1; } message BrowserRowsOut { // just sort fields for proof of concept repeated string sort_fields = 1; } message RenderCardIn { string question_template = 1; string answer_template = 2; map fields = 3; int32 card_ordinal = 4; } message RenderCardOut { repeated RenderedTemplateNode question_nodes = 1; repeated RenderedTemplateNode answer_nodes = 2; } message RenderedTemplateNode { oneof value { string text = 1; RenderedTemplateReplacement replacement = 2; } } message RenderedTemplateReplacement { string field_name = 1; string current_text = 2; repeated string filters = 3; } message ExtractAVTagsIn { string text = 1; bool question_side = 2; } message ExtractAVTagsOut { string text = 1; repeated AVTag av_tags = 2; } message AVTag { oneof value { string sound_or_video = 1; TTSTag tts = 2; } } message TTSTag { string field_text = 1; string lang = 2; repeated string voices = 3; float speed = 4; repeated string other_args = 5; } message ExtractLatexIn { string text = 1; bool svg = 2; } message ExtractLatexOut { string text = 1; repeated ExtractedLatex latex = 2; } message ExtractedLatex { string filename = 1; string latex_body = 2; } message AddMediaFileIn { string desired_name = 1; bytes data = 2; } message SyncMediaIn { string hkey = 1; string endpoint = 2; } message MediaCheckOut { repeated string unused = 1; repeated string missing = 2; repeated string dirs = 3; repeated string oversize = 4; map renamed = 5; } message TrashMediaFilesIn { repeated string fnames = 1; }