Fix response tests

This commit is contained in:
Joel Wachsler 2022-07-23 00:23:17 +00:00
parent ab816e14b1
commit dcacdcda9c
10 changed files with 1839 additions and 101 deletions

View File

@ -1002,17 +1002,17 @@ HTTP Status Code | Scenario
The response is a JSON object with the following possible fields The response is a JSON object with the following possible fields
Property | Type | Description Property | Type | Description
------------------------------|---------|------------ --------------------------------|-----------|------------
`rid` | integer | Response ID `rid` | integer | Response ID
`full_update` | bool | Whether the response contains all the data or partial data `full_update`_optional_ | bool | Whether the response contains all the data or partial data
`torrents` | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list) `torrents`_optional_ | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list), map from string to torrents object
`torrents_removed` | array | List of hashes of torrents removed since last request `torrents_removed`_optional_ | array | List of hashes of torrents removed since last request
`categories` | object | Info for categories added since last request `categories`_optional_ | object | Info for categories added since last request, map from string to categories object
`categories_removed` | array | List of categories removed since last request `categories_removed`_optional_ | array | List of categories removed since last request
`tags` | array | List of tags added since last request `tags`_optional_ | array | List of tags added since last request
`tags_removed` | array | List of tags removed since last request `tags_removed`_optional_ | array | List of tags removed since last request
`server_state` | object | Global transfer info `server_state`_optional_ | object | `server_state` object see table below
Example: Example:
@ -1029,6 +1029,74 @@ Example:
} }
``` ```
**ServerState object:**
Property | Type | Description
------------------------------|---------|------------
`average_time_queue` | integer | Average time queue
`dl_info_data` | number | Download info data
`dl_info_speed` | number | Download info speed
`queued_io_jobs` | integer | Queued io jobs
`total_buffers_size` | number | Total buffers size
`total_peer_connections` | integer | Total peer connections
**Categories object:**
Property | Type | Description
------------------------------|---------|------------
`name` | string | Category name
`savePath` | string | Save path
**Torrents object:**
Property | Type | Description
--------------------------------|-----------|------------
`added_on`_optional_ | integer | Time (Unix Epoch) when the torrent was added to the client
`amount_left`_optional_ | integer | Amount of data left to download (bytes)
`auto_tmm`_optional_ | bool | Whether this torrent is managed by Automatic Torrent Management
`availability`_optional_ | float | Percentage of file pieces currently available
`category`_optional_ | string | Category of the torrent
`completed`_optional_ | integer | Amount of transfer data completed (bytes)
`completion_on`_optional_ | integer | Time (Unix Epoch) when the torrent completed
`content_path`_optional_ | string | Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)
`dl_limit`_optional_ | integer | Torrent download speed limit (bytes/s). `-1` if ulimited.
`dlspeed`_optional_ | integer | Torrent download speed (bytes/s)
`downloaded`_optional_ | integer | Amount of data downloaded
`downloaded_session`_optional_ | integer | Amount of data downloaded this session
`eta`_optional_ | integer | Torrent ETA (seconds)
`f_l_piece_prio`_optional_ | bool | True if first last piece are prioritized
`force_start`_optional_ | bool | True if force start is enabled for this torrent
`hash`_optional_ | string | Torrent hash
`last_activity`_optional_ | integer | Last time (Unix Epoch) when a chunk was downloaded/uploaded
`magnet_uri`_optional_ | string | Magnet URI corresponding to this torrent
`max_ratio`_optional_ | float | Maximum share ratio until torrent is stopped from seeding/uploading
`max_seeding_time`_optional_ | integer | Maximum seeding time (seconds) until torrent is stopped from seeding
`name`_optional_ | string | Torrent name
`num_complete`_optional_ | integer | Number of seeds in the swarm
`num_incomplete`_optional_ | integer | Number of leechers in the swarm
`num_leechs`_optional_ | integer | Number of leechers connected to
`num_seeds`_optional_ | integer | Number of seeds connected to
`priority`_optional_ | integer | Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode
`progress`_optional_ | float | Torrent progress (percentage/100)
`ratio`_optional_ | float | Torrent share ratio. Max ratio value: 9999.
`ratio_limit`_optional_ | float | TODO (what is different from `max_ratio`?)
`save_path`_optional_ | string | Path where this torrent's data is stored
`seeding_time`_optional_ | integer | Torrent elapsed time while complete (seconds)
`seeding_time_limit`_optional_ | integer | TODO (what is different from `max_seeding_time`?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.
`seen_complete`_optional_ | integer | Time (Unix Epoch) when this torrent was last seen complete
`seq_dl`_optional_ | bool | True if sequential download is enabled
`size`_optional_ | integer | Total size (bytes) of files selected for download
`state`_optional_ | string | Torrent state. See table here below for the possible values
`super_seeding`_optional_ | bool | True if super seeding is enabled
`tags`_optional_ | string | Comma-concatenated tag list of the torrent
`time_active`_optional_ | integer | Total active time (seconds)
`total_size`_optional_ | integer | Total size (bytes) of all file in this torrent (including unselected ones)
`tracker`_optional_ | string | The first tracker with working status. Returns empty string if no tracker is working.
`up_limit`_optional_ | integer | Torrent upload speed limit (bytes/s). `-1` if ulimited.
`uploaded`_optional_ | integer | Amount of data uploaded
`uploaded_session`_optional_ | integer | Amount of data uploaded this session
`upspeed`_optional_ | integer | Torrent upload speed (bytes/s)
## Get torrent peers data ## ## Get torrent peers data ##
Name: `torrentPeers` Name: `torrentPeers`
@ -1756,7 +1824,7 @@ Name: `delete`
Parameter | Type | Description Parameter | Type | Description
------------|----------|------------ ------------|----------|------------
`hashes` | string | The hashes of the torrents you want to delete. `hashes` can contain multiple hashes separated by `\|`, to delete multiple torrents, or set to `all`, to delete all torrents. `hashes` | string | The hashes of the torrents you want to delete. `hashes` can contain multiple hashes separated by `\|`, to delete multiple torrents, or set to `all`, to delete all torrents.
`deleteFiles` | If set to `true`, the downloaded data will also be deleted, otherwise has no effect. `deleteFiles` | bool | If set to `true`, the downloaded data will also be deleted, otherwise has no effect.
Example: Example:
@ -3275,6 +3343,13 @@ Field | Type | Description
] ]
``` ```
**Category object:**
Field | Type | Description
---------------------------|---------|------------
`id` | string | Id
`name` | string | Name
## Install search plugin ## ## Install search plugin ##
Name: `installPlugin` Name: `installPlugin`

