tanoshi_lib/
extensions.rs

1use 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
43/// A type represents an extension
44pub struct PluginDeclaration {
45    pub rustc_version: &'static str,
46    pub core_version: &'static str,
47    pub register: unsafe fn(&mut dyn PluginRegistrar),
48}
49
50/// A trait for register an extension
51pub trait PluginRegistrar {
52    fn register_function(&mut self, extension: Box<dyn Extension>);
53}
54
55/// macro for export an extension
56#[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}