tanoshi_lib/
extensions.rs1use std::collections::HashMap;
2
3use crate::models::{ChapterInfo, Input, MangaInfo, SourceInfo};
4use anyhow::Result;
5
6pub trait Extension: Send + Sync {
7 fn get_source_info(&self) -> SourceInfo;
8
9 fn headers(&self) -> HashMap<String, String> {
10 HashMap::new()
11 }
12
13 fn filter_list(&self) -> Vec<Input> {
14 vec![]
15 }
16
17 fn get_preferences(&self) -> Result<Vec<Input>> {
18 Ok(vec![])
19 }
20
21 fn set_preferences(&mut self, _preferences: Vec<Input>) -> Result<()> {
22 Ok(())
23 }
24
25 fn get_popular_manga(&self, page: i64) -> Result<Vec<MangaInfo>>;
26
27 fn get_latest_manga(&self, page: i64) -> Result<Vec<MangaInfo>>;
28
29 fn search_manga(
30 &self,
31 page: i64,
32 query: Option<String>,
33 filters: Option<Vec<Input>>,
34 ) -> Result<Vec<MangaInfo>>;
35
36 fn get_manga_detail(&self, path: String) -> Result<MangaInfo>;
37
38 fn get_chapters(&self, path: String) -> Result<Vec<ChapterInfo>>;
39
40 fn get_pages(&self, path: String) -> Result<Vec<String>>;
41}
42
43pub struct PluginDeclaration {
45 pub rustc_version: &'static str,
46 pub core_version: &'static str,
47 pub register: unsafe fn(&mut dyn PluginRegistrar),
48}
49
50pub trait PluginRegistrar {
52 fn register_function(&mut self, extension: Box<dyn Extension>);
53}
54
55#[macro_export]
57macro_rules! export_plugin {
58 ($register:expr) => {
59 #[doc(hidden)]
60 #[no_mangle]
61 pub static plugin_declaration: $crate::extensions::PluginDeclaration =
62 $crate::extensions::PluginDeclaration {
63 rustc_version: $crate::RUSTC_VERSION,
64 core_version: $crate::LIB_VERSION,
65 register: $register,
66 };
67 };
68}