View File

@ -628,6 +628,33 @@
url: "maindata", url: "maindata",
types: CompositeTypes { types: CompositeTypes {
composite_types: [ composite_types: [
Object(
TypeWithName {
name: "Categories",
types: [
String(
TypeInfo {
name: "name",
description: Some(
"Category name",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "savePath",
description: Some(
"Save path",
),
is_optional: false,
is_list: false,
},
),
],
},
),
Parameters( Parameters(
TypeWithoutName { TypeWithoutName {
types: [ types: [
@ -645,6 +672,73 @@
is_list: false, is_list: false,
}, },
), ),
Object(
TypeWithName {
name: "ServerState",
types: [
Number(
TypeInfo {
name: "average_time_queue",
description: Some(
"Average time queue",
),
is_optional: false,
is_list: false,
},
),
Number(
TypeInfo {
name: "dl_info_data",
description: Some(
"Download info data",
),
is_optional: false,
is_list: false,
},
),
Number(
TypeInfo {
name: "dl_info_speed",
description: Some(
"Download info speed",
),
is_optional: false,
is_list: false,
},
),
Number(
TypeInfo {
name: "queued_io_jobs",
description: Some(
"Queued io jobs",
),
is_optional: false,
is_list: false,
},
),
Number(
TypeInfo {
name: "total_buffers_size",
description: Some(
"Total buffers size",
),
is_optional: false,
is_list: false,
},
),
Number(
TypeInfo {
name: "total_peer_connections",
description: Some(
"Total peer connections",
),
is_optional: false,
is_list: false,
},
),
],
},
),
Response( Response(
TypeWithoutName { TypeWithoutName {
types: [ types: [
@ -664,7 +758,7 @@
description: Some( description: Some(
"Whether the response contains all the data or partial data", "Whether the response contains all the data or partial data",
), ),
is_optional: false, is_optional: true,
is_list: false, is_list: false,
}, },
), ),
@ -673,12 +767,15 @@
type_info: TypeInfo { type_info: TypeInfo {
name: "torrents", name: "torrents",
description: Some( description: Some(
"Property: torrent hash, value: same as [torrent list](#get-torrent-list)", "Property: torrent hash, value: same as [torrent list](#get-torrent-list), map from string to torrents object",
), ),
is_optional: false, is_optional: true,
is_list: false, is_list: false,
}, },
ref_type: "Object", ref_type: Map(
"String",
"Torrents",
),
}, },
), ),
Object( Object(
@ -688,10 +785,12 @@
description: Some( description: Some(
"List of hashes of torrents removed since last request", "List of hashes of torrents removed since last request",
), ),
is_optional: false, is_optional: true,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"String",
),
}, },
), ),
Object( Object(
@ -699,12 +798,15 @@
type_info: TypeInfo { type_info: TypeInfo {
name: "categories", name: "categories",
description: Some( description: Some(
"Info for categories added since last request", "Info for categories added since last request, map from string to categories object",
), ),
is_optional: false, is_optional: true,
is_list: false, is_list: false,
}, },
ref_type: "Object", ref_type: Map(
"String",
"Categories",
),
}, },
), ),
Object( Object(
@ -714,10 +816,12 @@
description: Some( description: Some(
"List of categories removed since last request", "List of categories removed since last request",
), ),
is_optional: false, is_optional: true,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"String",
),
}, },
), ),
Object( Object(
@ -727,10 +831,12 @@
description: Some( description: Some(
"List of tags added since last request", "List of tags added since last request",
), ),
is_optional: false, is_optional: true,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"String",
),
}, },
), ),
Object( Object(
@ -740,10 +846,12 @@
description: Some( description: Some(
"List of tags removed since last request", "List of tags removed since last request",
), ),
is_optional: false, is_optional: true,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"String",
),
}, },
), ),
Object( Object(
@ -751,18 +859,477 @@
type_info: TypeInfo { type_info: TypeInfo {
name: "server_state", name: "server_state",
description: Some( description: Some(
"Global transfer info", "server_state object see table below",
), ),
is_optional: false, is_optional: true,
is_list: false, is_list: false,
}, },
ref_type: "Object", ref_type: String(
"ServerState",
),
}, },
), ),
], ],
is_list: false, is_list: false,
}, },
), ),
Object(
TypeWithName {
name: "Torrents",
types: [
Number(
TypeInfo {
name: "added_on",
description: Some(
"Time (Unix Epoch) when the torrent was added to the client",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "amount_left",
description: Some(
"Amount of data left to download (bytes)",
),
is_optional: true,
is_list: false,
},
),
Bool(
TypeInfo {
name: "auto_tmm",
description: Some(
"Whether this torrent is managed by Automatic Torrent Management",
),
is_optional: true,
is_list: false,
},
),
Float(
TypeInfo {
name: "availability",
description: Some(
"Percentage of file pieces currently available",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "category",
description: Some(
"Category of the torrent",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "completed",
description: Some(
"Amount of transfer data completed (bytes)",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "completion_on",
description: Some(
"Time (Unix Epoch) when the torrent completed",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "content_path",
description: Some(
"Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "dl_limit",
description: Some(
"Torrent download speed limit (bytes/s). -1 if ulimited.",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "dlspeed",
description: Some(
"Torrent download speed (bytes/s)",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "downloaded",
description: Some(
"Amount of data downloaded",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "downloaded_session",
description: Some(
"Amount of data downloaded this session",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "eta",
description: Some(
"Torrent ETA (seconds)",
),
is_optional: true,
is_list: false,
},
),
Bool(
TypeInfo {
name: "f_l_piece_prio",
description: Some(
"True if first last piece are prioritized",
),
is_optional: true,
is_list: false,
},
),
Bool(
TypeInfo {
name: "force_start",
description: Some(
"True if force start is enabled for this torrent",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "hash",
description: Some(
"Torrent hash",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "last_activity",
description: Some(
"Last time (Unix Epoch) when a chunk was downloaded/uploaded",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "magnet_uri",
description: Some(
"Magnet URI corresponding to this torrent",
),
is_optional: true,
is_list: false,
},
),
Float(
TypeInfo {
name: "max_ratio",
description: Some(
"Maximum share ratio until torrent is stopped from seeding/uploading",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "max_seeding_time",
description: Some(
"Maximum seeding time (seconds) until torrent is stopped from seeding",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "name",
description: Some(
"Torrent name",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "num_complete",
description: Some(
"Number of seeds in the swarm",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "num_incomplete",
description: Some(
"Number of leechers in the swarm",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "num_leechs",
description: Some(
"Number of leechers connected to",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "num_seeds",
description: Some(
"Number of seeds connected to",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "priority",
description: Some(
"Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode",
),
is_optional: true,
is_list: false,
},
),
Float(
TypeInfo {
name: "progress",
description: Some(
"Torrent progress (percentage/100)",
),
is_optional: true,
is_list: false,
},
),
Float(
TypeInfo {
name: "ratio",
description: Some(
"Torrent share ratio. Max ratio value: 9999.",
),
is_optional: true,
is_list: false,
},
),
Float(
TypeInfo {
name: "ratio_limit",
description: Some(
"TODO (what is different from max_ratio?)",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "save_path",
description: Some(
"Path where this torrent's data is stored",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "seeding_time",
description: Some(
"Torrent elapsed time while complete (seconds)",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "seeding_time_limit",
description: Some(
"TODO (what is different from max_seeding_time?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "seen_complete",
description: Some(
"Time (Unix Epoch) when this torrent was last seen complete",
),
is_optional: true,
is_list: false,
},
),
Bool(
TypeInfo {
name: "seq_dl",
description: Some(
"True if sequential download is enabled",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "size",
description: Some(
"Total size (bytes) of files selected for download",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "state",
description: Some(
"Torrent state. See table here below for the possible values",
),
is_optional: true,
is_list: false,
},
),
Bool(
TypeInfo {
name: "super_seeding",
description: Some(
"True if super seeding is enabled",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "tags",
description: Some(
"Comma-concatenated tag list of the torrent",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "time_active",
description: Some(
"Total active time (seconds)",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "total_size",
description: Some(
"Total size (bytes) of all file in this torrent (including unselected ones)",
),
is_optional: true,
is_list: false,
},
),
String(
TypeInfo {
name: "tracker",
description: Some(
"The first tracker with working status. Returns empty string if no tracker is working.",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "up_limit",
description: Some(
"Torrent upload speed limit (bytes/s). -1 if ulimited.",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "uploaded",
description: Some(
"Amount of data uploaded",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "uploaded_session",
description: Some(
"Amount of data uploaded this session",
),
is_optional: true,
is_list: false,
},
),
Number(
TypeInfo {
name: "upspeed",
description: Some(
"Torrent upload speed (bytes/s)",
),
is_optional: true,
is_list: false,
},
),
],
},
),
], ],
}, },
}, },
@ -2161,15 +2728,14 @@
is_list: false, is_list: false,
}, },
), ),
Object( Bool(
Object { TypeInfo {
type_info: TypeInfo { name: "deleteFiles",
name: "deleteFiles", description: Some(
description: None, "If set to true, the downloaded data will also be deleted, otherwise has no effect.",
is_optional: false, ),
is_list: false, is_optional: false,
}, is_list: false,
ref_type: "If set to true, the downloaded data will also be deleted, otherwise has no effect.",
}, },
), ),
], ],
@ -3614,7 +4180,9 @@
is_optional: false, is_optional: false,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"Result",
),
}, },
), ),
String( String(
@ -3678,6 +4246,33 @@
url: "plugins", url: "plugins",
types: CompositeTypes { types: CompositeTypes {
composite_types: [ composite_types: [
Object(
TypeWithName {
name: "Category",
types: [
String(
TypeInfo {
name: "id",
description: Some(
"Id",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "name",
description: Some(
"Name",
),
is_optional: false,
is_list: false,
},
),
],
},
),
Response( Response(
TypeWithoutName { TypeWithoutName {
types: [ types: [
@ -3721,7 +4316,9 @@
is_optional: false, is_optional: false,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"Category",
),
}, },
), ),
String( String(

View File

@ -147,14 +147,36 @@ impl parser::TypeWithName {
} }
impl types::Type { impl types::Type {
fn owned_type_ident(&self) -> TokenStream {
let owned_type = match self {
types::Type::Number(_) => quote! { i128 },
types::Type::Float(_) => quote! { f32 },
types::Type::Bool(_) => quote! { bool },
types::Type::String(_) => quote! { String },
types::Type::StringArray(_) => quote! { String },
types::Type::Object(obj) => match &obj.ref_type {
types::RefType::String(str) => {
let str_ident = &util::to_ident(str);
quote! { #str_ident }
}
types::RefType::Map(key, value) => {
let key_ident = util::to_ident(key);
let value_ident = util::to_ident(value);
quote! { std::collections::HashMap<#key_ident, #value_ident> }
}
},
};
if self.is_list() {
quote! { std::vec::Vec<#owned_type> }
} else {
owned_type
}
}
fn generate_struct_field(&self) -> TokenStream { fn generate_struct_field(&self) -> TokenStream {
let name_snake = self.name_snake(); let name_snake = self.name_snake();
let type_name = util::to_ident(&self.to_owned_type()); let type_ = self.owned_type_ident();
let type_ = if self.is_list() {
quote! { std::vec::Vec<#type_name> }
} else {
quote! { #type_name }
};
let orig_name = self.name(); let orig_name = self.name();
util::add_docs( util::add_docs(
@ -440,11 +462,10 @@ impl types::Type {
} }
fn borrowed_type(&self) -> TokenStream { fn borrowed_type(&self) -> TokenStream {
let type_ = self.borrowed_type_ident();
if self.should_borrow() { if self.should_borrow() {
let type_ = self.borrowed_type_ident();
quote! { &#type_ } quote! { &#type_ }
} else { } else {
let type_ = self.borrowed_type_ident();
quote! { #type_ } quote! { #type_ }
} }
} }

View File

@ -0,0 +1,110 @@
ApiMethod {
name: "plugins",
description: Some(
"The response is a JSON array of objects containing the following fields\n\n\n```JSON\n[\n {\n \"enabled\": true,\n \"fullName\": \"Legit Torrents\",\n \"name\": \"legittorrents\",\n \"supportedCategories\": [{\n \"id\": \"all\",\n \"name\": \"All categories\"\n }, {\n \"id\": \"anime\",\n \"name\": \"Anime\"\n }, {\n \"id\": \"books\",\n \"name\": \"Books\"\n }, {\n \"id\": \"games\",\n \"name\": \"Games\"\n }, {\n \"id\": \"movies\",\n \"name\": \"Movies\"\n }, {\n \"id\": \"music\",\n \"name\": \"Music\"\n }, {\n \"id\": \"tv\",\n \"name\": \"TV shows\"\n }],\n \"url\": \"http://www.legittorrents.info\",\n \"version\": \"2.3\"\n }\n]\n```",
),
url: "plugins",
types: CompositeTypes {
composite_types: [
Object(
TypeWithName {
name: "Category",
types: [
String(
TypeInfo {
name: "id",
description: Some(
"Id",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "name",
description: Some(
"Name",
),
is_optional: false,
is_list: false,
},
),
],
},
),
Response(
TypeWithoutName {
types: [
Bool(
TypeInfo {
name: "enabled",
description: Some(
"Whether the plugin is enabled",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "fullName",
description: Some(
"Full name of the plugin",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "name",
description: Some(
"Short name of the plugin",
),
is_optional: false,
is_list: false,
},
),
Object(
Object {
type_info: TypeInfo {
name: "supportedCategories",
description: Some(
"List of category objects",
),
is_optional: false,
is_list: true,
},
ref_type: String(
"Category",
),
},
),
String(
TypeInfo {
name: "url",
description: Some(
"URL of the torrent site",
),
is_optional: false,
is_list: false,
},
),
String(
TypeInfo {
name: "version",
description: Some(
"Installed version of the plugin",
),
is_optional: false,
is_list: false,
},
),
],
is_list: true,
},
),
],
},
}

View File

@ -0,0 +1,65 @@
## Get search plugins ##
Name: `plugins`
**Parameters:**
None
**Returns:**
HTTP Status Code | Scenario
----------------------------------|---------------------
200 | All scenarios- see JSON below
The response is a JSON array of objects containing the following fields
Field | Type | Description
----------------------------------|---------|------------
`enabled` | bool | Whether the plugin is enabled
`fullName` | string | Full name of the plugin
`name` | string | Short name of the plugin
`supportedCategories` | array | List of category objects
`url` | string | URL of the torrent site
`version` | string | Installed version of the plugin
```JSON
[
{
"enabled": true,
"fullName": "Legit Torrents",
"name": "legittorrents",
"supportedCategories": [{
"id": "all",
"name": "All categories"
}, {
"id": "anime",
"name": "Anime"
}, {
"id": "books",
"name": "Books"
}, {
"id": "games",
"name": "Games"
}, {
"id": "movies",
"name": "Movies"
}, {
"id": "music",
"name": "Music"
}, {
"id": "tv",
"name": "TV shows"
}],
"url": "http://www.legittorrents.info",
"version": "2.3"
}
]
```
**Category object:**
Field | Type | Description
---------------------------|---------|------------
`id` | string | Id
`name` | string | Name

View File

@ -0,0 +1,276 @@
TokenTree {
title: None,
content: [],
children: [
TokenTree {
title: Some(
"Get search plugins",
),
content: [
Text(
"",
),
Text(
"Name: `plugins`",
),
Text(
"",
),
Asterisk(
"Parameters:",
),
Text(
"",
),
Text(
"None",
),
Text(
"",
),
Asterisk(
"Returns:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "HTTP Status Code | Scenario",
columns: [
"HTTP Status Code",
"Scenario",
],
},
split: "----------------------------------|---------------------",
rows: [
TableRow {
raw: "200 | All scenarios- see JSON below",
columns: [
"200",
"All scenarios- see JSON below",
],
},
],
},
),
Text(
"",
),
Text(
"The response is a JSON array of objects containing the following fields",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Field | Type | Description",
columns: [
"Field",
"Type",
"Description",
],
},
split: "----------------------------------|---------|------------",
rows: [
TableRow {
raw: "`enabled` | bool | Whether the plugin is enabled",
columns: [
"enabled",
"bool",
"Whether the plugin is enabled",
],
},
TableRow {
raw: "`fullName` | string | Full name of the plugin",
columns: [
"fullName",
"string",
"Full name of the plugin",
],
},
TableRow {
raw: "`name` | string | Short name of the plugin",
columns: [
"name",
"string",
"Short name of the plugin",
],
},
TableRow {
raw: "`supportedCategories` | array | List of category objects",
columns: [
"supportedCategories",
"array",
"List of category objects",
],
},
TableRow {
raw: "`url` | string | URL of the torrent site",
columns: [
"url",
"string",
"URL of the torrent site",
],
},
TableRow {
raw: "`version` | string | Installed version of the plugin",
columns: [
"version",
"string",
"Installed version of the plugin",
],
},
],
},
),
Text(
"",
),
Text(
"```JSON",
),
Text(
"[",
),
Text(
" {",
),
Text(
" \"enabled\": true,",
),
Text(
" \"fullName\": \"Legit Torrents\",",
),
Text(
" \"name\": \"legittorrents\",",
),
Text(
" \"supportedCategories\": [{",
),
Text(
" \"id\": \"all\",",
),
Text(
" \"name\": \"All categories\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"anime\",",
),
Text(
" \"name\": \"Anime\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"books\",",
),
Text(
" \"name\": \"Books\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"games\",",
),
Text(
" \"name\": \"Games\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"movies\",",
),
Text(
" \"name\": \"Movies\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"music\",",
),
Text(
" \"name\": \"Music\"",
),
Text(
" }, {",
),
Text(
" \"id\": \"tv\",",
),
Text(
" \"name\": \"TV shows\"",
),
Text(
" }],",
),
Text(
" \"url\": \"http://www.legittorrents.info\",",
),
Text(
" \"version\": \"2.3\"",
),
Text(
" }",
),
Text(
"]",
),
Text(
"```",
),
Text(
"",
),
Asterisk(
"Category object:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Field | Type | Description",
columns: [
"Field",
"Type",
"Description",
],
},
split: "---------------------------|---------|------------",
rows: [
TableRow {
raw: "`id` | string | Id",
columns: [
"id",
"string",
"Id",
],
},
TableRow {
raw: "`name` | string | Name",
columns: [
"name",
"string",
"Name",
],
},
],
},
),
],
children: [],
},
],
}

View File

@ -133,7 +133,9 @@ ApiMethod {
is_optional: false, is_optional: false,
is_list: true, is_list: true,
}, },
ref_type: "", ref_type: String(
"Result",
),
}, },
), ),
String( String(

View File

@ -422,4 +422,9 @@ mod tests {
fn array_field() { fn array_field() {
run_test!("array_field"); run_test!("array_field");
} }
#[test]
fn ref_type() {
run_test!("ref_type");
}
} }

View File

@ -31,10 +31,16 @@ impl TypeInfo {
} }
} }
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RefType {
String(String),
Map(String, String),
}
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct Object { pub struct Object {
pub type_info: TypeInfo, pub type_info: TypeInfo,
pub ref_type: String, pub ref_type: RefType,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -63,17 +69,6 @@ pub enum Type {
} }
impl Type { impl Type {
pub fn to_owned_type(&self) -> String {
match self {
Type::Number(_) => "i128".into(),
Type::Float(_) => "f32".into(),
Type::Bool(_) => "bool".into(),
Type::String(_) => "String".into(),
Type::StringArray(_) => "String".into(),
Type::Object(_) => "String".into(),
}
}
pub fn to_borrowed_type(&self) -> String { pub fn to_borrowed_type(&self) -> String {
match self { match self {
Type::Number(_) => "i32".into(), Type::Number(_) => "i32".into(),
@ -81,7 +76,7 @@ impl Type {
Type::Bool(_) => "bool".into(), Type::Bool(_) => "bool".into(),
Type::String(_) => "str".into(), Type::String(_) => "str".into(),
Type::StringArray(_) => "&[str]".into(), Type::StringArray(_) => "&[str]".into(),
Type::Object(_) => "str".into(), Type::Object(_) => todo!(),
} }
} }
@ -136,10 +131,10 @@ impl Type {
) )
}; };
let create_object_type = |name: &str| { let create_object_type = |ref_type: RefType| {
Some(Type::Object(Object { Some(Type::Object(Object {
type_info: create_type_info(), type_info: create_type_info(),
ref_type: name.to_camel(), ref_type,
})) }))
}; };
@ -150,30 +145,85 @@ impl Type {
"string" => Some(Type::String(create_type_info())), "string" => Some(Type::String(create_type_info())),
"array" => description "array" => description
.extract_type() .extract_type()
.and_then(|t| create_object_type(&t)) .and_then(create_object_type)
.or_else(|| Some(Type::StringArray(create_type_info()))), .or_else(|| Some(Type::StringArray(create_type_info()))),
"float" => Some(Type::Float(create_type_info())), "float" => Some(Type::Float(create_type_info())),
name => create_object_type(name), name => description
.extract_type()
.and_then(create_object_type)
.or_else(|| {
let n = if name.is_empty() {
"String".into()
} else {
name.into()
};
create_object_type(RefType::String(n))
}),
} }
} }
} }
trait ExtractType { trait ExtractType {
fn extract_type(&self) -> Option<String>; fn extract_type(&self) -> Option<RefType>;
} }
impl ExtractType for Option<String> { impl ExtractType for Option<String> {
fn extract_type(&self) -> Option<String> { fn extract_type(&self) -> Option<RefType> {
self.as_ref().and_then(|t| { let list_type = || {
let re = RegexBuilder::new(r".*Array of (\w+) objects.*") self.as_ref().and_then(|t| {
.case_insensitive(true) let re = RegexBuilder::new(r"(?:Array|List) of (\w+) objects")
.build() .case_insensitive(true)
.unwrap(); .build()
.unwrap();
let cap = re.captures(t)?; let cap = re.captures(t)?;
cap.get(1).map(|m| m.as_str().to_camel()) cap.get(1)
}) .map(|m| m.as_str().to_camel())
.map(RefType::String)
})
};
let map_type = || {
self.as_ref().and_then(|t| {
let re = RegexBuilder::new(r"map from (\w+) to (\w+) object")
.case_insensitive(true)
.build()
.unwrap();
let cap = re.captures(t)?;
let key_type = match cap.get(1).map(|m| m.as_str().to_camel()) {
Some(k) => k,
None => return None,
};
let value_type = match cap.get(2).map(|m| m.as_str().to_camel()) {
Some(v) => v,
None => return None,
};
Some(RefType::Map(key_type, value_type))
})
};
let object_type = || {
self.as_ref().and_then(|t| {
let re = RegexBuilder::new(r"(\w+) object see table below")
.case_insensitive(true)
.build()
.unwrap();
let cap = re.captures(t)?;
let object_type = match cap.get(1).map(|m| m.as_str().to_camel()) {
Some(k) => k,
None => return None,
};
Some(RefType::String(object_type))
})
};
list_type().or_else(map_type).or_else(object_type)
} }
} }
@ -185,6 +235,6 @@ mod tests {
fn test_regex() { fn test_regex() {
let input = Some("Array of result objects- see table below".to_string()); let input = Some("Array of result objects- see table below".to_string());
let res = input.extract_type(); let res = input.extract_type();
assert_eq!(res.unwrap(), "Result"); assert_eq!(res.unwrap(), RefType::String("Result".into()));
} }
} }

View File

@ -4497,17 +4497,17 @@ TokenTree {
Table( Table(
Table { Table {
header: TableRow { header: TableRow {
raw: "Property | Type | Description", raw: "Property | Type | Description",
columns: [ columns: [
"Property", "Property",
"Type", "Type",
"Description", "Description",
], ],
}, },
split: "------------------------------|---------|------------", split: "--------------------------------|-----------|------------",
rows: [ rows: [
TableRow { TableRow {
raw: "`rid` | integer | Response ID", raw: "`rid` | integer | Response ID",
columns: [ columns: [
"rid", "rid",
"integer", "integer",
@ -4515,67 +4515,67 @@ TokenTree {
], ],
}, },
TableRow { TableRow {
raw: "`full_update` | bool | Whether the response contains all the data or partial data", raw: "`full_update`_optional_ | bool | Whether the response contains all the data or partial data",
columns: [ columns: [
"full_update", "full_update_optional_",
"bool", "bool",
"Whether the response contains all the data or partial data", "Whether the response contains all the data or partial data",
], ],
}, },
TableRow { TableRow {
raw: "`torrents` | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list)", raw: "`torrents`_optional_ | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list), map from string to torrents object",
columns: [ columns: [
"torrents", "torrents_optional_",
"object", "object",
"Property: torrent hash, value: same as [torrent list](#get-torrent-list)", "Property: torrent hash, value: same as [torrent list](#get-torrent-list), map from string to torrents object",
], ],
}, },
TableRow { TableRow {
raw: "`torrents_removed` | array | List of hashes of torrents removed since last request", raw: "`torrents_removed`_optional_ | array | List of hashes of torrents removed since last request",
columns: [ columns: [
"torrents_removed", "torrents_removed_optional_",
"array", "array",
"List of hashes of torrents removed since last request", "List of hashes of torrents removed since last request",
], ],
}, },
TableRow { TableRow {
raw: "`categories` | object | Info for categories added since last request", raw: "`categories`_optional_ | object | Info for categories added since last request, map from string to categories object",
columns: [ columns: [
"categories", "categories_optional_",
"object", "object",
"Info for categories added since last request", "Info for categories added since last request, map from string to categories object",
], ],
}, },
TableRow { TableRow {
raw: "`categories_removed` | array | List of categories removed since last request", raw: "`categories_removed`_optional_ | array | List of categories removed since last request",
columns: [ columns: [
"categories_removed", "categories_removed_optional_",
"array", "array",
"List of categories removed since last request", "List of categories removed since last request",
], ],
}, },
TableRow { TableRow {
raw: "`tags` | array | List of tags added since last request", raw: "`tags`_optional_ | array | List of tags added since last request",
columns: [ columns: [
"tags", "tags_optional_",
"array", "array",
"List of tags added since last request", "List of tags added since last request",
], ],
}, },
TableRow { TableRow {
raw: "`tags_removed` | array | List of tags removed since last request", raw: "`tags_removed`_optional_ | array | List of tags removed since last request",
columns: [ columns: [
"tags_removed", "tags_removed_optional_",
"array", "array",
"List of tags removed since last request", "List of tags removed since last request",
], ],
}, },
TableRow { TableRow {
raw: "`server_state` | object | Global transfer info", raw: "`server_state`_optional_ | object | `server_state` object see table below",
columns: [ columns: [
"server_state", "server_state_optional_",
"object", "object",
"Global transfer info", "server_state object see table below",
], ],
}, },
], ],
@ -4629,6 +4629,502 @@ TokenTree {
Text( Text(
"", "",
), ),
Asterisk(
"ServerState object:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Property | Type | Description",
columns: [
"Property",
"Type",
"Description",
],
},
split: "------------------------------|---------|------------",
rows: [
TableRow {
raw: "`average_time_queue` | integer | Average time queue",
columns: [
"average_time_queue",
"integer",
"Average time queue",
],
},
TableRow {
raw: "`dl_info_data` | number | Download info data",
columns: [
"dl_info_data",
"number",
"Download info data",
],
},
TableRow {
raw: "`dl_info_speed` | number | Download info speed",
columns: [
"dl_info_speed",
"number",
"Download info speed",
],
},
TableRow {
raw: "`queued_io_jobs` | integer | Queued io jobs",
columns: [
"queued_io_jobs",
"integer",
"Queued io jobs",
],
},
TableRow {
raw: "`total_buffers_size` | number | Total buffers size",
columns: [
"total_buffers_size",
"number",
"Total buffers size",
],
},
TableRow {
raw: "`total_peer_connections` | integer | Total peer connections",
columns: [
"total_peer_connections",
"integer",
"Total peer connections",
],
},
],
},
),
Text(
"",
),
Asterisk(
"Categories object:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Property | Type | Description",
columns: [
"Property",
"Type",
"Description",
],
},
split: "------------------------------|---------|------------",
rows: [
TableRow {
raw: "`name` | string | Category name",
columns: [
"name",
"string",
"Category name",
],
},
TableRow {
raw: "`savePath` | string | Save path",
columns: [
"savePath",
"string",
"Save path",
],
},
],
},
),
Text(
"",
),
Asterisk(
"Torrents object:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Property | Type | Description",
columns: [
"Property",
"Type",
"Description",
],
},
split: "--------------------------------|-----------|------------",
rows: [
TableRow {
raw: "`added_on`_optional_ | integer | Time (Unix Epoch) when the torrent was added to the client",
columns: [
"added_on_optional_",
"integer",
"Time (Unix Epoch) when the torrent was added to the client",
],
},
TableRow {
raw: "`amount_left`_optional_ | integer | Amount of data left to download (bytes)",
columns: [
"amount_left_optional_",
"integer",
"Amount of data left to download (bytes)",
],
},
TableRow {
raw: "`auto_tmm`_optional_ | bool | Whether this torrent is managed by Automatic Torrent Management",
columns: [
"auto_tmm_optional_",
"bool",
"Whether this torrent is managed by Automatic Torrent Management",
],
},
TableRow {
raw: "`availability`_optional_ | float | Percentage of file pieces currently available",
columns: [
"availability_optional_",
"float",
"Percentage of file pieces currently available",
],
},
TableRow {
raw: "`category`_optional_ | string | Category of the torrent",
columns: [
"category_optional_",
"string",
"Category of the torrent",
],
},
TableRow {
raw: "`completed`_optional_ | integer | Amount of transfer data completed (bytes)",
columns: [
"completed_optional_",
"integer",
"Amount of transfer data completed (bytes)",
],
},
TableRow {
raw: "`completion_on`_optional_ | integer | Time (Unix Epoch) when the torrent completed",
columns: [
"completion_on_optional_",
"integer",
"Time (Unix Epoch) when the torrent completed",
],
},
TableRow {
raw: "`content_path`_optional_ | string | Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)",
columns: [
"content_path_optional_",
"string",
"Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)",
],
},
TableRow {
raw: "`dl_limit`_optional_ | integer | Torrent download speed limit (bytes/s). `-1` if ulimited.",
columns: [
"dl_limit_optional_",
"integer",
"Torrent download speed limit (bytes/s). -1 if ulimited.",
],
},
TableRow {
raw: "`dlspeed`_optional_ | integer | Torrent download speed (bytes/s)",
columns: [
"dlspeed_optional_",
"integer",
"Torrent download speed (bytes/s)",
],
},
TableRow {
raw: "`downloaded`_optional_ | integer | Amount of data downloaded",
columns: [
"downloaded_optional_",
"integer",
"Amount of data downloaded",
],
},
TableRow {
raw: "`downloaded_session`_optional_ | integer | Amount of data downloaded this session",
columns: [
"downloaded_session_optional_",
"integer",
"Amount of data downloaded this session",
],
},
TableRow {
raw: "`eta`_optional_ | integer | Torrent ETA (seconds)",
columns: [
"eta_optional_",
"integer",
"Torrent ETA (seconds)",
],
},
TableRow {
raw: "`f_l_piece_prio`_optional_ | bool | True if first last piece are prioritized",
columns: [
"f_l_piece_prio_optional_",
"bool",
"True if first last piece are prioritized",
],
},
TableRow {
raw: "`force_start`_optional_ | bool | True if force start is enabled for this torrent",
columns: [
"force_start_optional_",
"bool",
"True if force start is enabled for this torrent",
],
},
TableRow {
raw: "`hash`_optional_ | string | Torrent hash",
columns: [
"hash_optional_",
"string",
"Torrent hash",
],
},
TableRow {
raw: "`last_activity`_optional_ | integer | Last time (Unix Epoch) when a chunk was downloaded/uploaded",
columns: [
"last_activity_optional_",
"integer",
"Last time (Unix Epoch) when a chunk was downloaded/uploaded",
],
},
TableRow {
raw: "`magnet_uri`_optional_ | string | Magnet URI corresponding to this torrent",
columns: [
"magnet_uri_optional_",
"string",
"Magnet URI corresponding to this torrent",
],
},
TableRow {
raw: "`max_ratio`_optional_ | float | Maximum share ratio until torrent is stopped from seeding/uploading",
columns: [
"max_ratio_optional_",
"float",
"Maximum share ratio until torrent is stopped from seeding/uploading",
],
},
TableRow {
raw: "`max_seeding_time`_optional_ | integer | Maximum seeding time (seconds) until torrent is stopped from seeding",
columns: [
"max_seeding_time_optional_",
"integer",
"Maximum seeding time (seconds) until torrent is stopped from seeding",
],
},
TableRow {
raw: "`name`_optional_ | string | Torrent name",
columns: [
"name_optional_",
"string",
"Torrent name",
],
},
TableRow {
raw: "`num_complete`_optional_ | integer | Number of seeds in the swarm",
columns: [
"num_complete_optional_",
"integer",
"Number of seeds in the swarm",
],
},
TableRow {
raw: "`num_incomplete`_optional_ | integer | Number of leechers in the swarm",
columns: [
"num_incomplete_optional_",
"integer",
"Number of leechers in the swarm",
],
},
TableRow {
raw: "`num_leechs`_optional_ | integer | Number of leechers connected to",
columns: [
"num_leechs_optional_",
"integer",
"Number of leechers connected to",
],
},
TableRow {
raw: "`num_seeds`_optional_ | integer | Number of seeds connected to",
columns: [
"num_seeds_optional_",
"integer",
"Number of seeds connected to",
],
},
TableRow {
raw: "`priority`_optional_ | integer | Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode",
columns: [
"priority_optional_",
"integer",
"Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode",
],
},
TableRow {
raw: "`progress`_optional_ | float | Torrent progress (percentage/100)",
columns: [
"progress_optional_",
"float",
"Torrent progress (percentage/100)",
],
},
TableRow {
raw: "`ratio`_optional_ | float | Torrent share ratio. Max ratio value: 9999.",
columns: [
"ratio_optional_",
"float",
"Torrent share ratio. Max ratio value: 9999.",
],
},
TableRow {
raw: "`ratio_limit`_optional_ | float | TODO (what is different from `max_ratio`?)",
columns: [
"ratio_limit_optional_",
"float",
"TODO (what is different from max_ratio?)",
],
},
TableRow {
raw: "`save_path`_optional_ | string | Path where this torrent's data is stored",
columns: [
"save_path_optional_",
"string",
"Path where this torrent's data is stored",
],
},
TableRow {
raw: "`seeding_time`_optional_ | integer | Torrent elapsed time while complete (seconds)",
columns: [
"seeding_time_optional_",
"integer",
"Torrent elapsed time while complete (seconds)",
],
},
TableRow {
raw: "`seeding_time_limit`_optional_ | integer | TODO (what is different from `max_seeding_time`?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.",
columns: [
"seeding_time_limit_optional_",
"integer",
"TODO (what is different from max_seeding_time?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.",
],
},
TableRow {
raw: "`seen_complete`_optional_ | integer | Time (Unix Epoch) when this torrent was last seen complete",
columns: [
"seen_complete_optional_",
"integer",
"Time (Unix Epoch) when this torrent was last seen complete",
],
},
TableRow {
raw: "`seq_dl`_optional_ | bool | True if sequential download is enabled",
columns: [
"seq_dl_optional_",
"bool",
"True if sequential download is enabled",
],
},
TableRow {
raw: "`size`_optional_ | integer | Total size (bytes) of files selected for download",
columns: [
"size_optional_",
"integer",
"Total size (bytes) of files selected for download",
],
},
TableRow {
raw: "`state`_optional_ | string | Torrent state. See table here below for the possible values",
columns: [
"state_optional_",
"string",
"Torrent state. See table here below for the possible values",
],
},
TableRow {
raw: "`super_seeding`_optional_ | bool | True if super seeding is enabled",
columns: [
"super_seeding_optional_",
"bool",
"True if super seeding is enabled",
],
},
TableRow {
raw: "`tags`_optional_ | string | Comma-concatenated tag list of the torrent",
columns: [
"tags_optional_",
"string",
"Comma-concatenated tag list of the torrent",
],
},
TableRow {
raw: "`time_active`_optional_ | integer | Total active time (seconds)",
columns: [
"time_active_optional_",
"integer",
"Total active time (seconds)",
],
},
TableRow {
raw: "`total_size`_optional_ | integer | Total size (bytes) of all file in this torrent (including unselected ones)",
columns: [
"total_size_optional_",
"integer",
"Total size (bytes) of all file in this torrent (including unselected ones)",
],
},
TableRow {
raw: "`tracker`_optional_ | string | The first tracker with working status. Returns empty string if no tracker is working.",
columns: [
"tracker_optional_",
"string",
"The first tracker with working status. Returns empty string if no tracker is working.",
],
},
TableRow {
raw: "`up_limit`_optional_ | integer | Torrent upload speed limit (bytes/s). `-1` if ulimited.",
columns: [
"up_limit_optional_",
"integer",
"Torrent upload speed limit (bytes/s). -1 if ulimited.",
],
},
TableRow {
raw: "`uploaded`_optional_ | integer | Amount of data uploaded",
columns: [
"uploaded_optional_",
"integer",
"Amount of data uploaded",
],
},
TableRow {
raw: "`uploaded_session`_optional_ | integer | Amount of data uploaded this session",
columns: [
"uploaded_session_optional_",
"integer",
"Amount of data uploaded this session",
],
},
TableRow {
raw: "`upspeed`_optional_ | integer | Torrent upload speed (bytes/s)",
columns: [
"upspeed_optional_",
"integer",
"Torrent upload speed (bytes/s)",
],
},
],
},
),
Text(
"",
),
], ],
children: [], children: [],
}, },
@ -8171,9 +8667,10 @@ TokenTree {
], ],
}, },
TableRow { TableRow {
raw: "`deleteFiles` | If set to `true`, the downloaded data will also be deleted, otherwise has no effect.", raw: "`deleteFiles` | bool | If set to `true`, the downloaded data will also be deleted, otherwise has no effect.",
columns: [ columns: [
"deleteFiles", "deleteFiles",
"bool",
"If set to true, the downloaded data will also be deleted, otherwise has no effect.", "If set to true, the downloaded data will also be deleted, otherwise has no effect.",
], ],
}, },
@ -14637,6 +15134,46 @@ TokenTree {
Text( Text(
"", "",
), ),
Asterisk(
"Category object:",
),
Text(
"",
),
Table(
Table {
header: TableRow {
raw: "Field | Type | Description",
columns: [
"Field",
"Type",
"Description",
],
},
split: "---------------------------|---------|------------",
rows: [
TableRow {
raw: "`id` | string | Id",
columns: [
"id",
"string",
"Id",
],
},
TableRow {
raw: "`name` | string | Name",
columns: [
"name",
"string",
"Name",
],
},
],
},
),
Text(
"",
),
], ],
children: [], children: [],
}, },