use super::http::{PreStep, Request};
use super::rule::Rule;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BookRules {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub book_url: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub author: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cover: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub intro: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_chapter: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub toc_url: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub word_count: Option<Rule>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct BookInfoOp {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub book_url: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub author: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cover: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub intro: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_chapter: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub toc_url: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub word_count: Option<Rule>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub prelude: Vec<PreStep>,
}
impl BookInfoOp {
pub fn as_book_rules(&self) -> BookRules {
BookRules {
book_url: self.book_url.clone(),
name: self.name.clone(),
author: self.author.clone(),
cover: self.cover.clone(),
intro: self.intro.clone(),
kind: self.kind.clone(),
last_chapter: self.last_chapter.clone(),
toc_url: self.toc_url.clone(),
word_count: self.word_count.clone(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ListPageSpec {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub prelude: Vec<PreStep>,
pub request: Request,
pub list: Rule,
pub item: BookRules,
}
pub type SearchOp = ListPageSpec;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct StaticEntry {
pub title: String,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub vars: BTreeMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct FetchEntryItem {
pub title: Rule,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub vars: BTreeMap<String, Rule>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct FetchEntrySource {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub for_each: Vec<BTreeMap<String, String>>,
pub request: Request,
pub list: Rule,
pub item: FetchEntryItem,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum EntrySource {
Static {
#[serde(rename = "static")]
static_entries: Vec<StaticEntry>,
},
Fetch { fetch: Box<FetchEntrySource> },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ExploreOp {
pub entries: Vec<EntrySource>,
pub page: ListPageSpec,
}
fn default_max_pages() -> u32 {
100
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct TocRules {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub prelude: Vec<PreStep>,
pub list: Rule,
pub name: Rule,
pub url: Rule,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_volume: Option<Rule>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_page: Option<Rule>,
#[serde(default = "default_max_pages")]
pub max_pages: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ContentRules {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub prelude: Vec<PreStep>,
pub value: Rule,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_page: Option<Rule>,
#[serde(default = "default_max_pages")]
pub max_pages: u32,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Expect {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_chapters: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub volumes: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_content_chars: Option<usize>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Sample {
pub book_url: String,
#[serde(default)]
pub expect: Expect,
}