2024-11-24 23:09:31 -06:00
//! Contains tons of structs used by the library
2024-11-27 21:49:15 -06:00
use rocket ::FromForm ;
2024-11-24 23:09:31 -06:00
pub ( crate ) type AuthFunc = fn ( String ) -> Result < bool , String > ;
// TODO: Figure out what the arguments should be for a search function and what it should return
2024-11-23 18:39:48 -06:00
pub ( crate ) type SearchFunc = fn ( String , Vec < String > ) -> Result < String , String > ;
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// Specify the ServerInfo to be listed in <server> for `/api?t=caps`
///
/// These fields are just those listed in the example on [torznab.github.io](https://torznab.github.io), there's no actual specification for thse fields.
/// TODO: Update this to have customizable fields instead
2024-11-21 13:19:57 -06:00
pub struct ServerInfo {
2024-11-26 23:36:06 -06:00
/// The title of the server
2024-11-21 13:19:57 -06:00
pub title : Option < String > ,
2024-11-26 23:36:06 -06:00
/// The email for the server info
2024-11-21 13:19:57 -06:00
pub email : Option < String > ,
2024-11-26 23:36:06 -06:00
/// The URL to the server's image (e.g. logo)
2024-11-21 13:19:57 -06:00
pub image : Option < String > ,
2024-11-26 23:36:06 -06:00
/// What version the server is - unrelated to torznab-toolkit's version, but may be used by the program
2024-11-21 13:19:57 -06:00
pub version : Option < String > ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// The maximum and defaults for the `limit` parameter in queries
/// `max` is the maximum number of results the program can return
/// `default` is the default number of results the program will return
2024-11-21 13:19:57 -06:00
pub struct Limits {
/*
2024-11-27 21:49:15 -06:00
I don ' t know why this would possibly need to be a u32 , I can ' t imagine you ' ll be returning 4 billion results or whatever
2024-11-21 13:19:57 -06:00
In fact , I * really * hope you aren ' t - if you are , you ' re doing something extremely wrong
But hey , it ' s an option
* /
2024-11-26 23:36:06 -06:00
/// The maximum number of entries that can be listed in a search query
2024-11-27 21:49:15 -06:00
pub max : u32 ,
2024-11-26 23:36:06 -06:00
/// The default number of entries to be listed in a search query
2024-11-27 21:49:15 -06:00
pub default : u32 ,
2024-11-21 13:19:57 -06:00
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// A struct holding the info for a type of search
2024-11-21 13:19:57 -06:00
pub struct SearchInfo {
2024-11-26 23:36:06 -06:00
/// What type of search this is - must be `search`, `tv-search`, `movie-search`, `audio-search`, or `book-search`
2024-11-21 13:19:57 -06:00
pub search_type : String ,
2024-11-26 23:36:06 -06:00
/// Whether this search type is available
2024-11-21 13:19:57 -06:00
pub available : bool ,
2024-11-26 23:36:06 -06:00
/// The supported parameters for this search type
2024-11-21 13:19:57 -06:00
pub supported_params : Vec < String > ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// Contains subcategories, for use in `Category`
2024-11-21 13:19:57 -06:00
pub struct Subcategory {
2024-11-26 23:36:06 -06:00
/// The numeric ID of a subcategory
///
/// The (de facto?) standard is `xxyy`, xx being the first two digits of the category, and the last two digits specifying the subcategory; see also: Category
2024-11-27 21:49:15 -06:00
pub id : u32 ,
2024-11-26 23:36:06 -06:00
/// The name of the subcategory, e.g. "Anime" under the "TV" cateogyr
2024-11-21 13:19:57 -06:00
pub name : String ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// Contains a category, for use in `Caps` and searches as a query parameter
2024-11-21 13:19:57 -06:00
pub struct Category {
2024-11-26 23:36:06 -06:00
/// The numeric ID of a category
///
/// The (de facto?) standard is `xxyy`, xx being the first two digits of the category, and the last two digits specifying the subcategory; see also: Subcategory
2024-11-27 21:49:15 -06:00
pub id : u32 ,
2024-11-26 23:36:06 -06:00
/// The name of the category, e.g. "Movies"
2024-11-21 13:19:57 -06:00
pub name : String ,
2024-11-26 23:36:06 -06:00
/// A vector of all the subcategory in this category
2024-11-21 13:19:57 -06:00
pub subcategories : Vec < Subcategory > ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// Contains a genre, for use in `Caps` and searches as a query parameter
2024-11-21 13:19:57 -06:00
pub struct Genre {
2024-11-26 23:36:06 -06:00
/// The numeric ID of a genre
///
2024-11-27 21:49:15 -06:00
/// I'm not aware of any standard for numbering this; the specification for Torznab shows an example with an ID of 1.
pub id : u32 ,
2024-11-26 23:36:06 -06:00
/// The numeric ID of the category this genre is for.
2024-11-27 21:49:15 -06:00
pub category_id : u32 ,
2024-11-26 23:36:06 -06:00
/// The name of the genre
2024-11-21 13:19:57 -06:00
pub name : String ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// Contains a tag, for use in `Caps` and searches as a query parameter
2024-11-21 13:19:57 -06:00
pub struct Tag {
2024-11-26 23:36:06 -06:00
/// The name of a tag for a torrent
2024-11-21 13:19:57 -06:00
pub name : String ,
2024-11-26 23:36:06 -06:00
/// The description of the tag
pub description : String ,
2024-11-21 13:19:57 -06:00
}
2024-11-23 18:39:48 -06:00
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
2024-11-27 21:49:15 -06:00
/// Holds the configuration for the capabilities of the Torznab server (used in `/api?t=caps`)
2024-11-24 23:09:31 -06:00
///
/// <div class="warning">Note that this library might not support all the capabilities listed in yet, so check the README before listing capabilities, or just accept that unsupported capabilities will return error 404.
///
2024-11-27 21:49:15 -06:00
/// It's recommended to add any capabilities you want, and set `available` to `false` in the [`Caps`] struct for any currently unsupported search types.</div>
2024-11-24 23:09:31 -06:00
///
/// TODO: Add a way to partially(?) generate automatically from the Config
2024-11-23 18:39:48 -06:00
pub struct Caps {
pub server_info : ServerInfo ,
pub limits : Limits ,
pub searching : Vec < SearchInfo > ,
pub categories : Vec < Category > ,
pub genres : Option < Vec < Genre > > ,
pub tags : Option < Vec < Tag > > ,
}
2024-11-24 23:09:31 -06:00
#[ derive(Debug, Clone, PartialEq, Eq) ]
/// A struct that holds configuration for torznab-toolkit
2024-11-27 21:49:15 -06:00
/// The search function (`/api?t=search`) and capabilities (`/api?t=caps` - struct [`Caps`]) are required
2024-11-24 23:09:31 -06:00
/// Everything else is optional
2024-11-23 18:39:48 -06:00
pub struct Config {
2024-11-26 23:36:06 -06:00
pub search : SearchFunc ,
2024-11-23 18:39:48 -06:00
pub auth : Option < AuthFunc > ,
pub caps : Caps ,
pub tvsearch : Option < SearchFunc > ,
pub movie : Option < SearchFunc > ,
pub music : Option < SearchFunc > ,
pub book : Option < SearchFunc > ,
}
2024-11-27 21:49:15 -06:00
#[ derive(Debug, Clone, PartialEq, Eq, FromForm) ]
/// A struct used by the API's search functions to hold its query parameters
/// Currently required (AFAIK) because of limitations with rocket
pub ( crate ) struct SearchForm {
/// The text query for the search
pub ( crate ) q : Option < String > ,
/// The apikey, for authentication
pub ( crate ) apikey : Option < String > ,
/// The list of numeric category IDs to be included in the search results
/// Returned by Rocket.rs as a string of comma-separated values, then split in the function to a `Vec<u32>`
pub ( crate ) cat : Option < String > ,
/// The list of extended attribute names to be included in the search results
/// Returned by Rocket.rs as a string of comma-separated values, then split in the function to a `Vec<String>`
pub ( crate ) attrs : Option < String > ,
/// Whether *all* extended attributes should be included in the search results; overrules `attrs`
/// Can be 0 or 1
pub ( crate ) extended : Option < u8 > ,
/// How many items to skip/offset by in the results.
pub ( crate ) offset : Option < u32 > ,
/// The maximum number of items to return - also limited to whatever `limits` is in [`Caps`]
pub ( crate ) limit : Option < u32 > ,
}