| bitflags::bitflags! { |
| #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] |
| pub struct Capabilities: u32 { |
| const HOME = 1 << 0; |
| const CATEGORY = 1 << 1; |
| const SEARCH = 1 << 2; |
| const INFO = 1 << 3; |
| const SERVERS = 1 << 4; |
| const STREAM = 1 << 5; |
| const SUBTITLES = 1 << 6; |
| const ARTICLES = 1 << 7; |
| } |
| } |
|
|
| impl Capabilities { |
| pub fn for_method(name: &str) -> Self { |
| match name { |
| "get_home" => Self::HOME, |
| "get_category" => Self::CATEGORY, |
| "search" => Self::SEARCH, |
| "get_info" => Self::INFO, |
| "get_servers" => Self::SERVERS, |
| "resolve_stream" => Self::STREAM, |
| "search_subtitles" | "download_subtitle" => Self::SUBTITLES, |
| "get_articles" | "search_articles" => Self::ARTICLES, |
| _ => Self::empty(), |
| } |
| } |
|
|
| pub fn from_manifest(p: &crate::manifest::ProvidesSpec) -> Self { |
| let mut c = Self::empty(); |
| if p.home { c |= Self::HOME; } |
| if p.category { c |= Self::CATEGORY; } |
| if p.search { c |= Self::SEARCH; } |
| if p.info { c |= Self::INFO; } |
| if p.servers { c |= Self::SERVERS; } |
| if p.stream { c |= Self::STREAM; } |
| if p.subtitles { c |= Self::SUBTITLES; } |
| if p.articles { c |= Self::ARTICLES; } |
| c |
| } |
|
|
| pub fn has(self, cap: Self) -> bool { self.contains(cap) } |
| } |
|
|