use std::time::Duration;
use crate::error::{Error, Result};
use crate::model::{
CanonicalMedia, MediaKind, SearchOptions, SourceName, SyncCursor, SyncRequest,
};
#[derive(Debug, Clone)]
pub struct FetchPage {
pub items: Vec<CanonicalMedia>,
pub next_cursor: Option<SyncCursor>,
}
pub trait Provider: Send + Sync {
fn source(&self) -> SourceName;
fn min_interval(&self) -> Duration {
Duration::ZERO
}
fn fetch_page(&self, request: &SyncRequest, cursor: SyncCursor) -> Result<FetchPage>;
fn search(&self, query: &str, options: SearchOptions) -> Result<Vec<CanonicalMedia>>;
fn get_by_id(&self, media_kind: MediaKind, source_id: &str) -> Result<Option<CanonicalMedia>>;
fn fetch_trending(&self, _media_kind: MediaKind) -> Result<Vec<CanonicalMedia>> {
Err(Error::Validation(format!(
"{} does not support trending",
self.source()
)))
}
fn fetch_recommendations(
&self,
_media_kind: MediaKind,
_source_id: &str,
) -> Result<Vec<CanonicalMedia>> {
Err(Error::Validation(format!(
"{} does not support recommendations",
self.source()
)))
}
fn fetch_related(
&self,
_media_kind: MediaKind,
_source_id: &str,
) -> Result<Vec<CanonicalMedia>> {
Err(Error::Validation(format!(
"{} does not support relations",
self.source()
)))
}
}
pub mod anilist;
pub mod http;
pub mod imdb;
pub mod jikan;
pub mod kitsu;
pub mod tvmaze;
pub use anilist::AniListProvider;
pub use imdb::ImdbProvider;
pub use jikan::JikanProvider;
pub use kitsu::KitsuProvider;
pub use tvmaze::TvmazeProvider;
#[deprecated(since = "0.3.0", note = "use `Provider` instead")]
pub type RemoteProvider = dyn Provider;
#[deprecated(since = "0.3.0", note = "use `FetchPage` instead")]
pub type RemotePage = FetchPage;